• Paolo Bonzini's avatar
    KVM: guest_memfd: move check for already-populated page to common code · de802524
    Paolo Bonzini authored
    Do not allow populating the same page twice with startup data.  In the
    case of SEV-SNP, for example, the firmware does not allow it anyway,
    since the launch-update operation is only possible on pages that are
    still shared in the RMP.
    
    Even if it worked, kvm_gmem_populate()'s callback is meant to have side
    effects such as updating launch measurements, and updating the same
    page twice is unlikely to have the desired results.
    
    Races between calls to the ioctl are not possible because
    kvm_gmem_populate() holds slots_lock and the VM should not be running.
    But again, even if this worked on other confidential computing technology,
    it doesn't matter to guest_memfd.c whether this is something fishy
    such as missing synchronization in userspace, or rather something
    intentional.  One of the racers wins, and the page is initialized by
    either kvm_gmem_prepare_folio() or kvm_gmem_populate().
    
    Anyway, out of paranoia, adjust sev_gmem_post_populate() anyway to use
    the same errno that kvm_gmem_populate() is using.
    Reviewed-by: default avatarMichael Roth <michael.roth@amd.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    de802524
sev.c 132 KB