mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 14:36:46 +07:00
KVM: Prevent internal slots from being COWed
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>
This commit is contained in:
parent
e36d96f7cf
commit
7ac77099ce
@ -5491,6 +5491,11 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
|
|||||||
int user_alloc)
|
int user_alloc)
|
||||||
{
|
{
|
||||||
int npages = memslot->npages;
|
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,
|
/*To keep backward compatibility with older userspace,
|
||||||
*x86 needs to hanlde !user_alloc case.
|
*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,
|
userspace_addr = do_mmap(NULL, 0,
|
||||||
npages * PAGE_SIZE,
|
npages * PAGE_SIZE,
|
||||||
PROT_READ | PROT_WRITE,
|
PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS,
|
map_flags,
|
||||||
0);
|
0);
|
||||||
up_write(¤t->mm->mmap_sem);
|
up_write(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user