diff options
author | Avi Kivity <avi@qumranet.com> | 2007-05-31 08:46:04 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2007-07-16 05:05:44 -0400 |
commit | e663ee64aefc57f7eff7325142206c4ea0200be8 (patch) | |
tree | a95c5a1015914ee4101c1770039ad1457e8767c3 /drivers/kvm/mmu.c | |
parent | 0d551bb698e1328f685ae3611c4a4a96f41bef97 (diff) |
KVM: MMU: Make setting shadow ptes atomic on i386
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm/mmu.c')
-rw-r--r-- | drivers/kvm/mmu.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index 3cdbf687df25..f24b540148aa 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
23 | #include <linux/highmem.h> | 23 | #include <linux/highmem.h> |
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <asm/cmpxchg.h> | ||
25 | 26 | ||
26 | #include "vmx.h" | 27 | #include "vmx.h" |
27 | #include "kvm.h" | 28 | #include "kvm.h" |
@@ -204,6 +205,15 @@ static int is_rmap_pte(u64 pte) | |||
204 | == (PT_WRITABLE_MASK | PT_PRESENT_MASK); | 205 | == (PT_WRITABLE_MASK | PT_PRESENT_MASK); |
205 | } | 206 | } |
206 | 207 | ||
208 | static void set_shadow_pte(u64 *sptep, u64 spte) | ||
209 | { | ||
210 | #ifdef CONFIG_X86_64 | ||
211 | set_64bit((unsigned long *)sptep, spte); | ||
212 | #else | ||
213 | set_64bit((unsigned long long *)sptep, spte); | ||
214 | #endif | ||
215 | } | ||
216 | |||
207 | static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, | 217 | static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, |
208 | struct kmem_cache *base_cache, int min, | 218 | struct kmem_cache *base_cache, int min, |
209 | gfp_t gfp_flags) | 219 | gfp_t gfp_flags) |
@@ -446,7 +456,7 @@ static void rmap_write_protect(struct kvm_vcpu *vcpu, u64 gfn) | |||
446 | rmap_printk("rmap_write_protect: spte %p %llx\n", spte, *spte); | 456 | rmap_printk("rmap_write_protect: spte %p %llx\n", spte, *spte); |
447 | rmap_remove(vcpu, spte); | 457 | rmap_remove(vcpu, spte); |
448 | kvm_arch_ops->tlb_flush(vcpu); | 458 | kvm_arch_ops->tlb_flush(vcpu); |
449 | *spte &= ~(u64)PT_WRITABLE_MASK; | 459 | set_shadow_pte(spte, *spte & ~PT_WRITABLE_MASK); |
450 | } | 460 | } |
451 | } | 461 | } |
452 | 462 | ||
@@ -699,7 +709,7 @@ static void kvm_mmu_zap_page(struct kvm_vcpu *vcpu, | |||
699 | } | 709 | } |
700 | BUG_ON(!parent_pte); | 710 | BUG_ON(!parent_pte); |
701 | kvm_mmu_put_page(vcpu, page, parent_pte); | 711 | kvm_mmu_put_page(vcpu, page, parent_pte); |
702 | *parent_pte = 0; | 712 | set_shadow_pte(parent_pte, 0); |
703 | } | 713 | } |
704 | kvm_mmu_page_unlink_children(vcpu, page); | 714 | kvm_mmu_page_unlink_children(vcpu, page); |
705 | if (!page->root_count) { | 715 | if (!page->root_count) { |