disable unsync global page optimization
cover disable unsync global page optimization
PATCH 1/2 KVM: MMU: disable global page optimization
Complexity to fix it not worthwhile the gains, as discussed in http://article.gmane.org/gmane.comp.emulators.kvm.devel/28649.
Signed-off-by Marcelo Tosatti <[email protected]>
arch/x86/kvm/mmu.c +1 -1
@@ -1254,7 +1254,7 @@ static struct kvm_mmu_page *kvm_mmu_get_pgprintk ("%s: adding gfn %lx role %x\n" , __func__, gfn, role.word); sp->gfn = gfn; sp->role = role; - sp->global = role.cr4_pge; + sp->global =0 ;hlist_add_head (&sp->hash_link, bucket);if (!direct) {if (rmap_write_protect (vcpu->kvm, gfn))
PATCH 2/2 KVM: MMU: remove global page optimization logic
In reply to Marcelo TosattiComplexity to fix it not worthwhile the gains, as discussed in http://article.gmane.org/gmane.comp.emulators.kvm.devel/28649.
Signed-off-by Marcelo Tosatti <[email protected]>
arch/x86/include/asm/kvm_host.h +0 -4
@@ -213,7 +213,6 @@ struct kvm_mmu_page {int multimapped;/* More than one parent_pte? */ int root_count;/* Currently serving as active root */ bool unsync; -bool global;unsigned int unsync_children;union {u64 *parent_pte;/* !multimapped */
@@ -395,7 +394,6 @@ struct kvm_arch{*/ struct list_head active_mmu_pages;struct list_head assigned_dev_head; -struct list_head oos_global_pages;struct iommu_domain *iommu_domain;struct kvm_pic *vpic;struct kvm_ioapic *vioapic;
@@ -425,7 +423,6 @@ struct kvm_vm_stat {u32 mmu_recycled;u32 mmu_cache_miss;u32 mmu_unsync; -u32 mmu_unsync_global;u32 remote_tlb_flush;u32 lpages; };
@@ -640,7 +637,6 @@ void __kvm_mmu_free_some_pages(struct kvint kvm_mmu_load (struct kvm_vcpu *vcpu);void kvm_mmu_unload (struct kvm_vcpu *vcpu);void kvm_mmu_sync_roots (struct kvm_vcpu *vcpu); -void kvm_mmu_sync_global (struct kvm_vcpu *vcpu);int kvm_emulate_hypercall (struct kvm_vcpu *vcpu);
arch/x86/kvm/mmu.c +6 -44
113 lines not on this page · raw message
arch/x86/kvm/paging_tmpl.h +2 -4
@@ -268,8 +268,7 @@ static void FNAME(update_pte)(struct kvmkvm_get_pfn (pfn);mmu_set_spte (vcpu, spte, page->role.access, pte_access,0 ,0 , gpte &PT_DIRTY_MASK ,NULL , largepage, - gpte &PT_GLOBAL_MASK ,gpte_to_gfn (gpte), - pfn, true); +gpte_to_gfn (gpte), pfn, true); }/*
@@ -303,7 +302,6 @@ static u64 *FNAME(fetch)(struct kvm_vcpu user_fault, write_fault, gw->ptes[gw->level-1 ] &PT_DIRTY_MASK , ptwrite, largepage, - gw->ptes[gw->level-1 ] &PT_GLOBAL_MASK , gw->gfn, pfn, false);break ; }
@@ -592,7 +590,7 @@ static int FNAME(sync_page)(struct kvm_v nr_present++; pte_access = sp->role.access &FNAME (gpte_access)(vcpu, gpte);set_spte (vcpu, &sp->spt[i], pte_access,0 ,0 , -is_dirty_pte (gpte),0 , gpte &PT_GLOBAL_MASK , gfn, +is_dirty_pte (gpte),0 , gfn,spte_to_pfn (sp->spt[i]), true, false); }
arch/x86/kvm/x86.c +0 -4
@@ -108,7 +108,6 @@ struct kvm_stats_debugfs_item debugfs_en { "mmu_recycled", VM_STAT(mmu_recycled) }, { "mmu_cache_miss", VM_STAT(mmu_cache_miss) }, { "mmu_unsync", VM_STAT(mmu_unsync) }, - { "mmu_unsync_global", VM_STAT(mmu_unsync_global) }, { "remote_tlb_flush", VM_STAT(remote_tlb_flush) }, { "largepages", VM_STAT(lpages) }, { NULL }
@@ -321,7 +320,6 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, kvm_x86_ops->set_cr0 (vcpu, cr0); vcpu->arch.cr0 = cr0; -kvm_mmu_sync_global (vcpu);kvm_mmu_reset_context (vcpu);return ; }
@@ -366,7 +364,6 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, kvm_x86_ops->set_cr4 (vcpu, cr4); vcpu->arch.cr4 = cr4; vcpu->arch.mmu.base_role.cr4_pge = (cr4 &X86_CR4_PGE ) && !tdp_enabled; -kvm_mmu_sync_global (vcpu);kvm_mmu_reset_context (vcpu); }EXPORT_SYMBOL_GPL (kvm_set_cr4);
@@ -4329,7 +4326,6 @@ struct kvm *kvm_arch_create_vm(void)return ERR_PTR (-ENOMEM );INIT_LIST_HEAD (&kvm->arch.active_mmu_pages); -INIT_LIST_HEAD (&kvm->arch.oos_global_pages);INIT_LIST_HEAD (&kvm->arch.assigned_dev_head);/* Reserve bit 0 of irq_sources_bitmap for userspace irq source */
Avi Kivity
AppliedMarcelo Tosatti wrote:
Applied, thanks.
Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.