Andrea Arcangeli wrote: > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index ea4764b..9349160 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -15,6 +15,7 @@ > #include <linux/sched.h> > #include <linux/mm.h> > #include <linux/preempt.h> > +#include <linux/mmu_notifier.h> > #include <asm/signal.h> > > #include <linux/kvm.h> > @@ -118,6 +119,7 @@ struct kvm { > struct kvm_io_bus pio_bus; > struct kvm_vm_stat stat; > struct kvm_arch arch; > + struct mmu_notifier mmu_notifier; > }; > > /* The guest did something we don't support. */ This should not be in struct kvm, it should go to x86's kvm_arch. This is x86 specific, we don't need a notifier since the core-vm will just page out our guest memory like regular userspace mem.
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 8fc12dc..bb4747c 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -165,6 +165,7 @@ static struct kvm *kvm_create_vm(void) > > kvm->mm = current->mm; > atomic_inc(&kvm->mm->mm_count); > + mmu_notifier_register(&kvm->mmu_notifier, kvm->mm); > spin_lock_init(&kvm->mmu_lock); > kvm_io_bus_init(&kvm->pio_bus); > mutex_init(&kvm->lock); to kvm_arch_create_vm please > @@ -1265,7 +1266,11 @@ static int kvm_resume(struct sys_device *dev) > } > > static struct sysdev_class kvm_sysdev_class = { > +#ifdef set_kset_name > set_kset_name("kvm"), > +#else > + .name = "kvm", > +#endif > .suspend = kvm_suspend, > .resume = kvm_resume, > }; > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 4295623..a67e38f 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -298,7 +299,15 @@ int __kvm_set_memory_region(struct kvm *kvm, > memset(new.rmap, 0, npages * sizeof(*new.rmap)); > > new.user_alloc = user_alloc; > - new.userspace_addr = mem->userspace_addr; > + /* > + * hva_to_rmmap() serialzies with the mmu_lock and to be > + * safe it has to ignore memslots with !user_alloc && > + * !userspace_addr. > + */ > + if (user_alloc) > + new.userspace_addr = mem->userspace_addr; > + else > + new.userspace_addr = 0; > } > > /* Allocate page dirty bitmap if needed */ > @@ -311,14 +320,18 @@ int __kvm_set_memory_region(struct kvm *kvm, > memset(new.dirty_bitmap, 0, dirty_bytes); > } > > + spin_lock(&kvm->mmu_lock); > if (mem->slot >= kvm->nmemslots) > kvm->nmemslots = mem->slot + 1; > > *memslot = new; > + spin_unlock(&kvm->mmu_lock); > > r = kvm_arch_set_memory_region(kvm, mem, old, user_alloc); > if (r) { > + spin_lock(&kvm->mmu_lock); > *memslot = old; > + spin_unlock(&kvm->mmu_lock); > goto out_free; > } > > > This needs to go to arch too. ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel