On Mon, Jun 28, 2021 at 02:20:55PM -0400, Tony Krowiak wrote:
On 6/28/21 1:34 PM, Jason Gunthorpe wrote:
On Fri, Jun 25, 2021 at 06:07:58PM -0400, Tony Krowiak wrote:
static void vfio_ap_mdev_unset_kvm(struct ap_matrix_mdev *matrix_mdev)Doesn't a flow exit the function with matrix_dev->lock held he
{
+ mutex_lock(&matrix_dev->lock);
+ if ((matrix_mdev->kvm) && (matrix_mdev->kvm->arch.crypto.crycbd)) {
mutex_unlock(&matrix_dev->lock);
+ down_write(&matrix_mdev->kvm->arch.crypto.pqap_hook_rwsem);
+ matrix_mdev->kvm->arch.crypto.pqap_hook = NULL;
+ up_write(&matrix_mdev->kvm->arch.crypto.pqap_hook_rwsem);
+ kvm_arch_crypto_clear_masks(matrix_mdev->kvm);
mutex_lock(&matrix_dev->lock);
vfio_ap_mdev_reset_queues(matrix_mdev->mdev);
kvm_put_kvm(matrix_mdev->kvm);
matrix_mdev->kvm = NULL;
+ mutex_unlock(&matrix_dev->lock);
}
How can that happen? What flow?When the if isn't taken
Basically, don't write the bulk of the function under an if statementWrite it with 'success oriented flow'I'm not sure what you mean, can you clarify this statement?
mutex_lock(&matrix_dev->lock);
if (!matrix_mdev->kvm || !matrix_mdev->kvm->arch.crypto.crycbd) {
mutex_unlock(&matrix_dev->lock);
return;
}
Jason