Skip to content

Commit 28ad5f6

Browse files
Leon Romanovskyjgunthorpe
authored andcommitted
RDMA: Move XRCD to be under ib_core responsibility
Update the code to allocate and free ib_xrcd structure in the ib_core instead of inside drivers. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 3b023e1 commit 28ad5f6

File tree

7 files changed

+49
-62
lines changed

7 files changed

+49
-62
lines changed

drivers/infiniband/core/device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2692,6 +2692,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
26922692
SET_OBJ_SIZE(dev_ops, ib_pd);
26932693
SET_OBJ_SIZE(dev_ops, ib_srq);
26942694
SET_OBJ_SIZE(dev_ops, ib_ucontext);
2695+
SET_OBJ_SIZE(dev_ops, ib_xrcd);
26952696
}
26962697
EXPORT_SYMBOL(ib_set_device_ops);
26972698

drivers/infiniband/core/verbs.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2293,20 +2293,28 @@ struct ib_xrcd *ib_alloc_xrcd_user(struct ib_device *device,
22932293
struct inode *inode, struct ib_udata *udata)
22942294
{
22952295
struct ib_xrcd *xrcd;
2296+
int ret;
22962297

22972298
if (!device->ops.alloc_xrcd)
22982299
return ERR_PTR(-EOPNOTSUPP);
22992300

2300-
xrcd = device->ops.alloc_xrcd(device, udata);
2301-
if (!IS_ERR(xrcd)) {
2302-
xrcd->device = device;
2303-
xrcd->inode = inode;
2304-
atomic_set(&xrcd->usecnt, 0);
2305-
init_rwsem(&xrcd->tgt_qps_rwsem);
2306-
xa_init(&xrcd->tgt_qps);
2307-
}
2301+
xrcd = rdma_zalloc_drv_obj(device, ib_xrcd);
2302+
if (!xrcd)
2303+
return ERR_PTR(-ENOMEM);
23082304

2305+
xrcd->device = device;
2306+
xrcd->inode = inode;
2307+
atomic_set(&xrcd->usecnt, 0);
2308+
init_rwsem(&xrcd->tgt_qps_rwsem);
2309+
xa_init(&xrcd->tgt_qps);
2310+
2311+
ret = device->ops.alloc_xrcd(xrcd, udata);
2312+
if (ret)
2313+
goto err;
23092314
return xrcd;
2315+
err:
2316+
kfree(xrcd);
2317+
return ERR_PTR(ret);
23102318
}
23112319
EXPORT_SYMBOL(ib_alloc_xrcd_user);
23122320

@@ -2321,7 +2329,9 @@ int ib_dealloc_xrcd_user(struct ib_xrcd *xrcd, struct ib_udata *udata)
23212329
return -EBUSY;
23222330

23232331
WARN_ON(!xa_empty(&xrcd->tgt_qps));
2324-
return xrcd->device->ops.dealloc_xrcd(xrcd, udata);
2332+
xrcd->device->ops.dealloc_xrcd(xrcd, udata);
2333+
kfree(xrcd);
2334+
return 0;
23252335
}
23262336
EXPORT_SYMBOL(ib_dealloc_xrcd_user);
23272337

drivers/infiniband/hw/mlx4/main.c

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,56 +1219,47 @@ static void mlx4_ib_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata)
12191219
mlx4_pd_free(to_mdev(pd->device)->dev, to_mpd(pd)->pdn);
12201220
}
12211221

1222-
static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev,
1223-
struct ib_udata *udata)
1222+
static int mlx4_ib_alloc_xrcd(struct ib_xrcd *ibxrcd, struct ib_udata *udata)
12241223
{
1225-
struct mlx4_ib_xrcd *xrcd;
1224+
struct mlx4_ib_dev *dev = to_mdev(ibxrcd->device);
1225+
struct mlx4_ib_xrcd *xrcd = to_mxrcd(ibxrcd);
12261226
struct ib_cq_init_attr cq_attr = {};
12271227
int err;
12281228

1229-
if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC))
1230-
return ERR_PTR(-ENOSYS);
1231-
1232-
xrcd = kmalloc(sizeof *xrcd, GFP_KERNEL);
1233-
if (!xrcd)
1234-
return ERR_PTR(-ENOMEM);
1229+
if (!(dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC))
1230+
return -EOPNOTSUPP;
12351231

1236-
err = mlx4_xrcd_alloc(to_mdev(ibdev)->dev, &xrcd->xrcdn);
1232+
err = mlx4_xrcd_alloc(dev->dev, &xrcd->xrcdn);
12371233
if (err)
1238-
goto err1;
1234+
return err;
12391235

1240-
xrcd->pd = ib_alloc_pd(ibdev, 0);
1236+
xrcd->pd = ib_alloc_pd(ibxrcd->device, 0);
12411237
if (IS_ERR(xrcd->pd)) {
12421238
err = PTR_ERR(xrcd->pd);
12431239
goto err2;
12441240
}
12451241

12461242
cq_attr.cqe = 1;
1247-
xrcd->cq = ib_create_cq(ibdev, NULL, NULL, xrcd, &cq_attr);
1243+
xrcd->cq = ib_create_cq(ibxrcd->device, NULL, NULL, xrcd, &cq_attr);
12481244
if (IS_ERR(xrcd->cq)) {
12491245
err = PTR_ERR(xrcd->cq);
12501246
goto err3;
12511247
}
12521248

1253-
return &xrcd->ibxrcd;
1249+
return 0;
12541250

12551251
err3:
12561252
ib_dealloc_pd(xrcd->pd);
12571253
err2:
1258-
mlx4_xrcd_free(to_mdev(ibdev)->dev, xrcd->xrcdn);
1259-
err1:
1260-
kfree(xrcd);
1261-
return ERR_PTR(err);
1254+
mlx4_xrcd_free(dev->dev, xrcd->xrcdn);
1255+
return err;
12621256
}
12631257

1264-
static int mlx4_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata)
1258+
static void mlx4_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata)
12651259
{
12661260
ib_destroy_cq(to_mxrcd(xrcd)->cq);
12671261
ib_dealloc_pd(to_mxrcd(xrcd)->pd);
12681262
mlx4_xrcd_free(to_mdev(xrcd->device)->dev, to_mxrcd(xrcd)->xrcdn);
1269-
kfree(xrcd);
1270-
1271-
return 0;
12721263
}
12731264

12741265
static int add_gid_entry(struct ib_qp *ibqp, union ib_gid *gid)
@@ -2607,6 +2598,8 @@ static const struct ib_device_ops mlx4_ib_dev_mw_ops = {
26072598
static const struct ib_device_ops mlx4_ib_dev_xrc_ops = {
26082599
.alloc_xrcd = mlx4_ib_alloc_xrcd,
26092600
.dealloc_xrcd = mlx4_ib_dealloc_xrcd,
2601+
2602+
INIT_RDMA_OBJ_SIZE(ib_xrcd, mlx4_ib_xrcd, ibxrcd),
26102603
};
26112604

26122605
static const struct ib_device_ops mlx4_ib_dev_fs_ops = {

drivers/infiniband/hw/mlx5/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6671,6 +6671,8 @@ static const struct ib_device_ops mlx5_ib_dev_mw_ops = {
66716671
static const struct ib_device_ops mlx5_ib_dev_xrc_ops = {
66726672
.alloc_xrcd = mlx5_ib_alloc_xrcd,
66736673
.dealloc_xrcd = mlx5_ib_dealloc_xrcd,
6674+
6675+
INIT_RDMA_OBJ_SIZE(ib_xrcd, mlx5_ib_xrcd, ibxrcd),
66746676
};
66756677

66766678
static const struct ib_device_ops mlx5_ib_dev_dm_ops = {

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,9 +1224,8 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
12241224
const struct ib_wc *in_wc, const struct ib_grh *in_grh,
12251225
const struct ib_mad *in, struct ib_mad *out,
12261226
size_t *out_mad_size, u16 *out_mad_pkey_index);
1227-
struct ib_xrcd *mlx5_ib_alloc_xrcd(struct ib_device *ibdev,
1228-
struct ib_udata *udata);
1229-
int mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata);
1227+
int mlx5_ib_alloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata);
1228+
void mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata);
12301229
int mlx5_ib_get_buf_offset(u64 addr, int page_shift, u32 *offset);
12311230
int mlx5_query_ext_port_caps(struct mlx5_ib_dev *dev, u8 port);
12321231
int mlx5_query_mad_ifc_smp_attr_node_info(struct ib_device *ibdev,

drivers/infiniband/hw/mlx5/qp.c

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4700,41 +4700,23 @@ int mlx5_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
47004700
return err;
47014701
}
47024702

4703-
struct ib_xrcd *mlx5_ib_alloc_xrcd(struct ib_device *ibdev,
4704-
struct ib_udata *udata)
4703+
int mlx5_ib_alloc_xrcd(struct ib_xrcd *ibxrcd, struct ib_udata *udata)
47054704
{
4706-
struct mlx5_ib_dev *dev = to_mdev(ibdev);
4707-
struct mlx5_ib_xrcd *xrcd;
4708-
int err;
4705+
struct mlx5_ib_dev *dev = to_mdev(ibxrcd->device);
4706+
struct mlx5_ib_xrcd *xrcd = to_mxrcd(ibxrcd);
47094707

47104708
if (!MLX5_CAP_GEN(dev->mdev, xrc))
4711-
return ERR_PTR(-ENOSYS);
4712-
4713-
xrcd = kmalloc(sizeof(*xrcd), GFP_KERNEL);
4714-
if (!xrcd)
4715-
return ERR_PTR(-ENOMEM);
4716-
4717-
err = mlx5_cmd_xrcd_alloc(dev->mdev, &xrcd->xrcdn, 0);
4718-
if (err) {
4719-
kfree(xrcd);
4720-
return ERR_PTR(-ENOMEM);
4721-
}
4709+
return -EOPNOTSUPP;
47224710

4723-
return &xrcd->ibxrcd;
4711+
return mlx5_cmd_xrcd_alloc(dev->mdev, &xrcd->xrcdn, 0);
47244712
}
47254713

4726-
int mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata)
4714+
void mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata)
47274715
{
47284716
struct mlx5_ib_dev *dev = to_mdev(xrcd->device);
47294717
u32 xrcdn = to_mxrcd(xrcd)->xrcdn;
4730-
int err;
47314718

4732-
err = mlx5_cmd_xrcd_dealloc(dev->mdev, xrcdn, 0);
4733-
if (err)
4734-
mlx5_ib_warn(dev, "failed to dealloc xrcdn 0x%x\n", xrcdn);
4735-
4736-
kfree(xrcd);
4737-
return 0;
4719+
mlx5_cmd_xrcd_dealloc(dev->mdev, xrcdn, 0);
47384720
}
47394721

47404722
static void mlx5_ib_wq_event(struct mlx5_core_qp *core_qp, int type)

include/rdma/ib_verbs.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2494,9 +2494,8 @@ struct ib_device_ops {
24942494
int (*dealloc_mw)(struct ib_mw *mw);
24952495
int (*attach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
24962496
int (*detach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
2497-
struct ib_xrcd *(*alloc_xrcd)(struct ib_device *device,
2498-
struct ib_udata *udata);
2499-
int (*dealloc_xrcd)(struct ib_xrcd *xrcd, struct ib_udata *udata);
2497+
int (*alloc_xrcd)(struct ib_xrcd *xrcd, struct ib_udata *udata);
2498+
void (*dealloc_xrcd)(struct ib_xrcd *xrcd, struct ib_udata *udata);
25002499
struct ib_flow *(*create_flow)(struct ib_qp *qp,
25012500
struct ib_flow_attr *flow_attr,
25022501
int domain, struct ib_udata *udata);
@@ -2655,6 +2654,7 @@ struct ib_device_ops {
26552654
DECLARE_RDMA_OBJ_SIZE(ib_pd);
26562655
DECLARE_RDMA_OBJ_SIZE(ib_srq);
26572656
DECLARE_RDMA_OBJ_SIZE(ib_ucontext);
2657+
DECLARE_RDMA_OBJ_SIZE(ib_xrcd);
26582658
};
26592659

26602660
struct ib_core_device {

0 commit comments

Comments
 (0)