• Sean Christopherson's avatar
    KVM: Dynamically allocate "new" memslots from the get-go · 244893fa
    Sean Christopherson authored
    Allocate the "new" memslot for !DELETE memslot updates straight away
    instead of filling an intermediate on-stack object and forcing
    kvm_set_memslot() to juggle the allocation and do weird things like reuse
    the old memslot object in MOVE.
    
    In the MOVE case, this results in an "extra" memslot allocation due to
    allocating both the "new" slot and the "invalid" slot, but that's a
    temporary and not-huge allocation, and MOVE is a relatively rare memslot
    operation.
    
    Regarding MOVE, drop the open-coded management of the gfn tree with a
    call to kvm_replace_memslot(), which already handles the case where
    new->base_gfn != old->base_gfn.  This is made possible by virtue of not
    having to copy the "new" memslot data after erasing the old memslot from
    the gfn tree.  Using kvm_replace_memslot(), and more specifically not
    reusing the old memslot, means the MOVE case now does hva tree and hash
    list updates, but that's a small price to pay for simplifying the code
    and making MOVE align with all the other flavors of updates.  The "extra"
    updates are firmly in the noise from a performance perspective, e.g. the
    "move (in)active area" selfttests show a (very, very) slight improvement.
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Reviewed-by: default avatarMaciej S. Szmigiero <maciej.szmigiero@oracle.com>
    Signed-off-by: default avatarMaciej S. Szmigiero <maciej.szmigiero@oracle.com>
    Message-Id: <f0d8c72727aa825cf682bd4e3da4b3fa68215dd4.1638817641.git.maciej.szmigiero@oracle.com>
    244893fa
kvm_main.c 142 KB