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,
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,
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) +
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)
{
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(
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)
{
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;
struct mlx5_create_qp_params {
struct ib_udata *udata;
+ struct uverbs_attr_bundle *attrs;
size_t inlen;
size_t outlen;
size_t ucmd_size;
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;
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;
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);
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;