aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2016-03-03 10:18:41 -0500
committerDoug Ledford <dledford@redhat.com>2016-03-03 10:18:41 -0500
commitbbdfcf18c3b54818d21bf67a3c31779a090887a0 (patch)
tree5ba5937c09d87d3426704d3d625b32834d5164a7
parentfc77dbd34c5c99bce46d40a2491937c3bcbd10af (diff)
parent3d943c9d1cc5ad1825e46291ef5ce627e1b6b660 (diff)
Merge branch 'k.o/for-4.5-rc' into HEAD
-rw-r--r--drivers/infiniband/core/device.c1
-rw-r--r--drivers/infiniband/core/uverbs_cmd.c9
-rw-r--r--drivers/infiniband/hw/mlx5/srq.c41
3 files changed, 29 insertions, 22 deletions
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 00da80e02154..94b80a51ab68 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -358,6 +358,7 @@ int ib_register_device(struct ib_device *device,
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
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 6ffc9c4e93af..6c6fbff19752 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -1970,7 +1970,8 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
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,
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,
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)
diff --git a/drivers/infiniband/hw/mlx5/srq.c b/drivers/infiniband/hw/mlx5/srq.c
index 4659256cd95e..3b2ddd64a371 100644
--- a/drivers/infiniband/hw/mlx5/srq.c
+++ b/drivers/infiniband/hw/mlx5/srq.c
@@ -75,7 +75,8 @@ static void mlx5_ib_srq_event(struct mlx5_core_srq *srq, enum mlx5_event type)
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,
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,
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,
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:
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,
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,
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 else 310 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,
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;