History

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma

Pull rdma fixes from Doug Ledford: "Additional 4.5-rc6 fixes. I have four patches today. I had previously thought I had submitted two of them last week, but they were accidentally skipped :-(. - One fix to an error path in the core - One fix for RoCE in the core - Two related fixes for the core/mlx5" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: IB/core: Use GRH when the path hop-limit > 0 IB/{core, mlx5}: Fix input len in vendor part of create_qp/srq IB/mlx5: Avoid using user-index for SRQs IB/core: Fix missed clean call in registration path

Linus Torvalds committed 10 years ago

Commit bdf9d292 parents 638c201 11d8d644 files · +30 −23Browse files

Unified · Split

4 files
  1. drivers/infiniband/core/device.c +1 −0
  2. drivers/infiniband/core/sa_query.c +1 −1
  3. drivers/infiniband/core/uverbs_cmd.c +6 −3
  4. drivers/infiniband/hw/mlx5/srq.c +22 −19
drivers/infiniband/core/device.c+1−0
@@ -358,6 +358,7 @@ int ib_register_device(struct ib_device *device, · 357 unmodified lines
358 ret = device->query_device(device, &device->attrs, &uhw);358 ret = device->query_device(device, &device->attrs, &uhw);
359 if (ret) {359 if (ret) {
360 printk(KERN_WARNING "Couldn't query the device attributes\n");360 printk(KERN_WARNING "Couldn't query the device attributes\n");
361 ib_cache_cleanup_one(device);
361 goto out;362 goto out;
362 }363 }
363 364
drivers/infiniband/core/sa_query.c+1−1
@@ -1071,7 +1071,7 @@ int ib_init_ah_from_path(struct ib_device *device, u8 port_num, · 1070 unmodified lines
1071 }1071 }
1072 }1072 }
1073 1073
1074 if (rec->hop_limit > 1 || use_roce) {1074 if (rec->hop_limit > 0 || use_roce) {
1075 ah_attr->ah_flags = IB_AH_GRH;1075 ah_attr->ah_flags = IB_AH_GRH;
1076 ah_attr->grh.dgid = rec->dgid;1076 ah_attr->grh.dgid = rec->dgid;
1077 1077
drivers/infiniband/core/uverbs_cmd.c+6−3
@@ -1970,7 +1970,8 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file, · 1969 unmodified lines
1970 resp_size);1970 resp_size);
1971 INIT_UDATA(&uhw, buf + sizeof(cmd),1971 INIT_UDATA(&uhw, buf + sizeof(cmd),
1972 (unsigned long)cmd.response + resp_size,1972 (unsigned long)cmd.response + resp_size,
1973 in_len - sizeof(cmd), out_len - resp_size);1973 in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
1974 out_len - resp_size);
1974 1975
1975 memset(&cmd_ex, 0, sizeof(cmd_ex));1976 memset(&cmd_ex, 0, sizeof(cmd_ex));
1976 cmd_ex.user_handle = cmd.user_handle;1977 cmd_ex.user_handle = cmd.user_handle;
@@ -3413,7 +3414,8 @@ ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file, · 1436 unmodified lines
3413 3414
3414 INIT_UDATA(&udata, buf + sizeof cmd,3415 INIT_UDATA(&udata, buf + sizeof cmd,
3415 (unsigned long) cmd.response + sizeof resp,3416 (unsigned long) cmd.response + sizeof resp,
3416 in_len - sizeof cmd, out_len - sizeof resp);3417 in_len - sizeof cmd - sizeof(struct ib_uverbs_cmd_hdr),
3418 out_len - sizeof resp);
3417 3419
3418 ret = __uverbs_create_xsrq(file, ib_dev, &xcmd, &udata);3420 ret = __uverbs_create_xsrq(file, ib_dev, &xcmd, &udata);
3419 if (ret)3421 if (ret)
@@ -3439,7 +3441,8 @@ ssize_t ib_uverbs_create_xsrq(struct ib_uverbs_file *file, · 19 unmodified lines
3439 3441
3440 INIT_UDATA(&udata, buf + sizeof cmd,3442 INIT_UDATA(&udata, buf + sizeof cmd,
3441 (unsigned long) cmd.response + sizeof resp,3443 (unsigned long) cmd.response + sizeof resp,
3442 in_len - sizeof cmd, out_len - sizeof resp);3444 in_len - sizeof cmd - sizeof(struct ib_uverbs_cmd_hdr),
3445 out_len - sizeof resp);
3443 3446
3444 ret = __uverbs_create_xsrq(file, ib_dev, &cmd, &udata);3447 ret = __uverbs_create_xsrq(file, ib_dev, &cmd, &udata);
3445 if (ret)3448 if (ret)
drivers/infiniband/hw/mlx5/srq.c+22−19
@@ -75,7 +75,8 @@ static void mlx5_ib_srq_event(struct mlx5_core_srq *srq, enum mlx5_event type) · 74 unmodified lines
75 75
76static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,76static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
77 struct mlx5_create_srq_mbox_in **in,77 struct mlx5_create_srq_mbox_in **in,
78 struct ib_udata *udata, int buf_size, int *inlen)78 struct ib_udata *udata, int buf_size, int *inlen,
79 int is_xrc)
79{80{
80 struct mlx5_ib_dev *dev = to_mdev(pd->device);81 struct mlx5_ib_dev *dev = to_mdev(pd->device);
81 struct mlx5_ib_create_srq ucmd = {};82 struct mlx5_ib_create_srq ucmd = {};
@@ -87,13 +88,8 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq, · 5 unmodified lines
87 int ncont;88 int ncont;
88 u32 offset;89 u32 offset;
89 u32 uidx = MLX5_IB_DEFAULT_UIDX;90 u32 uidx = MLX5_IB_DEFAULT_UIDX;
90 int drv_data = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr);
91 91
92 if (drv_data < 0)92 ucmdlen = min(udata->inlen, sizeof(ucmd));
93 return -EINVAL;
94
95 ucmdlen = (drv_data < sizeof(ucmd)) ?
96 drv_data : sizeof(ucmd);
97 93
98 if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) {94 if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) {
99 mlx5_ib_dbg(dev, "failed copy udata\n");95 mlx5_ib_dbg(dev, "failed copy udata\n");
@@ -103,15 +99,17 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq, · 3 unmodified lines
103 if (ucmd.reserved0 || ucmd.reserved1)99 if (ucmd.reserved0 || ucmd.reserved1)
104 return -EINVAL;100 return -EINVAL;
105 101
106 if (drv_data > sizeof(ucmd) &&102 if (udata->inlen > sizeof(ucmd) &&
107 !ib_is_udata_cleared(udata, sizeof(ucmd),103 !ib_is_udata_cleared(udata, sizeof(ucmd),
108 drv_data - sizeof(ucmd)))104 udata->inlen - sizeof(ucmd)))
109 return -EINVAL;105 return -EINVAL;
110 106
111 err = get_srq_user_index(to_mucontext(pd->uobject->context),107 if (is_xrc) {
112 &ucmd, udata->inlen, &uidx);108 err = get_srq_user_index(to_mucontext(pd->uobject->context),
113 if (err)109 &ucmd, udata->inlen, &uidx);
114 return err;110 if (err)
111 return err;
112 }
115 113
116 srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);114 srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);
117 115
@@ -151,7 +149,8 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq, · 33 unmodified lines
151 (*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;149 (*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
152 (*in)->ctx.pgoff_cqn = cpu_to_be32(offset << 26);150 (*in)->ctx.pgoff_cqn = cpu_to_be32(offset << 26);
153 151
154 if (MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) {152 if ((MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) &&
153 is_xrc){
155 xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,154 xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
156 xrc_srq_context_entry);155 xrc_srq_context_entry);
157 MLX5_SET(xrc_srqc, xsrqc, user_index, uidx);156 MLX5_SET(xrc_srqc, xsrqc, user_index, uidx);
@@ -170,7 +169,7 @@ err_umem: · 12 unmodified lines
170 169
171static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,170static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
172 struct mlx5_create_srq_mbox_in **in, int buf_size,171 struct mlx5_create_srq_mbox_in **in, int buf_size,
173 int *inlen)172 int *inlen, int is_xrc)
174{173{
175 int err;174 int err;
176 int i;175 int i;
@@ -224,7 +223,8 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq, · 47 unmodified lines
224 223
225 (*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;224 (*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
226 225
227 if (MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) {226 if ((MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) &&
227 is_xrc){
228 xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,228 xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
229 xrc_srq_context_entry);229 xrc_srq_context_entry);
230 /* 0xffffff means we ask to work with cqe version 0 */230 /* 0xffffff means we ask to work with cqe version 0 */
@@ -302,10 +302,14 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd, · 71 unmodified lines
302 desc_size, init_attr->attr.max_wr, srq->msrq.max, srq->msrq.max_gs,302 desc_size, init_attr->attr.max_wr, srq->msrq.max, srq->msrq.max_gs,
303 srq->msrq.max_avail_gather);303 srq->msrq.max_avail_gather);
304 304
305 is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
306
305 if (pd->uobject)307 if (pd->uobject)
306 err = create_srq_user(pd, srq, &in, udata, buf_size, &inlen);308 err = create_srq_user(pd, srq, &in, udata, buf_size, &inlen,
309 is_xrc);
307 else310 else
308 err = create_srq_kernel(dev, srq, &in, buf_size, &inlen);311 err = create_srq_kernel(dev, srq, &in, buf_size, &inlen,
312 is_xrc);
309 313
310 if (err) {314 if (err) {
311 mlx5_ib_warn(dev, "create srq %s failed, err %d\n",315 mlx5_ib_warn(dev, "create srq %s failed, err %d\n",
@@ -313,7 +317,6 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd, · 1 unmodified line
313 goto err_srq;317 goto err_srq;
314 }318 }
315 319
316 is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
317 in->ctx.state_log_sz = ilog2(srq->msrq.max);320 in->ctx.state_log_sz = ilog2(srq->msrq.max);
318 flgs = ((srq->msrq.wqe_shift - 4) | (is_xrc << 5) | (srq->wq_sig << 7)) << 24;321 flgs = ((srq->msrq.wqe_shift - 4) | (is_xrc << 5) | (srq->wq_sig << 7)) << 24;
319 xrcdn = 0;322 xrcdn = 0;