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
358358 ret = device->query_device(device, &device->attrs, &uhw);
359359 if (ret) {
360360 printk(KERN_WARNING "Couldn't query the device attributes\n");
361+ ib_cache_cleanup_one(device);
361362 goto out;
362363 }
363364
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
10711071 }
10721072 }
10731073
1074− if (rec->hop_limit > 1 || use_roce) {
1074+ if (rec->hop_limit > 0 || use_roce) {
10751075 ah_attr->ah_flags = IB_AH_GRH;
10761076 ah_attr->grh.dgid = rec->dgid;
10771077
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
19701970 resp_size);
19711971 INIT_UDATA(&uhw, buf + sizeof(cmd),
19721972 (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);
19741975
19751976 memset(&cmd_ex, 0, sizeof(cmd_ex));
19761977 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
34133414
34143415 INIT_UDATA(&udata, buf + sizeof cmd,
34153416 (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);
34173419
34183420 ret = __uverbs_create_xsrq(file, ib_dev, &xcmd, &udata);
34193421 if (ret)
@@ -3439,7 +3441,8 @@ ssize_t ib_uverbs_create_xsrq(struct ib_uverbs_file *file, · 19 unmodified lines
34393441
34403442 INIT_UDATA(&udata, buf + sizeof cmd,
34413443 (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);
34433446
34443447 ret = __uverbs_create_xsrq(file, ib_dev, &cmd, &udata);
34453448 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
7575
7676 static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
7777 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)
7980 {
8081 struct mlx5_ib_dev *dev = to_mdev(pd->device);
8182 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
8788 int ncont;
8889 u32 offset;
8990 u32 uidx = MLX5_IB_DEFAULT_UIDX;
90− int drv_data = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr);
9191
92− if (drv_data < 0)
93− return -EINVAL;
94−
95− ucmdlen = (drv_data < sizeof(ucmd)) ?
96− drv_data : sizeof(ucmd);
92+ ucmdlen = min(udata->inlen, sizeof(ucmd));
9793
9894 if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) {
9995 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
10399 if (ucmd.reserved0 || ucmd.reserved1)
104100 return -EINVAL;
105101
106− if (drv_data > sizeof(ucmd) &&
102+ if (udata->inlen > sizeof(ucmd) &&
107103 !ib_is_udata_cleared(udata, sizeof(ucmd),
108− drv_data - sizeof(ucmd)))
104+ udata->inlen - sizeof(ucmd)))
109105 return -EINVAL;
110106
111− err = get_srq_user_index(to_mucontext(pd->uobject->context),
112− &ucmd, udata->inlen, &uidx);
113− if (err)
114− return err;
107+ if (is_xrc) {
108+ err = get_srq_user_index(to_mucontext(pd->uobject->context),
109+ &ucmd, udata->inlen, &uidx);
110+ if (err)
111+ return err;
112+ }
115113
116114 srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);
117115
@@ -151,7 +149,8 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq, · 33 unmodified lines
151149 (*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
152150 (*in)->ctx.pgoff_cqn = cpu_to_be32(offset << 26);
153151
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){
155154 xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
156155 xrc_srq_context_entry);
157156 MLX5_SET(xrc_srqc, xsrqc, user_index, uidx);
@@ -170,7 +169,7 @@ err_umem: · 12 unmodified lines
170169
171170 static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
172171 struct mlx5_create_srq_mbox_in **in, int buf_size,
173− int *inlen)
172+ int *inlen, int is_xrc)
174173 {
175174 int err;
176175 int i;
@@ -224,7 +223,8 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq, · 47 unmodified lines
224223
225224 (*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
226225
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){
228228 xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
229229 xrc_srq_context_entry);
230230 /* 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
302302 desc_size, init_attr->attr.max_wr, srq->msrq.max, srq->msrq.max_gs,
303303 srq->msrq.max_avail_gather);
304304
305+ is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
306+
305307 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);
307310 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);
309313
310314 if (err) {
311315 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
313317 goto err_srq;
314318 }
315319
316− is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
317320 in->ctx.state_log_sz = ilog2(srq->msrq.max);
318321 flgs = ((srq->msrq.wqe_shift - 4) | (is_xrc << 5) | (srq->wq_sig << 7)) << 24;
319322 xrcdn = 0;