From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Jim Mattson <jmattson@google.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH] kvm: vmx: Stop wasting a page for guest_msrs
Date: Tue, 3 Dec 2019 14:59:18 -0800 [thread overview]
Message-ID: <20191203225918.GO19877@linux.intel.com> (raw)
In-Reply-To: <20191203210825.26827-1-jmattson@google.com>
On Tue, Dec 03, 2019 at 01:08:25PM -0800, Jim Mattson wrote:
> We will never need more guest_msrs than there are indices in
> vmx_msr_index. Thus, at present, the guest_msrs array will not exceed
> 168 bytes.
>
> Signed-off-by: Jim Mattson <jmattson@google.com>
> ---
> arch/x86/kvm/vmx/vmx.c | 14 ++------------
> arch/x86/kvm/vmx/vmx.h | 8 +++++++-
> 2 files changed, 9 insertions(+), 13 deletions(-)
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 1b9ab4166397d..0b3c7524456f1 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -443,7 +443,7 @@ static unsigned long host_idt_base;
> * support this emulation, IA32_STAR must always be included in
> * vmx_msr_index[], even in i386 builds.
> */
> -const u32 vmx_msr_index[] = {
> +const u32 vmx_msr_index[NR_GUEST_MSRS] = {
What if we keep this as is and add
BUILD_BUG_ON(ARRAY_SIZE(vmx_msr_index) != NR_SHARED_MSRS);
in setup_msrs()? That way the build will fail if someone adds an MSR but
forgets to update the #define. With this change, gcc only spits out a
warning if the number of elements exceeds the size of the array and
presumably drops the extra elements on the floor.
> #ifdef CONFIG_X86_64
> MSR_SYSCALL_MASK, MSR_LSTAR, MSR_CSTAR,
> #endif
> @@ -6666,7 +6666,6 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu)
> free_vpid(vmx->vpid);
> nested_vmx_free_vcpu(vcpu);
> free_loaded_vmcs(vmx->loaded_vmcs);
> - kfree(vmx->guest_msrs);
> kvm_vcpu_uninit(vcpu);
> kmem_cache_free(x86_fpu_cache, vmx->vcpu.arch.user_fpu);
> kmem_cache_free(x86_fpu_cache, vmx->vcpu.arch.guest_fpu);
> @@ -6723,13 +6722,6 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id)
> goto uninit_vcpu;
> }
>
> - vmx->guest_msrs = kmalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT);
> - BUILD_BUG_ON(ARRAY_SIZE(vmx_msr_index) * sizeof(vmx->guest_msrs[0])
> - > PAGE_SIZE);
> -
> - if (!vmx->guest_msrs)
> - goto free_pml;
> -
> for (i = 0; i < ARRAY_SIZE(vmx_msr_index); ++i) {
> u32 index = vmx_msr_index[i];
> u32 data_low, data_high;
> @@ -6760,7 +6752,7 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id)
>
> err = alloc_loaded_vmcs(&vmx->vmcs01);
> if (err < 0)
> - goto free_msrs;
> + goto free_pml;
>
> msr_bitmap = vmx->vmcs01.msr_bitmap;
> vmx_disable_intercept_for_msr(msr_bitmap, MSR_IA32_TSC, MSR_TYPE_R);
> @@ -6822,8 +6814,6 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id)
>
> free_vmcs:
> free_loaded_vmcs(vmx->loaded_vmcs);
> -free_msrs:
> - kfree(vmx->guest_msrs);
> free_pml:
> vmx_destroy_pml_buffer(vmx);
> uninit_vcpu:
> diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
> index 7c1b978b2df44..08bc24fa59909 100644
> --- a/arch/x86/kvm/vmx/vmx.h
> +++ b/arch/x86/kvm/vmx/vmx.h
> @@ -22,6 +22,12 @@ extern u32 get_umwait_control_msr(void);
>
> #define X2APIC_MSR(r) (APIC_BASE_MSR + ((r) >> 4))
>
> +#ifdef CONFIG_X86_64
> +#define NR_GUEST_MSRS 7
> +#else
> +#define NR_GUEST_MSRS 4
> +#endif
As much as I hate the "shared msrs" terminology, "guest msrs" is even
more confusing and misleading. NR_SHARED_MSRS?
> +
> #define NR_LOADSTORE_MSRS 8
>
> struct vmx_msrs {
> @@ -206,7 +212,7 @@ struct vcpu_vmx {
> u32 idt_vectoring_info;
> ulong rflags;
>
> - struct shared_msr_entry *guest_msrs;
> + struct shared_msr_entry guest_msrs[NR_GUEST_MSRS];
> int nmsrs;
> int save_nmsrs;
> bool guest_msrs_ready;
> --
> 2.24.0.393.g34dc348eaf-goog
>
next prev parent reply other threads:[~2019-12-03 22:59 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-03 21:08 [PATCH] kvm: vmx: Stop wasting a page for guest_msrs Jim Mattson
2019-12-03 22:39 ` Liran Alon
2019-12-03 22:59 ` Sean Christopherson [this message]
2019-12-03 23:24 ` Jim Mattson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191203225918.GO19877@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox