• Oliver Upton's avatar
    KVM: arm64: Avoid vcpu->mutex v. kvm->lock inversion in CPU_ON · 0acc7239
    Oliver Upton authored
    KVM/arm64 had the lock ordering backwards on vcpu->mutex and kvm->lock
    from the very beginning. One such example is the way vCPU resets are
    handled: the kvm->lock is acquired while handling a guest CPU_ON PSCI
    call.
    
    Add a dedicated lock to serialize writes to kvm_vcpu_arch::{mp_state,
    reset_state}. Promote all accessors of mp_state to {READ,WRITE}_ONCE()
    as readers do not acquire the mp_state_lock. While at it, plug yet
    another race by taking the mp_state_lock in the KVM_SET_MP_STATE ioctl
    handler.
    
    As changes to MP state are now guarded with a dedicated lock, drop the
    kvm->lock acquisition from the PSCI CPU_ON path. Similarly, move the
    reader of reset_state outside of the kvm->lock and instead protect it
    with the mp_state_lock. Note that writes to reset_state::reset have been
    demoted to regular stores as both readers and writers acquire the
    mp_state_lock.
    
    While the kvm->lock inversion still exists in kvm_reset_vcpu(), at least
    now PSCI CPU_ON no longer depends on it for serializing vCPU reset.
    
    Cc: stable@vger.kernel.org
    Tested-by: default avatarJeremy Linton <jeremy.linton@arm.com>
    Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230327164747.2466958-2-oliver.upton@linux.dev
    0acc7239
arm.c 55.5 KB