• Peter Gonda's avatar
    KVM: selftests: Add ucall pool based implementation · 426729b2
    Peter Gonda authored
    To play nice with guests whose stack memory is encrypted, e.g. AMD SEV,
    introduce a new "ucall pool" implementation that passes the ucall struct
    via dedicated memory (which can be mapped shared, a.k.a. as plain text).
    
    Because not all architectures have access to the vCPU index in the guest,
    use a bitmap with atomic accesses to track which entries in the pool are
    free/used.  A list+lock could also work in theory, but synchronizing the
    individual pointers to the guest would be a mess.
    
    Note, there's no need to rewalk the bitmap to ensure success.  If all
    vCPUs are simply allocating, success is guaranteed because there are
    enough entries for all vCPUs.  If one or more vCPUs are freeing and then
    reallocating, success is guaranteed because vCPUs _always_ walk the
    bitmap from 0=>N; if vCPU frees an entry and then wins a race to
    re-allocate, then either it will consume the entry it just freed (bit is
    the first free bit), or the losing vCPU is guaranteed to see the freed
    bit (winner consumes an earlier bit, which the loser hasn't yet visited).
    Reviewed-by: default avatarAndrew Jones <andrew.jones@linux.dev>
    Signed-off-by: default avatarPeter Gonda <pgonda@google.com>
    Co-developed-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Link: https://lore.kernel.org/r/20221006003409.649993-8-seanjc@google.com
    426729b2
ucall.c 1.72 KB