hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/infiniband/hw/mlx4/srq.c
....@@ -37,6 +37,7 @@
3737
3838 #include "mlx4_ib.h"
3939 #include <rdma/mlx4-abi.h>
40
+#include <rdma/uverbs_ioctl.h>
4041
4142 static void *get_wqe(struct mlx4_ib_srq *srq, int n)
4243 {
....@@ -68,12 +69,14 @@
6869 }
6970 }
7071
71
-struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
72
- struct ib_srq_init_attr *init_attr,
73
- struct ib_udata *udata)
72
+int mlx4_ib_create_srq(struct ib_srq *ib_srq,
73
+ struct ib_srq_init_attr *init_attr,
74
+ struct ib_udata *udata)
7475 {
75
- struct mlx4_ib_dev *dev = to_mdev(pd->device);
76
- struct mlx4_ib_srq *srq;
76
+ struct mlx4_ib_dev *dev = to_mdev(ib_srq->device);
77
+ struct mlx4_ib_ucontext *ucontext = rdma_udata_to_drv_context(
78
+ udata, struct mlx4_ib_ucontext, ibucontext);
79
+ struct mlx4_ib_srq *srq = to_msrq(ib_srq);
7780 struct mlx4_wqe_srq_next_seg *next;
7881 struct mlx4_wqe_data_seg *scatter;
7982 u32 cqn;
....@@ -86,11 +89,7 @@
8689 /* Sanity check SRQ size before proceeding */
8790 if (init_attr->attr.max_wr >= dev->dev->caps.max_srq_wqes ||
8891 init_attr->attr.max_sge > dev->dev->caps.max_srq_sge)
89
- return ERR_PTR(-EINVAL);
90
-
91
- srq = kmalloc(sizeof *srq, GFP_KERNEL);
92
- if (!srq)
93
- return ERR_PTR(-ENOMEM);
92
+ return -EINVAL;
9493
9594 mutex_init(&srq->mutex);
9695 spin_lock_init(&srq->lock);
....@@ -105,23 +104,20 @@
105104
106105 buf_size = srq->msrq.max * desc_size;
107106
108
- if (pd->uobject) {
107
+ if (udata) {
109108 struct mlx4_ib_create_srq ucmd;
110109
111
- if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd)) {
112
- err = -EFAULT;
113
- goto err_srq;
114
- }
110
+ if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd)))
111
+ return -EFAULT;
115112
116
- srq->umem = ib_umem_get(pd->uobject->context, ucmd.buf_addr,
117
- buf_size, 0, 0);
118
- if (IS_ERR(srq->umem)) {
119
- err = PTR_ERR(srq->umem);
120
- goto err_srq;
121
- }
113
+ srq->umem =
114
+ ib_umem_get(ib_srq->device, ucmd.buf_addr, buf_size, 0);
115
+ if (IS_ERR(srq->umem))
116
+ return PTR_ERR(srq->umem);
122117
123
- err = mlx4_mtt_init(dev->dev, ib_umem_page_count(srq->umem),
124
- srq->umem->page_shift, &srq->mtt);
118
+ err = mlx4_mtt_init(
119
+ dev->dev, ib_umem_num_dma_blocks(srq->umem, PAGE_SIZE),
120
+ PAGE_SHIFT, &srq->mtt);
125121 if (err)
126122 goto err_buf;
127123
....@@ -129,14 +125,13 @@
129125 if (err)
130126 goto err_mtt;
131127
132
- err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context),
133
- ucmd.db_addr, &srq->db);
128
+ err = mlx4_ib_db_map_user(udata, ucmd.db_addr, &srq->db);
134129 if (err)
135130 goto err_mtt;
136131 } else {
137132 err = mlx4_db_alloc(dev->dev, &srq->db, 0);
138133 if (err)
139
- goto err_srq;
134
+ return err;
140135
141136 *srq->db.db = 0;
142137
....@@ -183,15 +178,15 @@
183178 xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
184179 to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn :
185180 (u16) dev->dev->caps.reserved_xrcds;
186
- err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, cqn, xrcdn, &srq->mtt,
187
- srq->db.dma, &srq->msrq);
181
+ err = mlx4_srq_alloc(dev->dev, to_mpd(ib_srq->pd)->pdn, cqn, xrcdn,
182
+ &srq->mtt, srq->db.dma, &srq->msrq);
188183 if (err)
189184 goto err_wrid;
190185
191186 srq->msrq.event = mlx4_ib_srq_event;
192187 srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn;
193188
194
- if (pd->uobject)
189
+ if (udata)
195190 if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) {
196191 err = -EFAULT;
197192 goto err_wrid;
....@@ -199,11 +194,11 @@
199194
200195 init_attr->attr.max_wr = srq->msrq.max - 1;
201196
202
- return &srq->ibsrq;
197
+ return 0;
203198
204199 err_wrid:
205
- if (pd->uobject)
206
- mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), &srq->db);
200
+ if (udata)
201
+ mlx4_ib_db_unmap_user(ucontext, &srq->db);
207202 else
208203 kvfree(srq->wrid);
209204
....@@ -211,19 +206,15 @@
211206 mlx4_mtt_cleanup(dev->dev, &srq->mtt);
212207
213208 err_buf:
214
- if (pd->uobject)
215
- ib_umem_release(srq->umem);
216
- else
209
+ if (!srq->umem)
217210 mlx4_buf_free(dev->dev, buf_size, &srq->buf);
211
+ ib_umem_release(srq->umem);
218212
219213 err_db:
220
- if (!pd->uobject)
214
+ if (!udata)
221215 mlx4_db_free(dev->dev, &srq->db);
222216
223
-err_srq:
224
- kfree(srq);
225
-
226
- return ERR_PTR(err);
217
+ return err;
227218 }
228219
229220 int mlx4_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
....@@ -270,7 +261,7 @@
270261 return 0;
271262 }
272263
273
-int mlx4_ib_destroy_srq(struct ib_srq *srq)
264
+int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
274265 {
275266 struct mlx4_ib_dev *dev = to_mdev(srq->device);
276267 struct mlx4_ib_srq *msrq = to_msrq(srq);
....@@ -278,18 +269,20 @@
278269 mlx4_srq_free(dev->dev, &msrq->msrq);
279270 mlx4_mtt_cleanup(dev->dev, &msrq->mtt);
280271
281
- if (srq->uobject) {
282
- mlx4_ib_db_unmap_user(to_mucontext(srq->uobject->context), &msrq->db);
283
- ib_umem_release(msrq->umem);
272
+ if (udata) {
273
+ mlx4_ib_db_unmap_user(
274
+ rdma_udata_to_drv_context(
275
+ udata,
276
+ struct mlx4_ib_ucontext,
277
+ ibucontext),
278
+ &msrq->db);
284279 } else {
285280 kvfree(msrq->wrid);
286281 mlx4_buf_free(dev->dev, msrq->msrq.max << msrq->msrq.wqe_shift,
287282 &msrq->buf);
288283 mlx4_db_free(dev->dev, &msrq->db);
289284 }
290
-
291
- kfree(msrq);
292
-
285
+ ib_umem_release(msrq->umem);
293286 return 0;
294287 }
295288