[PATCH] kvm mmu: optimizations when tdp is in use
In case of using tdp, checking write protected page isn't needed and quadrant also no need to be calculated. Signed-off-by: Gui Jianfeng guijianf...@cn.fujitsu.com --- arch/x86/kvm/mmu.c |7 +-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 0bb9f17..ce4bbd3 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -495,10 +495,13 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) max_level = kvm_x86_ops-get_lpage_level() host_level ? kvm_x86_ops-get_lpage_level() : host_level; + if (tdp_enabled) + goto done; + for (level = PT_DIRECTORY_LEVEL; level = max_level; ++level) if (has_wrprotected_page(vcpu-kvm, large_gfn, level)) break; - +done: return level - 1; } @@ -1346,7 +1349,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, if (role.direct) role.cr4_pae = 0; role.access = access; - if (vcpu-arch.mmu.root_level = PT32_ROOT_LEVEL) { + if (!tdp_enabled vcpu-arch.mmu.root_level = PT32_ROOT_LEVEL) { quadrant = gaddr (PAGE_SHIFT + (PT64_PT_BITS * level)); quadrant = (1 ((PT32_PT_BITS - PT64_PT_BITS) * level)) - 1; role.quadrant = quadrant; -- 1.6.5.2 -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] kvm mmu: optimizations when tdp is in use
On 05/27/2010 11:06 AM, Gui Jianfeng wrote: In case of using tdp, checking write protected page isn't needed and quadrant also no need to be calculated. Signed-off-by: Gui Jianfengguijianf...@cn.fujitsu.com --- arch/x86/kvm/mmu.c |7 +-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 0bb9f17..ce4bbd3 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -495,10 +495,13 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) max_level = kvm_x86_ops-get_lpage_level() host_level ? kvm_x86_ops-get_lpage_level() : host_level; + if (tdp_enabled) + goto done; + for (level = PT_DIRECTORY_LEVEL; level= max_level; ++level) if (has_wrprotected_page(vcpu-kvm, large_gfn, level)) break; - +done: return level - 1; } We also use -write_count to prevent mapping the end of a non-large-page-aligned memslot with a large spte. Undocumented in mmu.txt, I'll post a patch. -- error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] kvm mmu: optimizations when tdp is in use
On Thu, May 27, 2010 at 04:06:34PM +0800, Gui Jianfeng wrote: In case of using tdp, checking write protected page isn't needed and quadrant also no need to be calculated. Signed-off-by: Gui Jianfeng guijianf...@cn.fujitsu.com --- arch/x86/kvm/mmu.c |7 +-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 0bb9f17..ce4bbd3 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -495,10 +495,13 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) max_level = kvm_x86_ops-get_lpage_level() host_level ? kvm_x86_ops-get_lpage_level() : host_level; + if (tdp_enabled) + goto done; + This is wrong. write_count is initialized for alignment purposes, not only write protected pages. See __kvm_set_memory_region in virt/kvm/kvm_main.c. for (level = PT_DIRECTORY_LEVEL; level = max_level; ++level) if (has_wrprotected_page(vcpu-kvm, large_gfn, level)) break; - +done: return level - 1; } @@ -1346,7 +1349,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, if (role.direct) role.cr4_pae = 0; role.access = access; - if (vcpu-arch.mmu.root_level = PT32_ROOT_LEVEL) { + if (!tdp_enabled vcpu-arch.mmu.root_level = PT32_ROOT_LEVEL) { quadrant = gaddr (PAGE_SHIFT + (PT64_PT_BITS * level)); quadrant = (1 ((PT32_PT_BITS - PT64_PT_BITS) * level)) - 1; role.quadrant = quadrant; -- 1.6.5.2 -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] kvm mmu: optimizations when tdp is in use
Marcelo Tosatti wrote: On Thu, May 27, 2010 at 04:06:34PM +0800, Gui Jianfeng wrote: In case of using tdp, checking write protected page isn't needed and quadrant also no need to be calculated. Signed-off-by: Gui Jianfeng guijianf...@cn.fujitsu.com --- arch/x86/kvm/mmu.c |7 +-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 0bb9f17..ce4bbd3 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -495,10 +495,13 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) max_level = kvm_x86_ops-get_lpage_level() host_level ? kvm_x86_ops-get_lpage_level() : host_level; +if (tdp_enabled) +goto done; + This is wrong. write_count is initialized for alignment purposes, not only write protected pages. See __kvm_set_memory_region in virt/kvm/kvm_main.c. thanks, avi also pointed this out. Gui for (level = PT_DIRECTORY_LEVEL; level = max_level; ++level) if (has_wrprotected_page(vcpu-kvm, large_gfn, level)) break; - +done: return level - 1; } @@ -1346,7 +1349,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, if (role.direct) role.cr4_pae = 0; role.access = access; -if (vcpu-arch.mmu.root_level = PT32_ROOT_LEVEL) { +if (!tdp_enabled vcpu-arch.mmu.root_level = PT32_ROOT_LEVEL) { quadrant = gaddr (PAGE_SHIFT + (PT64_PT_BITS * level)); quadrant = (1 ((PT32_PT_BITS - PT64_PT_BITS) * level)) - 1; role.quadrant = quadrant; -- 1.6.5.2 -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- Regards Gui Jianfeng -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html