vdpa/mlx5: Take cvq iotlb lock during refresh
authorDragos Tatulea <dtatulea@nvidia.com>
Wed, 18 Oct 2023 17:14:46 +0000 (20:14 +0300)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 1 Nov 2023 13:19:56 +0000 (09:19 -0400)
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@redhat.com/

Acked-by: Jason Wang <jasowang@redhat.com>
Suggested-by: Eugenio Pérez <eperezma@redhat.com>
Reviewed-by: Eugenio Pérez <eperezma@redhat.com>
Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Message-Id: <20231018171456.1624030-9-dtatulea@nvidia.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Si-Wei Liu <si-wei.liu@oracle.com>
Tested-by: Si-Wei Liu <si-wei.liu@oracle.com>
Tested-by: Lei Yang <leiyang@redhat.com>
drivers/vdpa/mlx5/core/mr.c

index fcb6ae3..587300e 100644 (file)
@@ -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)