[PATCH vhost v4 07/16] vdpa/mlx5: Take cvq iotlb lock during refresh

From: Dragos Tatulea
Date: Wed Oct 18 2023 - 13:16:52 EST


The reslock is taken while refresh is called but iommu_lock is more
specific to this resource. So take the iommu_lock during cvq iotlb
refresh.

Based on Eugenio's patch [0].

[0] https://lore.kernel.org/lkml/20230112142218.725622-4-eperezma@xxxxxxxxxx/

Acked-by: Jason Wang <jasowang@xxxxxxxxxx>
Suggested-by: Eugenio Pérez <eperezma@xxxxxxxxxx>
Reviewed-by: Eugenio Pérez <eperezma@xxxxxxxxxx>
Signed-off-by: Dragos Tatulea <dtatulea@xxxxxxxxxx>
---
drivers/vdpa/mlx5/core/mr.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c
index fcb6ae32e9ed..587300e7c18e 100644
--- a/drivers/vdpa/mlx5/core/mr.c
+++ b/drivers/vdpa/mlx5/core/mr.c
@@ -590,11 +590,19 @@ int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev,
struct vhost_iotlb *iotlb,
unsigned int asid)
{
+ int err;
+
if (mvdev->group2asid[MLX5_VDPA_CVQ_GROUP] != asid)
return 0;

+ spin_lock(&mvdev->cvq.iommu_lock);
+
prune_iotlb(mvdev);
- return dup_iotlb(mvdev, iotlb);
+ err = dup_iotlb(mvdev, iotlb);
+
+ spin_unlock(&mvdev->cvq.iommu_lock);
+
+ return err;
}

int mlx5_vdpa_create_dma_mr(struct mlx5_vdpa_dev *mvdev)
--
2.41.0