From patchwork Wed Dec 5 23:29:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Mattson X-Patchwork-Id: 10715057 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8902718A7 for ; Wed, 5 Dec 2018 23:29:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7899B2E0B8 for ; Wed, 5 Dec 2018 23:29:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 68D5F2E0BE; Wed, 5 Dec 2018 23:29:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 96A6C2E0F0 for ; Wed, 5 Dec 2018 23:29:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728695AbeLEX3U (ORCPT ); Wed, 5 Dec 2018 18:29:20 -0500 Received: from mail-oi1-f202.google.com ([209.85.167.202]:42810 "EHLO mail-oi1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728745AbeLEX3T (ORCPT ); Wed, 5 Dec 2018 18:29:19 -0500 Received: by mail-oi1-f202.google.com with SMTP id h85so13353987oib.9 for ; Wed, 05 Dec 2018 15:29:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=+1MlVB21bFxZDGSl/11a26XHdIGnetfG7HZxmxpHiP4=; b=Edi+FrfS650D8SOSd3FB1LYKU8hd6/+EsI6rnfSYFT9nqBWBuxzTt8V8F19WsWHv1R /047RbvGtzC+3E44oAWNkeEgYVZT3auD5SjzbP17s57rNHXuEBC+eendHh6GKjlwYX7D CyAO9lLjTVA6zD0vu0Oghm77Pqa6nH98nwBYCNtxBViBkN5Vc50qbOvd5rJFRy0iUjng tCJ+66x3gL6LmJyrpIDA1KV5N8OgBnm04Qk7OltSUU9jsh90AmpdhN/S4GDqxH9U1Jfm 2Fbwxs4nGoaY3Q/hG+howNkUfx5QJ2mZoJ6Phbj9v57QaYuha5QAQURptqK5bv69uczU kvbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=+1MlVB21bFxZDGSl/11a26XHdIGnetfG7HZxmxpHiP4=; b=BoEsEd3Zxh+byebTFtFiBN1APEthNVU7z/6CPVTCbzkjEbPg+D8J8wLIaZ4xieX4RH PwlF2EDxKGm4xS9LcyBl+ozTaNdvOEzNLyr0XQSJ4TGwHOLM76Rt2pWrTMAdt+CXOHBr OvO9eh1zrpDMcbQix4MNzgSAW8olP9GvOIioi/kT57gr5e5vryoU2BSuj2dAzgC4miZR wbTquuN72VvBBhIZ0APf4zebryXq/KnXPQTdD0sGRSVPcIrT7xnZth+m5bIQKSMoKX64 1bEsZVQqgPiKIZt1HMiA6ucBxkggc3fd2XLbB7CPojd4XVMrjYOvxFGvXG3G1TNx3fkM +xpw== X-Gm-Message-State: AA+aEWbaKS5fUIm73nNTJfGH/fWdRTaqpb9uaX2EfNlGPYvOSBwjBiDV YFiA/YeKcq+0eK0diXh5gMy+Lsat6crhda4ntaEy9m7Y0touoDsC4yXFcSIkOEhjDF2aUoiT8EA 8jDIfeeJOpq2MhzJ/jWP/6dq02FJq1Ow46Nv3hWt+2Ekg5vxxDG1AVhGiaeozYnE= X-Google-Smtp-Source: AFSGD/UHa/VcuWoPD+6rN5rsxeJXbV3G89VDfDl/WDDuqHuPheRyfcSBnOFDdx2Nq/5OMqdD6x2fMeJ0Y0fDWw== X-Received: by 2002:aca:a949:: with SMTP id s70mr20818941oie.1.1544052559170; Wed, 05 Dec 2018 15:29:19 -0800 (PST) Date: Wed, 5 Dec 2018 15:29:02 -0800 In-Reply-To: <20181205232902.1431-1-jmattson@google.com> Message-Id: <20181205232902.1431-6-jmattson@google.com> Mime-Version: 1.0 References: <20181205232902.1431-1-jmattson@google.com> X-Mailer: git-send-email 2.20.0.rc1.387.gf8505762e3-goog Subject: [PATCH v4 5/5] kvm: vmx: Stop wasting a page for guest_msrs From: Jim Mattson To: kvm@vger.kernel.org Cc: Jim Mattson , Marc Orr , Peter Shier Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We will never need more guest_msrs than there are indices in vmx_msr_index. Signed-off-by: Jim Mattson Reviewed-by: Marc Orr Reviewed-by: Peter Shier --- arch/x86/kvm/vmx.c | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 7ae3842f659e2..cf3c9eb4b4dcb 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -974,6 +974,20 @@ struct vmx_msrs { struct vmx_msr_entry val[NR_AUTOLOAD_MSRS]; }; +/* + * Though SYSCALL is only supported in 64-bit mode on Intel CPUs, kvm + * will emulate SYSCALL in legacy mode if the vendor string in guest + * CPUID.0:{EBX,ECX,EDX} is "AuthenticAMD" or "AMDisbetter!" To + * support this emulation, IA32_STAR must always be included in + * vmx_msr_index[], even in i386 builds. + */ +static const u32 vmx_msr_index[] = { +#ifdef CONFIG_X86_64 + MSR_SYSCALL_MASK, MSR_LSTAR, MSR_CSTAR, +#endif + MSR_EFER, MSR_TSC_AUX, MSR_STAR, +}; + struct vcpu_vmx { struct kvm_vcpu vcpu; unsigned long host_rsp; @@ -982,7 +996,7 @@ struct vcpu_vmx { u32 exit_intr_info; u32 idt_vectoring_info; ulong rflags; - struct shared_msr_entry *guest_msrs; + struct shared_msr_entry guest_msrs[ARRAY_SIZE(vmx_msr_index)]; int nmsrs; int save_nmsrs; bool guest_msrs_dirty; @@ -1389,20 +1403,6 @@ static u64 host_efer; static void ept_save_pdptrs(struct kvm_vcpu *vcpu); -/* - * Though SYSCALL is only supported in 64-bit mode on Intel CPUs, kvm - * will emulate SYSCALL in legacy mode if the vendor string in guest - * CPUID.0:{EBX,ECX,EDX} is "AuthenticAMD" or "AMDisbetter!" To - * support this emulation, IA32_STAR must always be included in - * vmx_msr_index[], even in i386 builds. - */ -static const u32 vmx_msr_index[] = { -#ifdef CONFIG_X86_64 - MSR_SYSCALL_MASK, MSR_LSTAR, MSR_CSTAR, -#endif - MSR_EFER, MSR_TSC_AUX, MSR_STAR, -}; - DEFINE_STATIC_KEY_FALSE(enable_evmcs); #define current_evmcs ((struct hv_enlightened_vmcs *)this_cpu_read(current_vmcs)) @@ -11524,7 +11524,6 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu) leave_guest_mode(vcpu); vmx_free_vcpu_nested(vcpu); free_loaded_vmcs(vmx->loaded_vmcs); - kfree(vmx->guest_msrs); kvm_vcpu_uninit(vcpu); kmem_cache_free(kvm_vcpu_cache, vmx); } @@ -11559,16 +11558,9 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id) goto uninit_vcpu; } - vmx->guest_msrs = kmalloc(PAGE_SIZE, GFP_KERNEL); - BUILD_BUG_ON(ARRAY_SIZE(vmx_msr_index) * sizeof(vmx->guest_msrs[0]) - > PAGE_SIZE); - - if (!vmx->guest_msrs) - goto free_pml; - 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_FS_BASE, MSR_TYPE_RW); @@ -11618,8 +11610,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: