Received: by 2002:ab2:710b:0:b0:1ef:a325:1205 with SMTP id z11csp794741lql; Mon, 11 Mar 2024 19:15:40 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCULGYpKRxHw4r6XtVUubMKL56QIC3a6RrCvpr36Hyj6bIlll4C3+hx6XfkvN3VoqrVbB7TD4pQucO98AAMawIvhOzK1RKVvS5dRIGzouA== X-Google-Smtp-Source: AGHT+IFa0Aen7DRTp8wCq4J6oN0TqW6+dOPU4NFQAgxjuJK0v7UcurtLOmdbT1D4EIfq13X7UT0x X-Received: by 2002:a05:6871:b21:b0:221:35cb:13c6 with SMTP id fq33-20020a0568710b2100b0022135cb13c6mr701927oab.8.1710209740255; Mon, 11 Mar 2024 19:15:40 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710209740; cv=pass; d=google.com; s=arc-20160816; b=CPNBbp1T5GP5Oqapf/hAto6JuQJbyspeV2yDXpLrMkJTmY3JSbKS+EdLuCWLsta43i lNXIMSeWtME+Tjnn3PKeJVsd+pLmFIm/S2uR5h6hrpv/MM/INhhdE0NNLjhuPNTWlDqD h3kCmThpxKVa0UUYpbKfgwpW8tBZtz2MuG9yFXjs1KZPz0Uf3HV0WkbSFg+VOxH6F//D D9tpsFCgaIJCZiXN2FzhdiJldCeCiD5il1gZfMfVxNeqJeXWXr7j8ApRccNskxIj+/NN Ma/TZ1od/gTCVbphIMU9fsFQ7WbGNmZllyA/GClza6dxnF+nlgqoJbrQbghar3fUwWk2 Nsiw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature; bh=Cl7udgSvUHBgMfPXppLF695nsEI6TnU4Bjblg0EcLBc=; fh=0pQgR9SkbNP2iOUM5f454nH0UCAqixVFc0b2IrqFmK4=; b=VlPJNjkPag69KuEh0JeSZGbzzaiXV+AVk6zAjtJ7ALzh0Vcz6i0aOP6VyCT8I09K/f wjbGAlZju+RqpA37OAod/wg9JwTUHwotPO2qrs6Jih6k+Gfm8C9y6hSaZ9Cx/uxqXvGI 5YZJMKZnU7rnNNVOWeAc6h8H+Ylk9oUT0bMDFgUknA8zmXD7Gqtc8EHjVvEVPdHW2Oq/ jcw7g5A60N4FxmOW7oItPT+apLPHeHQ1OPyPF8jozraa6jkGqHjqX2NXCaqAhyfzzNKR kZGYCrCfpSbrNpeOAzdigxbDPSCXCZFGOyXwTRcNKCTvTOR4TdoCoSfWhIbaRtlIugW5 bFjQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CPQ+MPWO; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-99760-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-99760-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id p18-20020a637412000000b005dbedc825b5si6090194pgc.521.2024.03.11.19.15.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Mar 2024 19:15:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-99760-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CPQ+MPWO; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-99760-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-99760-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com 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 sv.mirrors.kernel.org (Postfix) with ESMTPS id E2CCF2818D9 for ; Tue, 12 Mar 2024 02:15:39 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1BC17AD32; Tue, 12 Mar 2024 02:15:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="CPQ+MPWO" Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.16]) (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 A83278BFA; Tue, 12 Mar 2024 02:15:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.16 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710209729; cv=none; b=ts46SNKMuK7KyGvo6eHL3Smb6BIfjXC3Y51JkWlrmpGnYAJJ7QEOSepOODR7cWsSe1gkBhz2nuQHtvnegXzmG3LHa1QLd0dhcQqgwPkkPnAP1FeGltGVpr0MrtwIPUZ+7ALEA5B6o0DECUI84i6BYNI8f9GsbHxbf/q/o34WDYg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710209729; c=relaxed/simple; bh=IPdZvO7JnV7qtlzHEGT928JrfUh/uHg+FhFjTB+YvZw=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=tgAS1ykrUTzQXiRPPN4l4qyzUhF1RsjEEJaFKRWKO1elkMaTHm8P8O1vADV7eAqoN+9530pFaZqBt1D63TCtsYjXckUtTtw84ugJpDE9cE6dO6f2pzdRJnWts6Zz4HKSYZSSeNWlUPHWfribKE1edDae4Ezp0WgKTOLwc3EQboM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=CPQ+MPWO; arc=none smtp.client-ip=192.198.163.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1710209727; x=1741745727; h=date:from:to:cc:subject:message-id:references: mime-version:in-reply-to; bh=IPdZvO7JnV7qtlzHEGT928JrfUh/uHg+FhFjTB+YvZw=; b=CPQ+MPWO7NoAhjuAmWA3mnPcrQg2W0kz9rQL85Ae43+gZJaENt5nBHUb DG3mjp8lz5AE5pN87dVBsyPn7JyGxMNTotv39agEy8nDK6se4VFQOguCr yp2HO0w9KzP1PPGiX3pjM5AVt7GtiG5BTaQ4iWOduSD+juuFDb9w3OexF Ym1kA43y0EcoQYQuX4nbR8ETS3VRORy6ESDe+XszAdVFRNZywQJ5zkKsF 1/u+qNbnucbNMToWzFXbg30W4mhtn5jUs7PyQjzl5PuWnbCDaUOieN/+0 zV7qvH/UOWQtxwkzgYEJQfJj2K1xjPb9dcJeR7tST6oFbzBo6Fdqws4qn g==; X-IronPort-AV: E=McAfee;i="6600,9927,11010"; a="5508044" X-IronPort-AV: E=Sophos;i="6.07,118,1708416000"; d="scan'208";a="5508044" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by fmvoesa110.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Mar 2024 19:15:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,118,1708416000"; d="scan'208";a="16065500" Received: from ls.sc.intel.com (HELO localhost) ([172.25.112.31]) by orviesa005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Mar 2024 19:15:25 -0700 Date: Mon, 11 Mar 2024 19:15:24 -0700 From: Isaku Yamahata To: "Yin, Fengwei" Cc: isaku.yamahata@intel.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, isaku.yamahata@gmail.com, Paolo Bonzini , erdemaktas@google.com, Sean Christopherson , Sagi Shahar , Kai Huang , chen.bo@intel.com, hang.yuan@intel.com, tina.zhang@intel.com, isaku.yamahata@linux.intel.com Subject: Re: [PATCH v19 022/130] KVM: x86/vmx: Refactor KVM VMX module init/exit functions Message-ID: <20240312021524.GG935089@ls.amr.corp.intel.com> References: <11d5ae6a1102a50b0e773fc7efd949bb0bd2b776.1708933498.git.isaku.yamahata@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: On Mon, Mar 11, 2024 at 01:32:08PM +0800, "Yin, Fengwei" wrote: > > > On 2/26/2024 4:25 PM, isaku.yamahata@intel.com wrote: > > From: Isaku Yamahata > > > > Currently, KVM VMX module initialization/exit functions are a single > > function each. Refactor KVM VMX module initialization functions into KVM > > common part and VMX part so that TDX specific part can be added cleanly. > > Opportunistically refactor module exit function as well. > > > > The current module initialization flow is, > > 0.) Check if VMX is supported, > > 1.) hyper-v specific initialization, > > 2.) system-wide x86 specific and vendor specific initialization, > > 3.) Final VMX specific system-wide initialization, > > 4.) calculate the sizes of VMX kvm structure and VMX vcpu structure, > > 5.) report those sizes to the KVM common layer and KVM common > > initialization > > > > Refactor the KVM VMX module initialization function into functions with a > > wrapper function to separate VMX logic in vmx.c from a file, main.c, common > > among VMX and TDX. Introduce a wrapper function for vmx_init(). > > > > The KVM architecture common layer allocates struct kvm with reported size > > for architecture-specific code. The KVM VMX module defines its structure > > as struct vmx_kvm { struct kvm; VMX specific members;} and uses it as > > struct vmx kvm. Similar for vcpu structure. TDX KVM patches will define > > TDX specific kvm and vcpu structures. > > > > The current module exit function is also a single function, a combination > > of VMX specific logic and common KVM logic. Refactor it into VMX specific > > logic and KVM common logic. This is just refactoring to keep the VMX > > specific logic in vmx.c from main.c. > > > > Signed-off-by: Isaku Yamahata > > --- > > v19: > > - Eliminate the unnecessary churn with vmx_hardware_setup() by Xiaoyao > > > > v18: > > - Move loaded_vmcss_on_cpu initialization to vt_init() before > > kvm_x86_vendor_init(). > > - added __init to an empty stub fucntion, hv_init_evmcs(). > > > > Signed-off-by: Isaku Yamahata > Reviewed-by: Yin Fengwei > > With one minor comment. See below. > > > --- > > arch/x86/kvm/vmx/main.c | 54 ++++++++++++++++++++++++++++++++++ > > arch/x86/kvm/vmx/vmx.c | 60 +++++--------------------------------- > > arch/x86/kvm/vmx/x86_ops.h | 14 +++++++++ > > 3 files changed, 75 insertions(+), 53 deletions(-) > > > > diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c > > index eeb7a43b271d..18cecf12c7c8 100644 > > --- a/arch/x86/kvm/vmx/main.c > > +++ b/arch/x86/kvm/vmx/main.c > > @@ -167,3 +167,57 @@ struct kvm_x86_init_ops vt_init_ops __initdata = { > > .runtime_ops = &vt_x86_ops, > > .pmu_ops = &intel_pmu_ops, > > }; > > + > > +static int __init vt_init(void) > > +{ > > + unsigned int vcpu_size, vcpu_align; > > + int cpu, r; > > + > > + if (!kvm_is_vmx_supported()) > > + return -EOPNOTSUPP; > > + > > + /* > > + * Note, hv_init_evmcs() touches only VMX knobs, i.e. there's nothing > > + * to unwind if a later step fails. > > + */ > > + hv_init_evmcs(); > > + > > + /* vmx_hardware_disable() accesses loaded_vmcss_on_cpu. */ > > + for_each_possible_cpu(cpu) > > + INIT_LIST_HEAD(&per_cpu(loaded_vmcss_on_cpu, cpu)); > > + > > + r = kvm_x86_vendor_init(&vt_init_ops); > > + if (r) > > + return r; > > + > > + r = vmx_init(); > > + if (r) > > + goto err_vmx_init; > > + > > + /* > > + * Common KVM initialization _must_ come last, after this, /dev/kvm is > > + * exposed to userspace! > > + */ > > + vcpu_size = sizeof(struct vcpu_vmx); > > + vcpu_align = __alignof__(struct vcpu_vmx); > > + r = kvm_init(vcpu_size, vcpu_align, THIS_MODULE); > > + if (r) > > + goto err_kvm_init; > > + > > + return 0; > > + > > +err_kvm_init: > > + vmx_exit(); > > +err_vmx_init: > > + kvm_x86_vendor_exit(); > > + return r; > > +} > > +module_init(vt_init); > > + > > +static void vt_exit(void) > > +{ > > + kvm_exit(); > > + kvm_x86_vendor_exit(); > > + vmx_exit(); > > +} > > +module_exit(vt_exit); > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > > index 8af0668e4dca..2fb1cd2e28a2 100644 > > --- a/arch/x86/kvm/vmx/vmx.c > > +++ b/arch/x86/kvm/vmx/vmx.c > > @@ -477,7 +477,7 @@ DEFINE_PER_CPU(struct vmcs *, current_vmcs); > > * We maintain a per-CPU linked-list of VMCS loaded on that CPU. This is needed > > * when a CPU is brought down, and we need to VMCLEAR all VMCSs loaded on it. > > */ > > -static DEFINE_PER_CPU(struct list_head, loaded_vmcss_on_cpu); > > +DEFINE_PER_CPU(struct list_head, loaded_vmcss_on_cpu); > > static DECLARE_BITMAP(vmx_vpid_bitmap, VMX_NR_VPIDS); > > static DEFINE_SPINLOCK(vmx_vpid_lock); > > @@ -537,7 +537,7 @@ static int hv_enable_l2_tlb_flush(struct kvm_vcpu *vcpu) > > return 0; > > } > > -static __init void hv_init_evmcs(void) > > +__init void hv_init_evmcs(void) > > { > > int cpu; > > @@ -573,7 +573,7 @@ static __init void hv_init_evmcs(void) > > } > > } > > -static void hv_reset_evmcs(void) > > +void hv_reset_evmcs(void) > > { > > struct hv_vp_assist_page *vp_ap; > > @@ -597,10 +597,6 @@ static void hv_reset_evmcs(void) > > vp_ap->current_nested_vmcs = 0; > > vp_ap->enlighten_vmentry = 0; > > } > > - > > -#else /* IS_ENABLED(CONFIG_HYPERV) */ > > -static void hv_init_evmcs(void) {} > > -static void hv_reset_evmcs(void) {} > > #endif /* IS_ENABLED(CONFIG_HYPERV) */ > > /* > > @@ -2743,7 +2739,7 @@ static bool __kvm_is_vmx_supported(void) > > return true; > > } > > -static bool kvm_is_vmx_supported(void) > > +bool kvm_is_vmx_supported(void) > > { > > bool supported; > > @@ -8508,7 +8504,7 @@ static void vmx_cleanup_l1d_flush(void) > > l1tf_vmx_mitigation = VMENTER_L1D_FLUSH_AUTO; > > } > > -static void __vmx_exit(void) > > +void vmx_exit(void) > > { > > allow_smaller_maxphyaddr = false; > > @@ -8517,36 +8513,10 @@ static void __vmx_exit(void) > > vmx_cleanup_l1d_flush(); > > } > > -static void vmx_exit(void) > > -{ > > - kvm_exit(); > > - kvm_x86_vendor_exit(); > > - > > - __vmx_exit(); > > -} > > -module_exit(vmx_exit); > > - > > -static int __init vmx_init(void) > > +int __init vmx_init(void) > > { > > int r, cpu; > > - if (!kvm_is_vmx_supported()) > > - return -EOPNOTSUPP; > > - > > - /* > > - * Note, hv_init_evmcs() touches only VMX knobs, i.e. there's nothing > > - * to unwind if a later step fails. > > - */ > > - hv_init_evmcs(); > > - > > - /* vmx_hardware_disable() accesses loaded_vmcss_on_cpu. */ > > - for_each_possible_cpu(cpu) > > - INIT_LIST_HEAD(&per_cpu(loaded_vmcss_on_cpu, cpu)); > > - > > - r = kvm_x86_vendor_init(&vt_init_ops); > > - if (r) > > - return r; > > - > > /* > > * Must be called after common x86 init so enable_ept is properly set > > * up. Hand the parameter mitigation value in which was stored in > I am wondering whether the first sentence of above comment should be > moved to vt_init()? So vt_init() has whole information about the init > sequence. If we do so, we should move the call of "vmx_setup_l1d_flush() to vt_init(). I hesitated to remove static of vmx_setup_l1d_flush(). -- Isaku Yamahata