Received: by 2002:a05:7412:cfc7:b0:fc:a2b0:25d7 with SMTP id by7csp1010072rdb; Mon, 19 Feb 2024 00:49:53 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCVQpBw27hDp9cEmw6/eyczMo9eGMFFQTXL5c7NUzv4kTou7zmBckJfU/ZDLIBmwt3sM0DU0ptbPbWJPCgoi0BSV0+/89TZX3B1fh5+e5Q== X-Google-Smtp-Source: AGHT+IEvwmgv7gbaApidkQpKCzOskdVug0ku+G4efF20fAxadyzBbZ9t6ywZdwmIG0sKUi5GepJu X-Received: by 2002:ac8:5f0c:0:b0:42d:fe59:186a with SMTP id x12-20020ac85f0c000000b0042dfe59186amr6651489qta.42.1708332593591; Mon, 19 Feb 2024 00:49:53 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708332593; cv=pass; d=google.com; s=arc-20160816; b=P/Z58oBKQUerg8K+Fc+OCj0EUEKY3eJqG4XGiLmVij6mQZl82+rllnCUj/Oc5vKWRT YVxM9EbD9YDFEtQy0E+ZqHkmoePj0ofSGuHJs+kOyerLM5UFvSMz4LARP4BB/3/Kr1AB BNClGYIndn1KKNsNnsSuCWS5OOui24a1M6Wt/fBiTJ4C/d/PeWK+QHIyhufqZtw41iSK tWFXhVNdtpgjov50pj43y69dNPh6szrVziOVxtbu98nWh+H3bm4mLRhU0OOqkkf+hKdm C5Lnerrw+rgX69lGvadrrr7aYWwtPP2BHOyScB2L3ujgrO5uR27ZOCQ7dSYlzUZnsDkN qdFQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:dkim-signature; bh=Q6J6s2f11BjcjUQHb6Q4aYLxjsrF/R1Qf4osrZUFM1M=; fh=46WCpNCvn8AlwrsFlRsk/dN3zwnI5R0AAqMYSgLa1kQ=; b=fdslU6OBI4enVKakCzHZ/gvXCZePPMddQaDWC0vHEnG10v/OMKOgL/UIkEQqFpfv7Z 1d8msy0lKwaj/5NOfJENNC5VwQRThXXV/vhQyCfI4kB42SNXsxDEq3H9LHVUYl0eac4Y FBlJQ8y5kHPfBhLjpPN+q++v5pj/jclFcybGKk1zRppNakRF9Zzh8sRw+IHZT1S5QZ3V ZkJoM1zNr/wSN7vgvzz9E0D5yoF7TZylvmDNf/qVZYQu2oyK3fcepHkJA6xyBvVwmReK BPqg8ThvXTDCSWwV6ah71OnIaT0LQpbzdzrugM0+ml5C17GGS0lGnTSsKiESjSR/RXwj U6pw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FNQ1uvTY; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-70964-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-70964-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id a18-20020ac85b92000000b0042c75a66b95si5922189qta.799.2024.02.19.00.49.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Feb 2024 00:49:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-70964-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FNQ1uvTY; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-70964-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-70964-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 4DC351C22199 for ; Mon, 19 Feb 2024 08:49:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0C22023746; Mon, 19 Feb 2024 08:48:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FNQ1uvTY" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D818C22F00; Mon, 19 Feb 2024 08:48:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708332523; cv=none; b=uG+aeCF0pvF6cm+gMxQnFJwDJmqC2lfNwPiTmTpOZX6Kyd6S+V1iSpJLITi83j2csTny5gvzs0udk7npE7aXz1LpEk3pytReK/qTKxt5uulRd19WABwCqUTIxAy+ojXyer+yTRlrdNhNVUqtDDpYrNX6yA+WrV4AMWDeD+qs3Zs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708332523; c=relaxed/simple; bh=X9ivBbwhPXhNqP0tl5c+NVqkQbaCjwHFU7JRz89ruac=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=XqNdkkB7Ji2ptuh8QpvNEbFPhsU/ZyW3LZfEF7+DIOT07vTvkvBXHKBQfW1F/ZvWseSgwr8la4h1oUWxyM6XlqbdruajqdPIQ8QbIgzejCZ5NptLesN7IK3za83W1wdjO79s1DIJiMD2XnkGAcn08SFwYbQZiL2JvNfVSuqCMEQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FNQ1uvTY; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8082EC43394; Mon, 19 Feb 2024 08:48:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1708332523; bh=X9ivBbwhPXhNqP0tl5c+NVqkQbaCjwHFU7JRz89ruac=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=FNQ1uvTYJPHQ2f18yTSHtKISEGIBOR9Uyrz7eOZqjMIHvYH4tr7OSo//PFNOAscSx NgUmYYquR9PxMUVMNxfDQ+vbNjejbMcRVrZcFY3V7MWiFzu1CzdIPiLhcpOvIfvnfu 0fpZ5R7/3ngnK7ZzyZFjys+KNGA64jNwc7bqz6zY12g9w7hO90pWCQMuxYGfjipJ0N /SCJ/xkRzssnzZ+5LYFuo3vpjBnvfMEoEaTJG3v4ctlgQuc/g5P0WNtmplgjkJjO1B e6uVlnMUk7BFe91EK7g5CYUmAX3fUfJHAKDmH2JCMn1pc1lXIYhhEbaibpFSYSPh5J hqBWtRxWXEKjg== Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5648d92919dso461633a12.1; Mon, 19 Feb 2024 00:48:43 -0800 (PST) X-Forwarded-Encrypted: i=1; AJvYcCUOvl6UcnEX7j8dwg2QhxtoYTE1la5lmk73yXI3j4HqHJjnMmy3PWgTDxVKyilzAIKtmVnr3wu5hWMKLRpn5adBoFdiXRdxaa9+eGFr1cbSHoSicydxI8Pz6tYStbl/G1rh X-Gm-Message-State: AOJu0YziqDv8wlDszE6o8lkpv2RZR5Rd8Vrb5bxhUgvhtNRm4VSBQvep Mai7xSxcKZ05JgdzK2Gh4L6yiC+yq0XgiG3mJNjJPEFWIEv5vubW++c8Qp3h45YMAoo2u/zyKW2 CfZ5PU4rvQT5ZsfZYn2YbfDQMf9Y= X-Received: by 2002:a05:6402:5178:b0:564:882d:808e with SMTP id d24-20020a056402517800b00564882d808emr613009ede.37.1708332521876; Mon, 19 Feb 2024 00:48:41 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240201031950.3225626-1-maobibo@loongson.cn> <20240201031950.3225626-5-maobibo@loongson.cn> <63f8bd29-c0da-167b-187d-61c56eb081a6@loongson.cn> In-Reply-To: <63f8bd29-c0da-167b-187d-61c56eb081a6@loongson.cn> From: Huacai Chen Date: Mon, 19 Feb 2024 16:48:38 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v4 4/6] LoongArch: Add paravirt interface for guest kernel To: maobibo Cc: Tianrui Zhao , Juergen Gross , Paolo Bonzini , loongarch@lists.linux.dev, linux-kernel@vger.kernel.org, virtualization@lists.linux.dev, kvm@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Feb 19, 2024 at 12:11=E2=80=AFPM maobibo wrot= e: > > > > On 2024/2/19 =E4=B8=8A=E5=8D=8810:42, Huacai Chen wrote: > > Hi, Bibo, > > > > On Thu, Feb 1, 2024 at 11:19=E2=80=AFAM Bibo Mao = wrote: > >> > >> The patch adds paravirt interface for guest kernel, function > >> pv_guest_initi() firstly checks whether system runs on VM mode. If ker= nel > >> runs on VM mode, it will call function kvm_para_available() to detect > >> whether current VMM is KVM hypervisor. And the paravirt function can w= ork > >> only if current VMM is KVM hypervisor, since there is only KVM hypervi= sor > >> supported on LoongArch now. > >> > >> This patch only adds paravirt interface for guest kernel, however ther= e > >> is not effective pv functions added here. > >> > >> Signed-off-by: Bibo Mao > >> --- > >> arch/loongarch/Kconfig | 9 ++++ > >> arch/loongarch/include/asm/kvm_para.h | 7 ++++ > >> arch/loongarch/include/asm/paravirt.h | 27 ++++++++++++ > >> .../include/asm/paravirt_api_clock.h | 1 + > >> arch/loongarch/kernel/Makefile | 1 + > >> arch/loongarch/kernel/paravirt.c | 41 +++++++++++++++++= ++ > >> arch/loongarch/kernel/setup.c | 2 + > >> 7 files changed, 88 insertions(+) > >> create mode 100644 arch/loongarch/include/asm/paravirt.h > >> create mode 100644 arch/loongarch/include/asm/paravirt_api_clock.h > >> create mode 100644 arch/loongarch/kernel/paravirt.c > >> > >> diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig > >> index 10959e6c3583..817a56dff80f 100644 > >> --- a/arch/loongarch/Kconfig > >> +++ b/arch/loongarch/Kconfig > >> @@ -585,6 +585,15 @@ config CPU_HAS_PREFETCH > >> bool > >> default y > >> > >> +config PARAVIRT > >> + bool "Enable paravirtualization code" > >> + depends on AS_HAS_LVZ_EXTENSION > >> + help > >> + This changes the kernel so it can modify itself when it is = run > >> + under a hypervisor, potentially improving performance signif= icantly > >> + over full virtualization. However, when run without a hyper= visor > >> + the kernel is theoretically slower and slightly larger. > >> + > >> config ARCH_SUPPORTS_KEXEC > >> def_bool y > >> > >> diff --git a/arch/loongarch/include/asm/kvm_para.h b/arch/loongarch/in= clude/asm/kvm_para.h > >> index 9425d3b7e486..41200e922a82 100644 > >> --- a/arch/loongarch/include/asm/kvm_para.h > >> +++ b/arch/loongarch/include/asm/kvm_para.h > >> @@ -2,6 +2,13 @@ > >> #ifndef _ASM_LOONGARCH_KVM_PARA_H > >> #define _ASM_LOONGARCH_KVM_PARA_H > >> > >> +/* > >> + * Hypcall code field > >> + */ > >> +#define HYPERVISOR_KVM 1 > >> +#define HYPERVISOR_VENDOR_SHIFT 8 > >> +#define HYPERCALL_CODE(vendor, code) ((vendor << HYPERVISOR_VENDOR_= SHIFT) + code) > >> + > >> /* > >> * LoongArch hypcall return code > >> */ > >> diff --git a/arch/loongarch/include/asm/paravirt.h b/arch/loongarch/in= clude/asm/paravirt.h > >> new file mode 100644 > >> index 000000000000..b64813592ba0 > >> --- /dev/null > >> +++ b/arch/loongarch/include/asm/paravirt.h > >> @@ -0,0 +1,27 @@ > >> +/* SPDX-License-Identifier: GPL-2.0 */ > >> +#ifndef _ASM_LOONGARCH_PARAVIRT_H > >> +#define _ASM_LOONGARCH_PARAVIRT_H > >> + > >> +#ifdef CONFIG_PARAVIRT > >> +#include > >> +struct static_key; > >> +extern struct static_key paravirt_steal_enabled; > >> +extern struct static_key paravirt_steal_rq_enabled; > >> + > >> +u64 dummy_steal_clock(int cpu); > >> +DECLARE_STATIC_CALL(pv_steal_clock, dummy_steal_clock); > >> + > >> +static inline u64 paravirt_steal_clock(int cpu) > >> +{ > >> + return static_call(pv_steal_clock)(cpu); > >> +} > > The steal time code can be removed in this patch, I think. > > > Originally I want to remove this piece of code, but it fails to compile > if CONFIG_PARAVIRT is selected. Here is reference code, function > paravirt_steal_clock() must be defined if CONFIG_PARAVIRT is selected. > > static __always_inline u64 steal_account_process_time(u64 maxtime) > { > #ifdef CONFIG_PARAVIRT > if (static_key_false(¶virt_steal_enabled)) { > u64 steal; > > steal =3D paravirt_steal_clock(smp_processor_id()); > steal -=3D this_rq()->prev_steal_time; > steal =3D min(steal, maxtime); > account_steal_time(steal); > this_rq()->prev_steal_time +=3D steal; > > return steal; > } > #endif > return 0; > } OK, then keep it. > > >> + > >> +int pv_guest_init(void); > >> +#else > >> +static inline int pv_guest_init(void) > >> +{ > >> + return 0; > >> +} > >> + > >> +#endif // CONFIG_PARAVIRT > >> +#endif > >> diff --git a/arch/loongarch/include/asm/paravirt_api_clock.h b/arch/lo= ongarch/include/asm/paravirt_api_clock.h > >> new file mode 100644 > >> index 000000000000..65ac7cee0dad > >> --- /dev/null > >> +++ b/arch/loongarch/include/asm/paravirt_api_clock.h > >> @@ -0,0 +1 @@ > >> +#include > >> diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Ma= kefile > >> index 3c808c680370..662e6e9de12d 100644 > >> --- a/arch/loongarch/kernel/Makefile > >> +++ b/arch/loongarch/kernel/Makefile > >> @@ -48,6 +48,7 @@ obj-$(CONFIG_MODULES) +=3D module.o module-s= ections.o > >> obj-$(CONFIG_STACKTRACE) +=3D stacktrace.o > >> > >> obj-$(CONFIG_PROC_FS) +=3D proc.o > >> +obj-$(CONFIG_PARAVIRT) +=3D paravirt.o > >> > >> obj-$(CONFIG_SMP) +=3D smp.o > >> > >> diff --git a/arch/loongarch/kernel/paravirt.c b/arch/loongarch/kernel/= paravirt.c > >> new file mode 100644 > >> index 000000000000..21d01d05791a > >> --- /dev/null > >> +++ b/arch/loongarch/kernel/paravirt.c > >> @@ -0,0 +1,41 @@ > >> +// SPDX-License-Identifier: GPL-2.0 > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> + > >> +struct static_key paravirt_steal_enabled; > >> +struct static_key paravirt_steal_rq_enabled; > >> + > >> +static u64 native_steal_clock(int cpu) > >> +{ > >> + return 0; > >> +} > >> + > >> +DEFINE_STATIC_CALL(pv_steal_clock, native_steal_clock); > > The steal time code can be removed in this patch, I think. > Ditto, the same reason with above. > > > >> + > >> +static bool kvm_para_available(void) > >> +{ > >> + static int hypervisor_type; > >> + int config; > >> + > >> + if (!hypervisor_type) { > >> + config =3D read_cpucfg(CPUCFG_KVM_SIG); > >> + if (!memcmp(&config, KVM_SIGNATURE, 4)) > >> + hypervisor_type =3D HYPERVISOR_KVM; > >> + } > >> + > >> + return hypervisor_type =3D=3D HYPERVISOR_KVM; > >> +} > >> + > >> +int __init pv_guest_init(void) > >> +{ > >> + if (!cpu_has_hypervisor) > >> + return 0; > >> + if (!kvm_para_available()) > >> + return 0; > >> + > >> + return 1; > >> +} > >> diff --git a/arch/loongarch/kernel/setup.c b/arch/loongarch/kernel/set= up.c > >> index edf2bba80130..de5c36dccc49 100644 > >> --- a/arch/loongarch/kernel/setup.c > >> +++ b/arch/loongarch/kernel/setup.c > >> @@ -43,6 +43,7 @@ > >> #include > >> #include > >> #include > >> +#include > >> #include > >> #include > >> #include > >> @@ -367,6 +368,7 @@ void __init platform_init(void) > >> pr_info("The BIOS Version: %s\n", b_info.bios_version); > >> > >> efi_runtime_init(); > >> + pv_guest_init(); > > I prefer use CONFIG_PARAVIRT here, though you have a dummy version for > > !CONFIG_PARAVIRT, I think it is better to let others clearly know that > > PARAVIRT is an optional feature. > I remember that there is rule that CONFIG_xxx had better be used in > header files rather than c code, so that the code looks neat. Am I wrong? That depends on what we want, sometimes we want to hide the details, but sometimes we want to give others a notice. And there is another problem: if you want to centralize all pv init functions, it is better to use pv_features_init() rather than pv_guest_init(); if you want to give each feature an init function, then we don't need pv_guest_init here, and we can then add a pv_ipi_init() in the last patch. Huacai > > Regards > Bibo Mao > > > > Huacai > > > > > > Huacai > >> } > >> > >> static void __init check_kernel_sections_mem(void) > >> -- > >> 2.39.3 > >> > >> >