On 6/28/21 2:22 PM, Jason Gunthorpe wrote:
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)
{
+ 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);
}
Doesn't a flow exit the function with matrix_dev->lock held he
Yes, you are correct. Stupid mistake.
How can that happen? What flow?
When the if isn't taken
Write it with 'success oriented flow'
I'm not sure what you mean, can you clarify this statement?
Basically, don't write the bulk of the function under an if statement
mutex_lock(&matrix_dev->lock);
if (!matrix_mdev->kvm || !matrix_mdev->kvm->arch.crypto.crycbd) {
mutex_unlock(&matrix_dev->lock);
return;
}
Sure.
Jason