KVM: Move first pte address calculation out of loop to save some cycles
PATCH 1/4 KVM: Move first pte address calculation out of loop to save some cycles
Move first pte address calculation out of loop to save some cycles
Signed-off-by Gui Jianfeng <[email protected]>
--- arch/x86/kvm/paging_tmpl.h | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-)
arch/x86/kvm/paging_tmpl.h +4 -2
@@ -572,12 +572,15 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) {int i, offset, nr_present;bool reset_host_protection; +gpa_t first_pte_gpa; offset = nr_present =0 ;if (PTTYPE ==32 ) offset = sp->role.quadrant <<PT64_LEVEL_BITS ; + first_pte_gpa =gfn_to_gpa (sp->gfn) + offset *sizeof (pt_element_t); +for (i =0 ; i <PT64_ENT_PER_PAGE ; i++) {unsigned pte_access;pt_element_t gpte;
@@ -587,8 +590,7 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)if (!is_shadow_present_pte (sp->spt[i]))continue ; - pte_gpa =gfn_to_gpa (sp->gfn); - pte_gpa += (i+offset) *sizeof (pt_element_t); + pte_gpa = first_pte_gpa + i *sizeof (pt_element_t);if (kvm_read_guest_atomic (vcpu->kvm, pte_gpa, &gpte,sizeof (pt_element_t)))
Signature · 1 line
1.6.5.2
PATCH 2/4 KVM: Make use of is_large_pte() instead
Make use of is_large_pte() instead of checking PT_PAGE_SIZE_MASK bit directly.
Signed-off-by Gui Jianfeng <[email protected]>
--- arch/x86/kvm/paging_tmpl.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/kvm/paging_tmpl.h +2 -2
@@ -190,10 +190,10 @@ walk:if ((walker->level ==PT_PAGE_TABLE_LEVEL ) || ((walker->level ==PT_DIRECTORY_LEVEL ) && - (pte &PT_PAGE_SIZE_MASK ) && +is_large_pte (pte) && (PTTYPE ==64 ||is_pse (vcpu))) || ((walker->level ==PT_PDPE_LEVEL ) && - (pte &PT_PAGE_SIZE_MASK ) && +is_large_pte (pte) &&is_long_mode (vcpu))) {int lvl = walker->level;
-- 1.6.5.2
PATCH 3/4 KVM: Remove unused varialbe in rmap_next()
In reply to Gui JianfengRemove unused varialbe in rmap_next()
Signed-off-by Gui Jianfeng <[email protected]>
--- arch/x86/kvm/mmu.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-)
arch/x86/kvm/mmu.c +0 -2
@@ -651,7 +651,6 @@ static void rmap_remove(struct kvm *kvm, u64 *spte)static u64 *rmap_next (struct kvm *kvm,unsigned long *rmapp,u64 *spte) {struct kvm_rmap_desc *desc; -struct kvm_rmap_desc *prev_desc;u64 *prev_spte;int i;
@@ -663,7 +662,6 @@ static u64 *rmap_next(struct kvm *kvm, unsigned long *rmapp, u64 *spte)return NULL ; } desc = (struct kvm_rmap_desc *)(*rmapp & ~1ul ); - prev_desc =NULL ; prev_spte =NULL ;while (desc) {for (i =0 ; i <RMAP_EXT && desc->sptes[i]; ++i) {
-- 1.6.5.2
PATCH 4/4 KVM: Get rid of dead function
In reply to Gui JianfengNobody use gva_to_page() anymore, get rid of it.
Signed-off-by Gui Jianfeng <[email protected]>
--- arch/x86/kvm/mmu.c | 14 -------------- include/linux/kvm_host.h | 1 - 2 files changed, 0 insertions(+), 15 deletions(-)
arch/x86/kvm/mmu.c +0 -14
@@ -1619,20 +1619,6 @@ static void mmu_convert_notrap(struct kvm_mmu_page *sp) } } -struct page *gva_to_page (struct kvm_vcpu *vcpu,gva_t gva) -{ -struct page *page; - -gpa_t gpa =kvm_mmu_gva_to_gpa_read (vcpu, gva,NULL ); - -if (gpa ==UNMAPPED_GVA ) -return NULL ; - - page =gfn_to_page (vcpu->kvm, gpa >>PAGE_SHIFT ); - -return page; -} -/* * The function is based on mtrr_type_lookup() in * arch/x86/kernel/cpu/mtrr/generic.c
include/linux/kvm_host.h +0 -1
@@ -247,7 +247,6 @@ void kvm_put_kvm(struct kvm *kvm);#define HPA_MSB ((sizeof(hpa_t) * 8) - 1)#define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB)static inline int is_error_hpa (hpa_t hpa) {return hpa >>HPA_MSB ; } -struct page *gva_to_page (struct kvm_vcpu *vcpu,gva_t gva);extern struct page *bad_page;extern pfn_t bad_pfn;
-- 1.6.5.2
Avi Kivity
AppliedQuoted 2 lines · Gui Jianfeng
Move first pte address calculation out of loop to save some cycles
Applied all four patches, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function