hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/infiniband/hw/mlx5/gsi.c
....@@ -35,34 +35,8 @@
3535 struct mlx5_ib_gsi_wr {
3636 struct ib_cqe cqe;
3737 struct ib_wc wc;
38
- int send_flags;
3938 bool completed:1;
4039 };
41
-
42
-struct mlx5_ib_gsi_qp {
43
- struct ib_qp ibqp;
44
- struct ib_qp *rx_qp;
45
- u8 port_num;
46
- struct ib_qp_cap cap;
47
- enum ib_sig_type sq_sig_type;
48
- /* Serialize qp state modifications */
49
- struct mutex mutex;
50
- struct ib_cq *cq;
51
- struct mlx5_ib_gsi_wr *outstanding_wrs;
52
- u32 outstanding_pi, outstanding_ci;
53
- int num_qps;
54
- /* Protects access to the tx_qps. Post send operations synchronize
55
- * with tx_qp creation in setup_qp(). Also protects the
56
- * outstanding_wrs array and indices.
57
- */
58
- spinlock_t lock;
59
- struct ib_qp **tx_qps;
60
-};
61
-
62
-static struct mlx5_ib_gsi_qp *gsi_qp(struct ib_qp *qp)
63
-{
64
- return container_of(qp, struct mlx5_ib_gsi_qp, ibqp);
65
-}
6640
6741 static bool mlx5_ib_deth_sqpn_cap(struct mlx5_ib_dev *dev)
6842 {
....@@ -70,9 +44,10 @@
7044 }
7145
7246 /* Call with gsi->lock locked */
73
-static void generate_completions(struct mlx5_ib_gsi_qp *gsi)
47
+static void generate_completions(struct mlx5_ib_qp *mqp)
7448 {
75
- struct ib_cq *gsi_cq = gsi->ibqp.send_cq;
49
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
50
+ struct ib_cq *gsi_cq = mqp->ibqp.send_cq;
7651 struct mlx5_ib_gsi_wr *wr;
7752 u32 index;
7853
....@@ -83,10 +58,7 @@
8358 if (!wr->completed)
8459 break;
8560
86
- if (gsi->sq_sig_type == IB_SIGNAL_ALL_WR ||
87
- wr->send_flags & IB_SEND_SIGNALED)
88
- WARN_ON_ONCE(mlx5_ib_generate_wc(gsi_cq, &wr->wc));
89
-
61
+ WARN_ON_ONCE(mlx5_ib_generate_wc(gsi_cq, &wr->wc));
9062 wr->completed = false;
9163 }
9264
....@@ -98,6 +70,7 @@
9870 struct mlx5_ib_gsi_qp *gsi = cq->cq_context;
9971 struct mlx5_ib_gsi_wr *wr =
10072 container_of(wc->wr_cqe, struct mlx5_ib_gsi_wr, cqe);
73
+ struct mlx5_ib_qp *mqp = container_of(gsi, struct mlx5_ib_qp, gsi);
10174 u64 wr_id;
10275 unsigned long flags;
10376
....@@ -106,51 +79,42 @@
10679 wr_id = wr->wc.wr_id;
10780 wr->wc = *wc;
10881 wr->wc.wr_id = wr_id;
109
- wr->wc.qp = &gsi->ibqp;
82
+ wr->wc.qp = &mqp->ibqp;
11083
111
- generate_completions(gsi);
84
+ generate_completions(mqp);
11285 spin_unlock_irqrestore(&gsi->lock, flags);
11386 }
11487
115
-struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
116
- struct ib_qp_init_attr *init_attr)
88
+int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,
89
+ struct ib_qp_init_attr *attr)
11790 {
11891 struct mlx5_ib_dev *dev = to_mdev(pd->device);
11992 struct mlx5_ib_gsi_qp *gsi;
120
- struct ib_qp_init_attr hw_init_attr = *init_attr;
121
- const u8 port_num = init_attr->port_num;
122
- const int num_pkeys = pd->device->attrs.max_pkeys;
123
- const int num_qps = mlx5_ib_deth_sqpn_cap(dev) ? num_pkeys : 0;
93
+ struct ib_qp_init_attr hw_init_attr = *attr;
94
+ const u8 port_num = attr->port_num;
95
+ int num_qps = 0;
12496 int ret;
12597
126
- mlx5_ib_dbg(dev, "creating GSI QP\n");
127
-
128
- if (port_num > ARRAY_SIZE(dev->devr.ports) || port_num < 1) {
129
- mlx5_ib_warn(dev,
130
- "invalid port number %d during GSI QP creation\n",
131
- port_num);
132
- return ERR_PTR(-EINVAL);
98
+ if (mlx5_ib_deth_sqpn_cap(dev)) {
99
+ if (MLX5_CAP_GEN(dev->mdev,
100
+ port_type) == MLX5_CAP_PORT_TYPE_IB)
101
+ num_qps = pd->device->attrs.max_pkeys;
102
+ else if (dev->lag_active)
103
+ num_qps = MLX5_MAX_PORTS;
133104 }
134105
135
- gsi = kzalloc(sizeof(*gsi), GFP_KERNEL);
136
- if (!gsi)
137
- return ERR_PTR(-ENOMEM);
138
-
106
+ gsi = &mqp->gsi;
139107 gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL);
140
- if (!gsi->tx_qps) {
141
- ret = -ENOMEM;
142
- goto err_free;
143
- }
108
+ if (!gsi->tx_qps)
109
+ return -ENOMEM;
144110
145
- gsi->outstanding_wrs = kcalloc(init_attr->cap.max_send_wr,
146
- sizeof(*gsi->outstanding_wrs),
147
- GFP_KERNEL);
111
+ gsi->outstanding_wrs =
112
+ kcalloc(attr->cap.max_send_wr, sizeof(*gsi->outstanding_wrs),
113
+ GFP_KERNEL);
148114 if (!gsi->outstanding_wrs) {
149115 ret = -ENOMEM;
150116 goto err_free_tx;
151117 }
152
-
153
- mutex_init(&gsi->mutex);
154118
155119 mutex_lock(&dev->devr.mutex);
156120
....@@ -163,12 +127,10 @@
163127 gsi->num_qps = num_qps;
164128 spin_lock_init(&gsi->lock);
165129
166
- gsi->cap = init_attr->cap;
167
- gsi->sq_sig_type = init_attr->sq_sig_type;
168
- gsi->ibqp.qp_num = 1;
130
+ gsi->cap = attr->cap;
169131 gsi->port_num = port_num;
170132
171
- gsi->cq = ib_alloc_cq(pd->device, gsi, init_attr->cap.max_send_wr, 0,
133
+ gsi->cq = ib_alloc_cq(pd->device, gsi, attr->cap.max_send_wr, 0,
172134 IB_POLL_SOFTIRQ);
173135 if (IS_ERR(gsi->cq)) {
174136 mlx5_ib_warn(dev, "unable to create send CQ for GSI QP. error %ld\n",
....@@ -184,19 +146,31 @@
184146 hw_init_attr.cap.max_send_sge = 0;
185147 hw_init_attr.cap.max_inline_data = 0;
186148 }
187
- gsi->rx_qp = ib_create_qp(pd, &hw_init_attr);
149
+
150
+ gsi->rx_qp = mlx5_ib_create_qp(pd, &hw_init_attr, NULL);
188151 if (IS_ERR(gsi->rx_qp)) {
189152 mlx5_ib_warn(dev, "unable to create hardware GSI QP. error %ld\n",
190153 PTR_ERR(gsi->rx_qp));
191154 ret = PTR_ERR(gsi->rx_qp);
192155 goto err_destroy_cq;
193156 }
157
+ gsi->rx_qp->device = pd->device;
158
+ gsi->rx_qp->pd = pd;
159
+ gsi->rx_qp->real_qp = gsi->rx_qp;
194160
195
- dev->devr.ports[init_attr->port_num - 1].gsi = gsi;
161
+ gsi->rx_qp->qp_type = hw_init_attr.qp_type;
162
+ gsi->rx_qp->send_cq = hw_init_attr.send_cq;
163
+ gsi->rx_qp->recv_cq = hw_init_attr.recv_cq;
164
+ gsi->rx_qp->event_handler = hw_init_attr.event_handler;
165
+ spin_lock_init(&gsi->rx_qp->mr_lock);
166
+ INIT_LIST_HEAD(&gsi->rx_qp->rdma_mrs);
167
+ INIT_LIST_HEAD(&gsi->rx_qp->sig_mrs);
168
+
169
+ dev->devr.ports[attr->port_num - 1].gsi = gsi;
196170
197171 mutex_unlock(&dev->devr.mutex);
198172
199
- return &gsi->ibqp;
173
+ return 0;
200174
201175 err_destroy_cq:
202176 ib_free_cq(gsi->cq);
....@@ -205,23 +179,19 @@
205179 kfree(gsi->outstanding_wrs);
206180 err_free_tx:
207181 kfree(gsi->tx_qps);
208
-err_free:
209
- kfree(gsi);
210
- return ERR_PTR(ret);
182
+ return ret;
211183 }
212184
213
-int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp)
185
+int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)
214186 {
215
- struct mlx5_ib_dev *dev = to_mdev(qp->device);
216
- struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
187
+ struct mlx5_ib_dev *dev = to_mdev(mqp->ibqp.device);
188
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
217189 const int port_num = gsi->port_num;
218190 int qp_index;
219191 int ret;
220192
221
- mlx5_ib_dbg(dev, "destroying GSI QP\n");
222
-
223193 mutex_lock(&dev->devr.mutex);
224
- ret = ib_destroy_qp(gsi->rx_qp);
194
+ ret = mlx5_ib_destroy_qp(gsi->rx_qp, NULL);
225195 if (ret) {
226196 mlx5_ib_warn(dev, "unable to destroy hardware GSI QP. error %d\n",
227197 ret);
....@@ -243,7 +213,7 @@
243213
244214 kfree(gsi->outstanding_wrs);
245215 kfree(gsi->tx_qps);
246
- kfree(gsi);
216
+ kfree(mqp);
247217
248218 return 0;
249219 }
....@@ -261,16 +231,15 @@
261231 .max_send_sge = gsi->cap.max_send_sge,
262232 .max_inline_data = gsi->cap.max_inline_data,
263233 },
264
- .sq_sig_type = gsi->sq_sig_type,
265234 .qp_type = IB_QPT_UD,
266
- .create_flags = mlx5_ib_create_qp_sqpn_qp1(),
235
+ .create_flags = MLX5_IB_QP_CREATE_SQPN_QP1,
267236 };
268237
269238 return ib_create_qp(pd, &init_attr);
270239 }
271240
272241 static int modify_to_rts(struct mlx5_ib_gsi_qp *gsi, struct ib_qp *qp,
273
- u16 qp_index)
242
+ u16 pkey_index)
274243 {
275244 struct mlx5_ib_dev *dev = to_mdev(qp->device);
276245 struct ib_qp_attr attr;
....@@ -279,7 +248,7 @@
279248
280249 mask = IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_QKEY | IB_QP_PORT;
281250 attr.qp_state = IB_QPS_INIT;
282
- attr.pkey_index = qp_index;
251
+ attr.pkey_index = pkey_index;
283252 attr.qkey = IB_QP1_QKEY;
284253 attr.port_num = gsi->port_num;
285254 ret = ib_modify_qp(qp, &attr, mask);
....@@ -313,12 +282,17 @@
313282 {
314283 struct ib_device *device = gsi->rx_qp->device;
315284 struct mlx5_ib_dev *dev = to_mdev(device);
285
+ int pkey_index = qp_index;
286
+ struct mlx5_ib_qp *mqp;
316287 struct ib_qp *qp;
317288 unsigned long flags;
318289 u16 pkey;
319290 int ret;
320291
321
- ret = ib_query_pkey(device, gsi->port_num, qp_index, &pkey);
292
+ if (MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_IB)
293
+ pkey_index = 0;
294
+
295
+ ret = ib_query_pkey(device, gsi->port_num, pkey_index, &pkey);
322296 if (ret) {
323297 mlx5_ib_warn(dev, "unable to read P_Key at port %d, index %d\n",
324298 gsi->port_num, qp_index);
....@@ -347,7 +321,10 @@
347321 return;
348322 }
349323
350
- ret = modify_to_rts(gsi, qp, qp_index);
324
+ mqp = to_mqp(qp);
325
+ if (dev->lag_active)
326
+ mqp->gsi_lag_port = qp_index + 1;
327
+ ret = modify_to_rts(gsi, qp, pkey_index);
351328 if (ret)
352329 goto err_destroy_qp;
353330
....@@ -364,56 +341,54 @@
364341
365342 static void setup_qps(struct mlx5_ib_gsi_qp *gsi)
366343 {
344
+ struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device);
367345 u16 qp_index;
368346
347
+ mutex_lock(&dev->devr.mutex);
369348 for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index)
370349 setup_qp(gsi, qp_index);
350
+ mutex_unlock(&dev->devr.mutex);
371351 }
372352
373353 int mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
374354 int attr_mask)
375355 {
376356 struct mlx5_ib_dev *dev = to_mdev(qp->device);
377
- struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
357
+ struct mlx5_ib_qp *mqp = to_mqp(qp);
358
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
378359 int ret;
379360
380361 mlx5_ib_dbg(dev, "modifying GSI QP to state %d\n", attr->qp_state);
381362
382
- mutex_lock(&gsi->mutex);
383363 ret = ib_modify_qp(gsi->rx_qp, attr, attr_mask);
384364 if (ret) {
385365 mlx5_ib_warn(dev, "unable to modify GSI rx QP: %d\n", ret);
386
- goto unlock;
366
+ return ret;
387367 }
388368
389369 if (to_mqp(gsi->rx_qp)->state == IB_QPS_RTS)
390370 setup_qps(gsi);
391
-
392
-unlock:
393
- mutex_unlock(&gsi->mutex);
394
-
395
- return ret;
371
+ return 0;
396372 }
397373
398374 int mlx5_ib_gsi_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
399375 int qp_attr_mask,
400376 struct ib_qp_init_attr *qp_init_attr)
401377 {
402
- struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
378
+ struct mlx5_ib_qp *mqp = to_mqp(qp);
379
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
403380 int ret;
404381
405
- mutex_lock(&gsi->mutex);
406382 ret = ib_query_qp(gsi->rx_qp, qp_attr, qp_attr_mask, qp_init_attr);
407383 qp_init_attr->cap = gsi->cap;
408
- mutex_unlock(&gsi->mutex);
409
-
410384 return ret;
411385 }
412386
413387 /* Call with gsi->lock locked */
414
-static int mlx5_ib_add_outstanding_wr(struct mlx5_ib_gsi_qp *gsi,
388
+static int mlx5_ib_add_outstanding_wr(struct mlx5_ib_qp *mqp,
415389 struct ib_ud_wr *wr, struct ib_wc *wc)
416390 {
391
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
417392 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device);
418393 struct mlx5_ib_gsi_wr *gsi_wr;
419394
....@@ -442,22 +417,21 @@
442417 }
443418
444419 /* Call with gsi->lock locked */
445
-static int mlx5_ib_gsi_silent_drop(struct mlx5_ib_gsi_qp *gsi,
446
- struct ib_ud_wr *wr)
420
+static int mlx5_ib_gsi_silent_drop(struct mlx5_ib_qp *mqp, struct ib_ud_wr *wr)
447421 {
448422 struct ib_wc wc = {
449423 { .wr_id = wr->wr.wr_id },
450424 .status = IB_WC_SUCCESS,
451425 .opcode = IB_WC_SEND,
452
- .qp = &gsi->ibqp,
426
+ .qp = &mqp->ibqp,
453427 };
454428 int ret;
455429
456
- ret = mlx5_ib_add_outstanding_wr(gsi, wr, &wc);
430
+ ret = mlx5_ib_add_outstanding_wr(mqp, wr, &wc);
457431 if (ret)
458432 return ret;
459433
460
- generate_completions(gsi);
434
+ generate_completions(mqp);
461435
462436 return 0;
463437 }
....@@ -466,10 +440,14 @@
466440 static struct ib_qp *get_tx_qp(struct mlx5_ib_gsi_qp *gsi, struct ib_ud_wr *wr)
467441 {
468442 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device);
443
+ struct mlx5_ib_ah *ah = to_mah(wr->ah);
469444 int qp_index = wr->pkey_index;
470445
471
- if (!mlx5_ib_deth_sqpn_cap(dev))
446
+ if (!gsi->num_qps)
472447 return gsi->rx_qp;
448
+
449
+ if (dev->lag_active && ah->xmit_port)
450
+ qp_index = ah->xmit_port - 1;
473451
474452 if (qp_index >= gsi->num_qps)
475453 return NULL;
....@@ -480,7 +458,8 @@
480458 int mlx5_ib_gsi_post_send(struct ib_qp *qp, const struct ib_send_wr *wr,
481459 const struct ib_send_wr **bad_wr)
482460 {
483
- struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
461
+ struct mlx5_ib_qp *mqp = to_mqp(qp);
462
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
484463 struct ib_qp *tx_qp;
485464 unsigned long flags;
486465 int ret;
....@@ -493,14 +472,14 @@
493472 spin_lock_irqsave(&gsi->lock, flags);
494473 tx_qp = get_tx_qp(gsi, &cur_wr);
495474 if (!tx_qp) {
496
- ret = mlx5_ib_gsi_silent_drop(gsi, &cur_wr);
475
+ ret = mlx5_ib_gsi_silent_drop(mqp, &cur_wr);
497476 if (ret)
498477 goto err;
499478 spin_unlock_irqrestore(&gsi->lock, flags);
500479 continue;
501480 }
502481
503
- ret = mlx5_ib_add_outstanding_wr(gsi, &cur_wr, NULL);
482
+ ret = mlx5_ib_add_outstanding_wr(mqp, &cur_wr, NULL);
504483 if (ret)
505484 goto err;
506485
....@@ -524,7 +503,8 @@
524503 int mlx5_ib_gsi_post_recv(struct ib_qp *qp, const struct ib_recv_wr *wr,
525504 const struct ib_recv_wr **bad_wr)
526505 {
527
- struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
506
+ struct mlx5_ib_qp *mqp = to_mqp(qp);
507
+ struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
528508
529509 return ib_post_recv(gsi->rx_qp, wr, bad_wr);
530510 }
....@@ -534,7 +514,5 @@
534514 if (!gsi)
535515 return;
536516
537
- mutex_lock(&gsi->mutex);
538517 setup_qps(gsi);
539
- mutex_unlock(&gsi->mutex);
540518 }