From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sheng Yang Subject: Re: [PATCH 4/4] KVM: VMX: Enable EPT 1GB page support Date: Wed, 6 Jan 2010 17:25:27 +0800 Message-ID: <201001061725.27571.sheng@linux.intel.com> References: <1262689349-12350-1-git-send-email-sheng@linux.intel.com> <1262689349-12350-5-git-send-email-sheng@linux.intel.com> <20100106091915.GA4553@amt.cnet> Mime-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Cc: Avi Kivity , kvm@vger.kernel.org To: Marcelo Tosatti Return-path: Received: from mga05.intel.com ([192.55.52.89]:19066 "EHLO fmsmga101.fm.intel.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754290Ab0AFJ1T (ORCPT ); Wed, 6 Jan 2010 04:27:19 -0500 In-Reply-To: <20100106091915.GA4553@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: On Wednesday 06 January 2010 17:19:15 Marcelo Tosatti wrote: > On Tue, Jan 05, 2010 at 07:02:29PM +0800, Sheng Yang wrote: > > Signed-off-by: Sheng Yang > > --- > > arch/x86/include/asm/vmx.h | 1 + > > arch/x86/kvm/mmu.c | 8 +++++--- > > arch/x86/kvm/vmx.c | 11 ++++++++++- > > 3 files changed, 16 insertions(+), 4 deletions(-) > > > > diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h > > index 713ed9a..43f1e9b 100644 > > --- a/arch/x86/include/asm/vmx.h > > +++ b/arch/x86/include/asm/vmx.h > > @@ -364,6 +364,7 @@ enum vmcs_field { > > #define VMX_EPTP_UC_BIT (1ull << 8) > > #define VMX_EPTP_WB_BIT (1ull << 14) > > #define VMX_EPT_2MB_PAGE_BIT (1ull << 16) > > +#define VMX_EPT_1GB_PAGE_BIT (1ull << 17) > > #define VMX_EPT_EXTENT_INDIVIDUAL_BIT (1ull << 24) > > #define VMX_EPT_EXTENT_CONTEXT_BIT (1ull << 25) > > #define VMX_EPT_EXTENT_GLOBAL_BIT (1ull << 26) > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > > index 43cf2ea..9012541 100644 > > --- a/arch/x86/kvm/mmu.c > > +++ b/arch/x86/kvm/mmu.c > > @@ -499,8 +499,7 @@ out: > > static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) > > { > > struct kvm_memory_slot *slot; > > - int host_level; > > - int level = PT_PAGE_TABLE_LEVEL; > > + int host_level, level, max_level; > > > > slot = gfn_to_memslot(vcpu->kvm, large_gfn); > > if (slot && slot->dirty_bitmap) > > @@ -511,7 +510,10 @@ static int mapping_level(struct kvm_vcpu *vcpu, > > gfn_t large_gfn) if (host_level == PT_PAGE_TABLE_LEVEL) > > return host_level; > > > > - for (level = PT_DIRECTORY_LEVEL; level <= host_level; ++level) > > + max_level = kvm_x86_ops->get_lpage_level() < host_level ? > > + kvm_x86_ops->get_lpage_level() : host_level; > > + > > BUG_ON(kvm_x86_ops->get_lpage_level() < host_level) instead? See > the if (host_level == PT_PAGE_TABLE_LEVEL) above. Sorry, I don't understand... Here, EPT can support either 2MB or 1GB page at most, So we represent the value through get_lpage_level(). Now 1GB page backed host memory can still using by 2MB page backed EPT if 1GB page EPT is not supported in the processor. -- regards Yang, Sheng