• Oliver Upton's avatar
    KVM: arm64: Tear down unlinked stage-2 subtree after break-before-make · 5c359cca
    Oliver Upton authored
    The break-before-make sequence is a bit annoying as it opens a window
    wherein memory is unmapped from the guest. KVM should replace the PTE
    as quickly as possible and avoid unnecessary work in between.
    
    Presently, the stage-2 map walker tears down a removed table before
    installing a block mapping when coalescing a table into a block. As the
    removed table is no longer visible to hardware walkers after the
    DSB+TLBI, it is possible to move the remaining cleanup to happen after
    installing the new PTE.
    
    Reshuffle the stage-2 map walker to install the new block entry in
    the pre-order callback. Unwire all of the teardown logic and replace
    it with a call to kvm_pgtable_stage2_free_removed() after fixing
    the PTE. The post-order visitor is now completely unnecessary, so drop
    it. Finally, touch up the comments to better represent the now
    simplified map walker.
    
    Note that the call to tear down the unlinked stage-2 is indirected
    as a subsequent change will use an RCU callback to trigger tear down.
    RCU is not available to pKVM, so there is a need to use different
    implementations on pKVM and non-pKVM VMs.
    Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
    Reviewed-by: default avatarBen Gardon <bgardon@google.com>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221107215644.1895162-8-oliver.upton@linux.dev
    5c359cca
mem_protect.c 17.6 KB