Skip to content

Commit 5fc8567

Browse files
dtatuleamstsirkin
authored andcommitted
vdpa/mlx5: Extract mr members in own resource struct
Group all mapping related resources into their own structure. Upcoming patches will add more members in this new structure. Signed-off-by: Dragos Tatulea <[email protected]> Reviewed-by: Cosmin Ratiu <[email protected]> Acked-by: Eugenio Pérez <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 0b916a9 commit 5fc8567

File tree

4 files changed

+44
-41
lines changed

4 files changed

+44
-41
lines changed

drivers/vdpa/mlx5/core/mlx5_vdpa.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,18 @@ enum {
8383
MLX5_VDPA_NUM_AS = 2
8484
};
8585

86+
struct mlx5_vdpa_mr_resources {
87+
struct mlx5_vdpa_mr *mr[MLX5_VDPA_NUM_AS];
88+
unsigned int group2asid[MLX5_VDPA_NUMVQ_GROUPS];
89+
struct list_head mr_list_head;
90+
struct mutex mr_mtx;
91+
};
92+
8693
struct mlx5_vdpa_dev {
8794
struct vdpa_device vdev;
8895
struct mlx5_core_dev *mdev;
8996
struct mlx5_vdpa_resources res;
97+
struct mlx5_vdpa_mr_resources mres;
9098

9199
u64 mlx_features;
92100
u64 actual_features;
@@ -95,13 +103,8 @@ struct mlx5_vdpa_dev {
95103
u16 max_idx;
96104
u32 generation;
97105

98-
struct mlx5_vdpa_mr *mr[MLX5_VDPA_NUM_AS];
99-
struct list_head mr_list_head;
100-
/* serialize mr access */
101-
struct mutex mr_mtx;
102106
struct mlx5_control_vq cvq;
103107
struct workqueue_struct *wq;
104-
unsigned int group2asid[MLX5_VDPA_NUMVQ_GROUPS];
105108
bool suspended;
106109

107110
struct mlx5_async_ctx async_ctx;

drivers/vdpa/mlx5/core/mr.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -666,9 +666,9 @@ static void _mlx5_vdpa_put_mr(struct mlx5_vdpa_dev *mvdev,
666666
void mlx5_vdpa_put_mr(struct mlx5_vdpa_dev *mvdev,
667667
struct mlx5_vdpa_mr *mr)
668668
{
669-
mutex_lock(&mvdev->mr_mtx);
669+
mutex_lock(&mvdev->mres.mr_mtx);
670670
_mlx5_vdpa_put_mr(mvdev, mr);
671-
mutex_unlock(&mvdev->mr_mtx);
671+
mutex_unlock(&mvdev->mres.mr_mtx);
672672
}
673673

674674
static void _mlx5_vdpa_get_mr(struct mlx5_vdpa_dev *mvdev,
@@ -683,39 +683,39 @@ static void _mlx5_vdpa_get_mr(struct mlx5_vdpa_dev *mvdev,
683683
void mlx5_vdpa_get_mr(struct mlx5_vdpa_dev *mvdev,
684684
struct mlx5_vdpa_mr *mr)
685685
{
686-
mutex_lock(&mvdev->mr_mtx);
686+
mutex_lock(&mvdev->mres.mr_mtx);
687687
_mlx5_vdpa_get_mr(mvdev, mr);
688-
mutex_unlock(&mvdev->mr_mtx);
688+
mutex_unlock(&mvdev->mres.mr_mtx);
689689
}
690690

691691
void mlx5_vdpa_update_mr(struct mlx5_vdpa_dev *mvdev,
692692
struct mlx5_vdpa_mr *new_mr,
693693
unsigned int asid)
694694
{
695-
struct mlx5_vdpa_mr *old_mr = mvdev->mr[asid];
695+
struct mlx5_vdpa_mr *old_mr = mvdev->mres.mr[asid];
696696

697-
mutex_lock(&mvdev->mr_mtx);
697+
mutex_lock(&mvdev->mres.mr_mtx);
698698

699699
_mlx5_vdpa_put_mr(mvdev, old_mr);
700-
mvdev->mr[asid] = new_mr;
700+
mvdev->mres.mr[asid] = new_mr;
701701

702-
mutex_unlock(&mvdev->mr_mtx);
702+
mutex_unlock(&mvdev->mres.mr_mtx);
703703
}
704704

705705
static void mlx5_vdpa_show_mr_leaks(struct mlx5_vdpa_dev *mvdev)
706706
{
707707
struct mlx5_vdpa_mr *mr;
708708

709-
mutex_lock(&mvdev->mr_mtx);
709+
mutex_lock(&mvdev->mres.mr_mtx);
710710

711-
list_for_each_entry(mr, &mvdev->mr_list_head, mr_list) {
711+
list_for_each_entry(mr, &mvdev->mres.mr_list_head, mr_list) {
712712

713713
mlx5_vdpa_warn(mvdev, "mkey still alive after resource delete: "
714714
"mr: %p, mkey: 0x%x, refcount: %u\n",
715715
mr, mr->mkey, refcount_read(&mr->refcount));
716716
}
717717

718-
mutex_unlock(&mvdev->mr_mtx);
718+
mutex_unlock(&mvdev->mres.mr_mtx);
719719

720720
}
721721

@@ -756,7 +756,7 @@ static int _mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev,
756756
if (err)
757757
goto err_iotlb;
758758

759-
list_add_tail(&mr->mr_list, &mvdev->mr_list_head);
759+
list_add_tail(&mr->mr_list, &mvdev->mres.mr_list_head);
760760

761761
return 0;
762762

@@ -782,9 +782,9 @@ struct mlx5_vdpa_mr *mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev,
782782
if (!mr)
783783
return ERR_PTR(-ENOMEM);
784784

785-
mutex_lock(&mvdev->mr_mtx);
785+
mutex_lock(&mvdev->mres.mr_mtx);
786786
err = _mlx5_vdpa_create_mr(mvdev, mr, iotlb);
787-
mutex_unlock(&mvdev->mr_mtx);
787+
mutex_unlock(&mvdev->mres.mr_mtx);
788788

789789
if (err)
790790
goto out_err;
@@ -804,7 +804,7 @@ int mlx5_vdpa_update_cvq_iotlb(struct mlx5_vdpa_dev *mvdev,
804804
{
805805
int err;
806806

807-
if (mvdev->group2asid[MLX5_VDPA_CVQ_GROUP] != asid)
807+
if (mvdev->mres.group2asid[MLX5_VDPA_CVQ_GROUP] != asid)
808808
return 0;
809809

810810
spin_lock(&mvdev->cvq.iommu_lock);

drivers/vdpa/mlx5/core/resources.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev)
256256
mlx5_vdpa_warn(mvdev, "resources already allocated\n");
257257
return -EINVAL;
258258
}
259-
mutex_init(&mvdev->mr_mtx);
259+
mutex_init(&mvdev->mres.mr_mtx);
260260
res->uar = mlx5_get_uars_page(mdev);
261261
if (IS_ERR(res->uar)) {
262262
err = PTR_ERR(res->uar);
@@ -301,7 +301,7 @@ int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev)
301301
err_uctx:
302302
mlx5_put_uars_page(mdev, res->uar);
303303
err_uars:
304-
mutex_destroy(&mvdev->mr_mtx);
304+
mutex_destroy(&mvdev->mres.mr_mtx);
305305
return err;
306306
}
307307

@@ -318,7 +318,7 @@ void mlx5_vdpa_free_resources(struct mlx5_vdpa_dev *mvdev)
318318
dealloc_pd(mvdev, res->pdn, res->uid);
319319
destroy_uctx(mvdev, res->uid);
320320
mlx5_put_uars_page(mvdev->mdev, res->uar);
321-
mutex_destroy(&mvdev->mr_mtx);
321+
mutex_destroy(&mvdev->mres.mr_mtx);
322322
res->valid = false;
323323
}
324324

drivers/vdpa/mlx5/net/mlx5_vnet.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -941,23 +941,23 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev,
941941
MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr);
942942
MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
943943

944-
vq_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]];
944+
vq_mr = mvdev->mres.mr[mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_GROUP]];
945945
if (vq_mr)
946946
MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, vq_mr->mkey);
947947

948-
vq_desc_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]];
948+
vq_desc_mr = mvdev->mres.mr[mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]];
949949
if (vq_desc_mr &&
950950
MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, desc_group_mkey_supported))
951951
MLX5_SET(virtio_q, vq_ctx, desc_group_mkey, vq_desc_mr->mkey);
952952
} else {
953953
/* If there is no mr update, make sure that the existing ones are set
954954
* modify to ready.
955955
*/
956-
vq_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]];
956+
vq_mr = mvdev->mres.mr[mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_GROUP]];
957957
if (vq_mr)
958958
mvq->modified_fields |= MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_MKEY;
959959

960-
vq_desc_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]];
960+
vq_desc_mr = mvdev->mres.mr[mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]];
961961
if (vq_desc_mr)
962962
mvq->modified_fields |= MLX5_VIRTQ_MODIFY_MASK_DESC_GROUP_MKEY;
963963
}
@@ -1354,7 +1354,7 @@ static void fill_modify_virtqueue_cmd(struct mlx5_vdpa_net *ndev,
13541354
}
13551355

13561356
if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_MKEY) {
1357-
vq_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP]];
1357+
vq_mr = mvdev->mres.mr[mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_GROUP]];
13581358

13591359
if (vq_mr)
13601360
MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, vq_mr->mkey);
@@ -1363,7 +1363,7 @@ static void fill_modify_virtqueue_cmd(struct mlx5_vdpa_net *ndev,
13631363
}
13641364

13651365
if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_DESC_GROUP_MKEY) {
1366-
desc_mr = mvdev->mr[mvdev->group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]];
1366+
desc_mr = mvdev->mres.mr[mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP]];
13671367

13681368
if (desc_mr && MLX5_CAP_DEV_VDPA_EMULATION(mvdev->mdev, desc_group_mkey_supported))
13691369
MLX5_SET(virtio_q, vq_ctx, desc_group_mkey, desc_mr->mkey);
@@ -1381,17 +1381,17 @@ static void modify_virtqueue_end(struct mlx5_vdpa_net *ndev,
13811381
struct mlx5_vdpa_dev *mvdev = &ndev->mvdev;
13821382

13831383
if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_VIRTIO_Q_MKEY) {
1384-
unsigned int asid = mvdev->group2asid[MLX5_VDPA_DATAVQ_GROUP];
1385-
struct mlx5_vdpa_mr *vq_mr = mvdev->mr[asid];
1384+
unsigned int asid = mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_GROUP];
1385+
struct mlx5_vdpa_mr *vq_mr = mvdev->mres.mr[asid];
13861386

13871387
mlx5_vdpa_put_mr(mvdev, mvq->vq_mr);
13881388
mlx5_vdpa_get_mr(mvdev, vq_mr);
13891389
mvq->vq_mr = vq_mr;
13901390
}
13911391

13921392
if (mvq->modified_fields & MLX5_VIRTQ_MODIFY_MASK_DESC_GROUP_MKEY) {
1393-
unsigned int asid = mvdev->group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP];
1394-
struct mlx5_vdpa_mr *desc_mr = mvdev->mr[asid];
1393+
unsigned int asid = mvdev->mres.group2asid[MLX5_VDPA_DATAVQ_DESC_GROUP];
1394+
struct mlx5_vdpa_mr *desc_mr = mvdev->mres.mr[asid];
13951395

13961396
mlx5_vdpa_put_mr(mvdev, mvq->desc_mr);
13971397
mlx5_vdpa_get_mr(mvdev, desc_mr);
@@ -3235,7 +3235,7 @@ static void init_group_to_asid_map(struct mlx5_vdpa_dev *mvdev)
32353235

32363236
/* default mapping all groups are mapped to asid 0 */
32373237
for (i = 0; i < MLX5_VDPA_NUMVQ_GROUPS; i++)
3238-
mvdev->group2asid[i] = 0;
3238+
mvdev->mres.group2asid[i] = 0;
32393239
}
32403240

32413241
static bool needs_vqs_reset(const struct mlx5_vdpa_dev *mvdev)
@@ -3353,7 +3353,7 @@ static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb,
33533353
new_mr = NULL;
33543354
}
33553355

3356-
if (!mvdev->mr[asid]) {
3356+
if (!mvdev->mres.mr[asid]) {
33573357
mlx5_vdpa_update_mr(mvdev, new_mr, asid);
33583358
} else {
33593359
err = mlx5_vdpa_change_map(mvdev, new_mr, asid);
@@ -3637,12 +3637,12 @@ static int mlx5_set_group_asid(struct vdpa_device *vdev, u32 group,
36373637
if (group >= MLX5_VDPA_NUMVQ_GROUPS)
36383638
return -EINVAL;
36393639

3640-
mvdev->group2asid[group] = asid;
3640+
mvdev->mres.group2asid[group] = asid;
36413641

3642-
mutex_lock(&mvdev->mr_mtx);
3643-
if (group == MLX5_VDPA_CVQ_GROUP && mvdev->mr[asid])
3644-
err = mlx5_vdpa_update_cvq_iotlb(mvdev, mvdev->mr[asid]->iotlb, asid);
3645-
mutex_unlock(&mvdev->mr_mtx);
3642+
mutex_lock(&mvdev->mres.mr_mtx);
3643+
if (group == MLX5_VDPA_CVQ_GROUP && mvdev->mres.mr[asid])
3644+
err = mlx5_vdpa_update_cvq_iotlb(mvdev, mvdev->mres.mr[asid]->iotlb, asid);
3645+
mutex_unlock(&mvdev->mres.mr_mtx);
36463646

36473647
return err;
36483648
}
@@ -3962,7 +3962,7 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
39623962
if (err)
39633963
goto err_mpfs;
39643964

3965-
INIT_LIST_HEAD(&mvdev->mr_list_head);
3965+
INIT_LIST_HEAD(&mvdev->mres.mr_list_head);
39663966

39673967
if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
39683968
err = mlx5_vdpa_create_dma_mr(mvdev);

0 commit comments

Comments
 (0)