mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 03:27:30 -04:00
RDMA/mlx5: Use UMEM attributes for QP buffers in create_qp
Use the per-attribute UMEM helpers to pin QP buffer umems on demand. The QP-type predicate selects between the BUF and RQ_BUF attrs; raw-packet SQ uses its own dedicated SQ_BUF attr. Link: https://patch.msgid.link/r/20260529134312.2836341-14-jiri@resnulli.us Signed-off-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
committed by
Jason Gunthorpe
parent
cd767d980c
commit
38fc5bab6c
@@ -934,8 +934,17 @@ static int adjust_bfregn(struct mlx5_ib_dev *dev,
|
||||
bfregn % MLX5_NON_FP_BFREGS_PER_UAR;
|
||||
}
|
||||
|
||||
static u16 mlx5_qp_buf_attr(struct mlx5_ib_qp *qp)
|
||||
{
|
||||
if (qp->type == IB_QPT_RAW_PACKET ||
|
||||
qp->flags & IB_QP_CREATE_SOURCE_QPN)
|
||||
return UVERBS_ATTR_CREATE_QP_RQ_BUF_UMEM;
|
||||
return UVERBS_ATTR_CREATE_QP_BUF_UMEM;
|
||||
}
|
||||
|
||||
static int _create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
struct mlx5_ib_qp *qp, struct ib_udata *udata,
|
||||
struct uverbs_attr_bundle *attrs,
|
||||
struct ib_qp_init_attr *attr, u32 **in,
|
||||
struct mlx5_ib_create_qp_resp *resp, int *inlen,
|
||||
struct mlx5_ib_qp_base *base,
|
||||
@@ -994,14 +1003,20 @@ static int _create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
if (err)
|
||||
goto err_bfreg;
|
||||
|
||||
if (ucmd->buf_addr && ubuffer->buf_size) {
|
||||
ubuffer->umem = NULL;
|
||||
if (ubuffer->buf_size) {
|
||||
ubuffer->buf_addr = ucmd->buf_addr;
|
||||
ubuffer->umem = ib_umem_get_va(&dev->ib_dev, ubuffer->buf_addr,
|
||||
ubuffer->buf_size, 0);
|
||||
ubuffer->umem = ib_umem_get_attr_or_va(&dev->ib_dev, attrs,
|
||||
mlx5_qp_buf_attr(qp),
|
||||
ubuffer->buf_addr,
|
||||
ubuffer->buf_size, 0);
|
||||
if (IS_ERR(ubuffer->umem)) {
|
||||
err = PTR_ERR(ubuffer->umem);
|
||||
ubuffer->umem = NULL;
|
||||
goto err_bfreg;
|
||||
}
|
||||
}
|
||||
if (ubuffer->umem) {
|
||||
page_size = mlx5_umem_find_best_quantized_pgoff(
|
||||
ubuffer->umem, qpc, log_page_size,
|
||||
MLX5_ADAPTER_PAGE_SHIFT, page_offset, 64,
|
||||
@@ -1011,8 +1026,6 @@ static int _create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
goto err_umem;
|
||||
}
|
||||
ncont = ib_umem_num_dma_blocks(ubuffer->umem, page_size);
|
||||
} else {
|
||||
ubuffer->umem = NULL;
|
||||
}
|
||||
|
||||
*inlen = MLX5_ST_SZ_BYTES(create_qp_in) +
|
||||
@@ -1329,6 +1342,7 @@ static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq,
|
||||
|
||||
static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
|
||||
struct ib_udata *udata,
|
||||
struct uverbs_attr_bundle *attrs,
|
||||
struct mlx5_ib_sq *sq, void *qpin,
|
||||
struct ib_pd *pd, struct mlx5_ib_cq *cq)
|
||||
{
|
||||
@@ -1348,8 +1362,10 @@ static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
|
||||
if (ts_format < 0)
|
||||
return ts_format;
|
||||
|
||||
sq->ubuffer.umem = ib_umem_get_va(&dev->ib_dev, ubuffer->buf_addr,
|
||||
ubuffer->buf_size, 0);
|
||||
sq->ubuffer.umem = ib_umem_get_attr_or_va(&dev->ib_dev, attrs,
|
||||
UVERBS_ATTR_CREATE_QP_SQ_BUF_UMEM,
|
||||
ubuffer->buf_addr,
|
||||
ubuffer->buf_size, 0);
|
||||
if (IS_ERR(sq->ubuffer.umem))
|
||||
return PTR_ERR(sq->ubuffer.umem);
|
||||
page_size = mlx5_umem_find_best_quantized_pgoff(
|
||||
@@ -1562,6 +1578,7 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
||||
static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
u32 *in, size_t inlen, struct ib_pd *pd,
|
||||
struct ib_udata *udata,
|
||||
struct uverbs_attr_bundle *attrs,
|
||||
struct mlx5_ib_create_qp_resp *resp,
|
||||
struct ib_qp_init_attr *init_attr)
|
||||
{
|
||||
@@ -1582,7 +1599,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = create_raw_packet_qp_sq(dev, udata, sq, in, pd,
|
||||
err = create_raw_packet_qp_sq(dev, udata, attrs, sq, in, pd,
|
||||
to_mcq(init_attr->send_cq));
|
||||
if (err)
|
||||
goto err_destroy_tis;
|
||||
@@ -1700,6 +1717,7 @@ static void destroy_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *q
|
||||
|
||||
struct mlx5_create_qp_params {
|
||||
struct ib_udata *udata;
|
||||
struct uverbs_attr_bundle *attrs;
|
||||
size_t inlen;
|
||||
size_t outlen;
|
||||
size_t ucmd_size;
|
||||
@@ -2121,8 +2139,8 @@ static int create_dci(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
if (ts_format < 0)
|
||||
return ts_format;
|
||||
|
||||
err = _create_user_qp(dev, pd, qp, udata, init_attr, &in, ¶ms->resp,
|
||||
&inlen, base, ucmd);
|
||||
err = _create_user_qp(dev, pd, qp, udata, params->attrs, init_attr,
|
||||
&in, ¶ms->resp, &inlen, base, ucmd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -2289,8 +2307,8 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
return ts_format;
|
||||
}
|
||||
|
||||
err = _create_user_qp(dev, pd, qp, udata, init_attr, &in, ¶ms->resp,
|
||||
&inlen, base, ucmd);
|
||||
err = _create_user_qp(dev, pd, qp, udata, params->attrs, init_attr,
|
||||
&in, ¶ms->resp, &inlen, base, ucmd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -2394,7 +2412,8 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd->sq_buf_addr;
|
||||
raw_packet_qp_copy_info(qp, &qp->raw_packet_qp);
|
||||
err = create_raw_packet_qp(dev, qp, in, inlen, pd, udata,
|
||||
¶ms->resp, init_attr);
|
||||
params->attrs, ¶ms->resp,
|
||||
init_attr);
|
||||
} else
|
||||
err = mlx5_qpc_create_qp(dev, &base->mqp, in, inlen, out);
|
||||
|
||||
@@ -3274,6 +3293,7 @@ int mlx5_ib_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
|
||||
return err;
|
||||
|
||||
params.udata = udata;
|
||||
params.attrs = udata ? rdma_udata_to_uverbs_attr_bundle(udata) : NULL;
|
||||
params.uidx = MLX5_IB_DEFAULT_UIDX;
|
||||
params.attr = attr;
|
||||
params.is_rss_raw = !!attr->rwq_ind_tbl;
|
||||
|
||||
Reference in New Issue
Block a user