|
@@ -78,28 +78,41 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
|
|
struct ib_udata *udata, int buf_size, int *inlen)
|
|
|
{
|
|
|
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
|
|
- struct mlx5_ib_create_srq ucmd;
|
|
|
+ struct mlx5_ib_create_srq ucmd = {};
|
|
|
size_t ucmdlen;
|
|
|
+ void *xsrqc;
|
|
|
int err;
|
|
|
int npages;
|
|
|
int page_shift;
|
|
|
int ncont;
|
|
|
u32 offset;
|
|
|
+ u32 uidx = MLX5_IB_DEFAULT_UIDX;
|
|
|
+ int drv_data = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr);
|
|
|
|
|
|
- ucmdlen =
|
|
|
- (udata->inlen - sizeof(struct ib_uverbs_cmd_hdr) <
|
|
|
- sizeof(ucmd)) ? (sizeof(ucmd) -
|
|
|
- sizeof(ucmd.reserved)) : sizeof(ucmd);
|
|
|
+ if (drv_data < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ucmdlen = (drv_data < sizeof(ucmd)) ?
|
|
|
+ drv_data : sizeof(ucmd);
|
|
|
|
|
|
if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) {
|
|
|
mlx5_ib_dbg(dev, "failed copy udata\n");
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
- if (ucmdlen == sizeof(ucmd) &&
|
|
|
- ucmd.reserved != 0)
|
|
|
+ if (ucmd.reserved0 || ucmd.reserved1)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if (drv_data > sizeof(ucmd) &&
|
|
|
+ !ib_is_udata_cleared(udata, sizeof(ucmd),
|
|
|
+ drv_data - sizeof(ucmd)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ err = get_srq_user_index(to_mucontext(pd->uobject->context),
|
|
|
+ &ucmd, udata->inlen, &uidx);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);
|
|
|
|
|
|
srq->umem = ib_umem_get(pd->uobject->context, ucmd.buf_addr, buf_size,
|
|
@@ -138,6 +151,12 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
|
|
(*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
|
|
|
(*in)->ctx.pgoff_cqn = cpu_to_be32(offset << 26);
|
|
|
|
|
|
+ if (MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) {
|
|
|
+ xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
|
|
|
+ xrc_srq_context_entry);
|
|
|
+ MLX5_SET(xrc_srqc, xsrqc, user_index, uidx);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_in:
|
|
@@ -158,6 +177,7 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
|
|
|
struct mlx5_wqe_srq_next_seg *next;
|
|
|
int page_shift;
|
|
|
int npages;
|
|
|
+ void *xsrqc;
|
|
|
|
|
|
err = mlx5_db_alloc(dev->mdev, &srq->db);
|
|
|
if (err) {
|
|
@@ -204,6 +224,13 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
|
|
|
|
|
|
(*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
|
|
|
|
|
|
+ if (MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) {
|
|
|
+ xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
|
|
|
+ xrc_srq_context_entry);
|
|
|
+ /* 0xffffff means we ask to work with cqe version 0 */
|
|
|
+ MLX5_SET(xrc_srqc, xsrqc, user_index, MLX5_IB_DEFAULT_UIDX);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_in:
|