From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: [patch 11/13] KVM: MMU: sync global pages on cr0/cr4 writes Date: Sat, 06 Sep 2008 15:48:33 -0300 Message-ID: <20080906192431.378488483@localhost.localdomain> References: <20080906184822.560099087@localhost.localdomain> Cc: kvm@vger.kernel.org To: Avi Kivity Return-path: Received: from mx1.redhat.com ([66.187.233.31]:57361 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752549AbYIFT1k (ORCPT ); Sat, 6 Sep 2008 15:27:40 -0400 Content-Disposition: inline; filename=kvm-oos-cr4-sync-global Sender: kvm-owner@vger.kernel.org List-ID: Index: kvm/arch/x86/kvm/mmu.c =================================================================== --- kvm.orig/arch/x86/kvm/mmu.c +++ kvm/arch/x86/kvm/mmu.c @@ -1097,6 +1097,20 @@ static int set_shared_mmu_page(struct kv return ret; } +void kvm_mmu_sync_global(struct kvm_vcpu *vcpu) +{ + int i; + struct kvm *kvm = vcpu->kvm; + + spin_lock(&kvm->mmu_lock); + for (i = 0; i < ARRAY_SIZE(kvm->arch.oos_global_pages); i++) { + struct kvm_mmu_page *sp = kvm->arch.oos_global_pages[i]; + if (sp) + kvm_sync_page(vcpu, sp); + } + spin_unlock(&kvm->mmu_lock); +} + static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, gfn_t root_gfn, gfn_t gfn, Index: kvm/arch/x86/kvm/x86.c =================================================================== --- kvm.orig/arch/x86/kvm/x86.c +++ kvm/arch/x86/kvm/x86.c @@ -532,6 +532,7 @@ 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; } @@ -575,6 +576,7 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, } kvm_x86_ops->set_cr4(vcpu, cr4); vcpu->arch.cr4 = cr4; + kvm_mmu_sync_global(vcpu); kvm_mmu_reset_context(vcpu); } EXPORT_SYMBOL_GPL(kvm_set_cr4); Index: kvm/include/asm-x86/kvm_host.h =================================================================== --- kvm.orig/include/asm-x86/kvm_host.h +++ kvm/include/asm-x86/kvm_host.h @@ -611,6 +611,7 @@ void __kvm_mmu_free_some_pages(struct kv int 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); --