[patch 11/13] KVM: MMU: sync global pages on cr0/cr4 writes

Marcelo Tosatti
2008-09-06T19:27:40Z

[-- Attachment #1: kvm-oos-cr4-sync-global --]
[-- Type: text/plain, Size: 1749 bytes --]

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);

--