]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RDMA/mlx5: Use UMEM attributes for QP buffers in create_qp
authorJiri Pirko <jiri@nvidia.com>
Fri, 29 May 2026 13:43:09 +0000 (15:43 +0200)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 29 May 2026 23:19:59 +0000 (20:19 -0300)
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>
drivers/infiniband/hw/mlx5/qp.c

index dc5e6e3e5a642c31cb971bc1baf1173c520a79d8..dd56118005313d88f8d411f54cde8462e33b4ba6 100644 (file)
@@ -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, &params->resp,
-                             &inlen, base, ucmd);
+       err = _create_user_qp(dev, pd, qp, udata, params->attrs, init_attr,
+                             &in, &params->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, &params->resp,
-                             &inlen, base, ucmd);
+       err = _create_user_qp(dev, pd, qp, udata, params->attrs, init_attr,
+                             &in, &params->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,
-                                          &params->resp, init_attr);
+                                          params->attrs, &params->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;