• Claudio Imbrenda's avatar
    KVM: s390x: fix SCK locking · c0573ba5
    Claudio Imbrenda authored
    When handling the SCK instruction, the kvm lock is taken, even though
    the vcpu lock is already being held. The normal locking order is kvm
    lock first and then vcpu lock. This is can (and in some circumstances
    does) lead to deadlocks.
    
    The function kvm_s390_set_tod_clock is called both by the SCK handler
    and by some IOCTLs to set the clock. The IOCTLs will not hold the vcpu
    lock, so they can safely take the kvm lock. The SCK handler holds the
    vcpu lock, but will also somehow need to acquire the kvm lock without
    relinquishing the vcpu lock.
    
    The solution is to factor out the code to set the clock, and provide
    two wrappers. One is called like the original function and does the
    locking, the other is called kvm_s390_try_set_tod_clock and uses
    trylock to try to acquire the kvm lock. This new wrapper is then used
    in the SCK handler. If locking fails, -EAGAIN is returned, which is
    eventually propagated to userspace, thus also freeing the vcpu lock and
    allowing for forward progress.
    
    This is not the most efficient or elegant way to solve this issue, but
    the SCK instruction is deprecated and its performance is not critical.
    
    The goal of this patch is just to provide a simple but correct way to
    fix the bug.
    
    Fixes: 6a3f95a6 ("KVM: s390: Intercept SCK instruction")
    Signed-off-by: default avatarClaudio Imbrenda <imbrenda@linux.ibm.com>
    Reviewed-by: default avatarChristian Borntraeger <borntraeger@linux.ibm.com>
    Reviewed-by: default avatarJanis Schoetterl-Glausch <scgl@linux.ibm.com>
    Link: https://lore.kernel.org/r/20220301143340.111129-1-imbrenda@linux.ibm.com
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarChristian Borntraeger <borntraeger@linux.ibm.com>
    c0573ba5
kvm-s390.c 143 KB