Commit 21aad80b authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jason Gunthorpe

RDMA/mlx5: Globally parse DEVX UID

Remove duplication in parsing of DEVX UID.

Link: https://lore.kernel.org/r/20200427154636.381474-27-leon@kernel.orgReviewed-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 0ce300b1
...@@ -1916,18 +1916,16 @@ static int get_atomic_mode(struct mlx5_ib_dev *dev, ...@@ -1916,18 +1916,16 @@ static int get_atomic_mode(struct mlx5_ib_dev *dev,
static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
struct ib_qp_init_attr *init_attr, struct ib_qp_init_attr *init_attr,
struct mlx5_ib_create_qp *ucmd, struct mlx5_ib_create_qp *ucmd,
struct ib_udata *udata, struct mlx5_ib_qp *qp) struct ib_udata *udata, struct mlx5_ib_qp *qp,
u32 uidx)
{ {
struct mlx5_ib_resources *devr = &dev->devr; struct mlx5_ib_resources *devr = &dev->devr;
int inlen = MLX5_ST_SZ_BYTES(create_qp_in); int inlen = MLX5_ST_SZ_BYTES(create_qp_in);
struct mlx5_core_dev *mdev = dev->mdev; struct mlx5_core_dev *mdev = dev->mdev;
struct mlx5_ib_create_qp_resp resp = {}; struct mlx5_ib_create_qp_resp resp = {};
struct mlx5_ib_ucontext *ucontext = rdma_udata_to_drv_context(
udata, struct mlx5_ib_ucontext, ibucontext);
struct mlx5_ib_cq *send_cq; struct mlx5_ib_cq *send_cq;
struct mlx5_ib_cq *recv_cq; struct mlx5_ib_cq *recv_cq;
unsigned long flags; unsigned long flags;
u32 uidx = MLX5_IB_DEFAULT_UIDX;
struct mlx5_ib_qp_base *base; struct mlx5_ib_qp_base *base;
int mlx5_st; int mlx5_st;
void *qpc; void *qpc;
...@@ -1945,12 +1943,6 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, ...@@ -1945,12 +1943,6 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR)
qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE; qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE;
if (udata) {
err = get_qp_user_index(ucontext, ucmd, udata->inlen, &uidx);
if (err)
return err;
}
if (qp->flags & IB_QP_CREATE_SOURCE_QPN) if (qp->flags & IB_QP_CREATE_SOURCE_QPN)
qp->underlay_qpn = init_attr->source_qpn; qp->underlay_qpn = init_attr->source_qpn;
...@@ -2329,18 +2321,10 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, ...@@ -2329,18 +2321,10 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
static int create_dct(struct ib_pd *pd, struct mlx5_ib_qp *qp, static int create_dct(struct ib_pd *pd, struct mlx5_ib_qp *qp,
struct ib_qp_init_attr *attr, struct ib_qp_init_attr *attr,
struct mlx5_ib_create_qp *ucmd, struct ib_udata *udata) struct mlx5_ib_create_qp *ucmd, u32 uidx)
{ {
struct mlx5_ib_ucontext *ucontext = rdma_udata_to_drv_context(
udata, struct mlx5_ib_ucontext, ibucontext);
int err = 0;
u32 uidx = MLX5_IB_DEFAULT_UIDX;
void *dctc; void *dctc;
err = get_qp_user_index(ucontext, ucmd, sizeof(*ucmd), &uidx);
if (err)
return err;
qp->dct.in = kzalloc(MLX5_ST_SZ_BYTES(create_dct_in), GFP_KERNEL); qp->dct.in = kzalloc(MLX5_ST_SZ_BYTES(create_dct_in), GFP_KERNEL);
if (!qp->dct.in) if (!qp->dct.in)
return -ENOMEM; return -ENOMEM;
...@@ -2651,14 +2635,14 @@ static size_t process_udata_size(struct ib_qp_init_attr *attr, ...@@ -2651,14 +2635,14 @@ static size_t process_udata_size(struct ib_qp_init_attr *attr,
static int create_raw_qp(struct ib_pd *pd, struct mlx5_ib_qp *qp, static int create_raw_qp(struct ib_pd *pd, struct mlx5_ib_qp *qp,
struct ib_qp_init_attr *attr, void *ucmd, struct ib_qp_init_attr *attr, void *ucmd,
struct ib_udata *udata) struct ib_udata *udata, u32 uidx)
{ {
struct mlx5_ib_dev *dev = to_mdev(pd->device); struct mlx5_ib_dev *dev = to_mdev(pd->device);
if (attr->rwq_ind_tbl) if (attr->rwq_ind_tbl)
return create_rss_raw_qp_tir(pd, qp, attr, ucmd, udata); return create_rss_raw_qp_tir(pd, qp, attr, ucmd, udata);
return create_qp_common(dev, pd, attr, ucmd, udata, qp); return create_qp_common(dev, pd, attr, ucmd, udata, qp, uidx);
} }
static int check_qp_attr(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, static int check_qp_attr(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
...@@ -2688,10 +2672,24 @@ static int check_qp_attr(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, ...@@ -2688,10 +2672,24 @@ static int check_qp_attr(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
return ret; return ret;
} }
static int get_qp_uidx(struct mlx5_ib_qp *qp, struct ib_udata *udata,
struct mlx5_ib_create_qp *ucmd,
struct ib_qp_init_attr *attr, u32 *uidx)
{
struct mlx5_ib_ucontext *ucontext = rdma_udata_to_drv_context(
udata, struct mlx5_ib_ucontext, ibucontext);
if (attr->rwq_ind_tbl)
return 0;
return get_qp_user_index(ucontext, ucmd, sizeof(*ucmd), uidx);
}
struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd,
struct ib_qp_init_attr *init_attr, struct ib_qp_init_attr *init_attr,
struct ib_udata *udata) struct ib_udata *udata)
{ {
u32 uidx = MLX5_IB_DEFAULT_UIDX;
struct mlx5_ib_dev *dev; struct mlx5_ib_dev *dev;
struct mlx5_ib_qp *qp; struct mlx5_ib_qp *qp;
enum ib_qp_type type; enum ib_qp_type type;
...@@ -2743,6 +2741,10 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, ...@@ -2743,6 +2741,10 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd,
err = process_vendor_flags(dev, qp, ucmd, init_attr); err = process_vendor_flags(dev, qp, ucmd, init_attr);
if (err) if (err)
goto free_qp; goto free_qp;
err = get_qp_uidx(qp, udata, ucmd, init_attr, &uidx);
if (err)
goto free_qp;
} }
err = process_create_flags(dev, qp, init_attr); err = process_create_flags(dev, qp, init_attr);
if (err) if (err)
...@@ -2757,13 +2759,14 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd, ...@@ -2757,13 +2759,14 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd,
switch (qp->type) { switch (qp->type) {
case IB_QPT_RAW_PACKET: case IB_QPT_RAW_PACKET:
err = create_raw_qp(pd, qp, init_attr, ucmd, udata); err = create_raw_qp(pd, qp, init_attr, ucmd, udata, uidx);
break; break;
case MLX5_IB_QPT_DCT: case MLX5_IB_QPT_DCT:
err = create_dct(pd, qp, init_attr, ucmd, udata); err = create_dct(pd, qp, init_attr, ucmd, uidx);
break; break;
default: default:
err = create_qp_common(dev, pd, init_attr, ucmd, udata, qp); err = create_qp_common(dev, pd, init_attr, ucmd, udata, qp,
uidx);
} }
if (err) { if (err) {
mlx5_ib_dbg(dev, "create_qp_common failed\n"); mlx5_ib_dbg(dev, "create_qp_common failed\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment