• Tony Krowiak's avatar
    s390/vfio-ap: fix circular lockdep when setting/clearing crypto masks · 0cc00c8d
    Tony Krowiak authored
    This patch fixes a lockdep splat introduced by commit f21916ec
    ("s390/vfio-ap: clean up vfio_ap resources when KVM pointer invalidated").
    The lockdep splat only occurs when starting a Secure Execution guest.
    Crypto virtualization (vfio_ap) is not yet supported for SE guests;
    however, in order to avoid this problem when support becomes available,
    this fix is being provided.
    
    The circular locking dependency was introduced when the setting of the
    masks in the guest's APCB was executed while holding the matrix_dev->lock.
    While the lock is definitely needed to protect the setting/unsetting of the
    matrix_mdev->kvm pointer, it is not necessarily critical for setting the
    masks; so, the matrix_dev->lock will be released while the masks are being
    set or cleared.
    
    Keep in mind, however, that another process that takes the matrix_dev->lock
    can get control while the masks in the guest's APCB are being set or
    cleared as a result of the driver being notified that the KVM pointer
    has been set or unset. This could result in invalid access to the
    matrix_mdev->kvm pointer by the intervening process. To avoid this
    scenario, two new fields are being added to the ap_matrix_mdev struct:
    
    struct ap_matrix_mdev {
    	...
    	bool kvm_busy;
    	wait_queue_head_t wait_for_kvm;
       ...
    };
    
    The functions that handle notification that the KVM pointer value has
    been set or cleared will set the kvm_busy flag to true until they are done
    processing at which time they will set it to false and wake up the tasks on
    the matrix_mdev->wait_for_kvm wait queue. Functions that require
    access to matrix_mdev->kvm will sleep on the wait queue until they are
    awakened at which time they can safely access the matrix_mdev->kvm
    field.
    
    Fixes: f21916ec ("s390/vfio-ap: clean up vfio_ap resources when KVM pointer invalidated")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarTony Krowiak <akrowiak@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    0cc00c8d
vfio_ap_ops.c 37.8 KB