|
@@ -5491,6 +5491,11 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
|
|
|
int user_alloc)
|
|
|
{
|
|
|
int npages = memslot->npages;
|
|
|
+ int map_flags = MAP_PRIVATE | MAP_ANONYMOUS;
|
|
|
+
|
|
|
+ /* Prevent internal slot pages from being moved by fork()/COW. */
|
|
|
+ if (memslot->id >= KVM_MEMORY_SLOTS)
|
|
|
+ map_flags = MAP_SHARED | MAP_ANONYMOUS;
|
|
|
|
|
|
/*To keep backward compatibility with older userspace,
|
|
|
*x86 needs to hanlde !user_alloc case.
|
|
@@ -5503,7 +5508,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
|
|
|
userspace_addr = do_mmap(NULL, 0,
|
|
|
npages * PAGE_SIZE,
|
|
|
PROT_READ | PROT_WRITE,
|
|
|
- MAP_PRIVATE | MAP_ANONYMOUS,
|
|
|
+ map_flags,
|
|
|
0);
|
|
|
up_write(¤t->mm->mmap_sem);
|
|
|
|