• Vishal Annapurve's avatar
    KVM: selftests: Add x86-only selftest for private memory conversions · 43f623f3
    Vishal Annapurve authored
    Add a selftest to exercise implicit/explicit conversion functionality
    within KVM and verify:
    
     - Shared memory is visible to host userspace
     - Private memory is not visible to host userspace
     - Host userspace and guest can communicate over shared memory
     - Data in shared backing is preserved across conversions (test's
       host userspace doesn't free the data)
     - Private memory is bound to the lifetime of the VM
    
    Ideally, KVM's selftests infrastructure would be reworked to allow backing
    a single region of guest memory with multiple memslots for _all_ backing
    types and shapes, i.e. ideally the code for using a single backing fd
    across multiple memslots would work for "regular" memory as well.  But
    sadly, support for KVM_CREATE_GUEST_MEMFD has languished for far too long,
    and overhauling selftests' memslots infrastructure would likely open a can
    of worms, i.e. delay things even further.
    
    In addition to the more obvious tests, verify that PUNCH_HOLE actually
    frees memory.  Directly verifying that KVM frees memory is impractical, if
    it's even possible, so instead indirectly verify memory is freed by
    asserting that the guest reads zeroes after a PUNCH_HOLE.  E.g. if KVM
    zaps SPTEs but doesn't actually punch a hole in the inode, the subsequent
    read will still see the previous value.  And obviously punching a hole
    shouldn't cause explosions.
    
    Let the user specify the number of memslots in the private mem conversion
    test, i.e. don't require the number of memslots to be '1' or "nr_vcpus".
    Creating more memslots than vCPUs is particularly interesting, e.g. it can
    result in a single KVM_SET_MEMORY_ATTRIBUTES spanning multiple memslots.
    To keep the math reasonable, align each vCPU's chunk to at least 2MiB (the
    size is 2MiB+4KiB), and require the total size to be cleanly divisible by
    the number of memslots.  The goal is to be able to validate that KVM plays
    nice with multiple memslots, being able to create a truly arbitrary number
    of memslots doesn't add meaningful value, i.e. isn't worth the cost.
    
    Intentionally don't take a requirement on KVM_CAP_GUEST_MEMFD,
    KVM_CAP_MEMORY_FAULT_INFO, KVM_MEMORY_ATTRIBUTE_PRIVATE, etc., as it's a
    KVM bug to advertise KVM_X86_SW_PROTECTED_VM without its prerequisites.
    Signed-off-by: default avatarVishal Annapurve <vannapurve@google.com>
    Co-developed-by: default avatarAckerley Tng <ackerleytng@google.com>
    Signed-off-by: default avatarAckerley Tng <ackerleytng@google.com>
    Co-developed-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20231027182217.3615211-32-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    43f623f3
Makefile 11.7 KB