From 7f586f7b615d9e13d5f62a73778f4c54c50dfa56 Mon Sep 17 00:00:00 2001 From: Glauber Costa <glommer@redhat.com> Date: Wed, 23 Jun 2010 13:51:13 -0300 Subject: [PATCH 2/2] KVM: Prevent internal slots from being COWed RH-Author: Glauber Costa <glommer@redhat.com> Message-id: <patch-10116-clone-for-rhel5-rhel56> Patchwork-id: 10141 O-Subject: [RHEL5.6/z patch 2/2] KVM: Prevent internal slots from being COWed Bugzilla: 606953 RH-Acked-by: Avi Kivity <avi@redhat.com> RH-Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> RH-Acked-by: Gleb Natapov <gleb@redhat.com> RH-Bugzilla: 606953 RH-Upstream-status: kvm/master If a process with a memory slot is COWed, the page will change its address (despite having an elevated reference count). This breaks internal memory slots which have their physical addresses loaded into vmcs registers (see the APIC access memory slot). Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Glauber Costa <glommer@redhat.com> --- arch/x86/kvm/x86.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- 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 363141c..9a613cb 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4700,6 +4700,11 @@ int kvm_arch_set_memory_region(struct kvm *kvm, { int npages = mem->memory_size >> PAGE_SHIFT; struct kvm_memory_slot *memslot = &kvm->memslots[mem->slot]; + 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. @@ -4712,7 +4717,7 @@ int kvm_arch_set_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); -- 1.7.0.3