diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kvm/x86.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 7ef44107a14a..68be38e233f5 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -5491,6 +5491,11 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, | |||
5491 | int user_alloc) | 5491 | int user_alloc) |
5492 | { | 5492 | { |
5493 | int npages = memslot->npages; | 5493 | int npages = memslot->npages; |
5494 | int map_flags = MAP_PRIVATE | MAP_ANONYMOUS; | ||
5495 | |||
5496 | /* Prevent internal slot pages from being moved by fork()/COW. */ | ||
5497 | if (memslot->id >= KVM_MEMORY_SLOTS) | ||
5498 | map_flags = MAP_SHARED | MAP_ANONYMOUS; | ||
5494 | 5499 | ||
5495 | /*To keep backward compatibility with older userspace, | 5500 | /*To keep backward compatibility with older userspace, |
5496 | *x86 needs to hanlde !user_alloc case. | 5501 | *x86 needs to hanlde !user_alloc case. |
@@ -5503,7 +5508,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, | |||
5503 | userspace_addr = do_mmap(NULL, 0, | 5508 | userspace_addr = do_mmap(NULL, 0, |
5504 | npages * PAGE_SIZE, | 5509 | npages * PAGE_SIZE, |
5505 | PROT_READ | PROT_WRITE, | 5510 | PROT_READ | PROT_WRITE, |
5506 | MAP_PRIVATE | MAP_ANONYMOUS, | 5511 | map_flags, |
5507 | 0); | 5512 | 0); |
5508 | up_write(¤t->mm->mmap_sem); | 5513 | up_write(¤t->mm->mmap_sem); |
5509 | 5514 | ||