hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/infiniband/core/cma.c
....@@ -505,21 +505,10 @@
505505 return id_priv->id.route.addr.src_addr.ss_family;
506506 }
507507
508
-static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey)
508
+static int cma_set_default_qkey(struct rdma_id_private *id_priv)
509509 {
510510 struct ib_sa_mcmember_rec rec;
511511 int ret = 0;
512
-
513
- if (id_priv->qkey) {
514
- if (qkey && id_priv->qkey != qkey)
515
- return -EINVAL;
516
- return 0;
517
- }
518
-
519
- if (qkey) {
520
- id_priv->qkey = qkey;
521
- return 0;
522
- }
523512
524513 switch (id_priv->id.ps) {
525514 case RDMA_PS_UDP:
....@@ -538,6 +527,16 @@
538527 break;
539528 }
540529 return ret;
530
+}
531
+
532
+static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey)
533
+{
534
+ if (!qkey ||
535
+ (id_priv->qkey && (id_priv->qkey != qkey)))
536
+ return -EINVAL;
537
+
538
+ id_priv->qkey = qkey;
539
+ return 0;
541540 }
542541
543542 static void cma_translate_ib(struct sockaddr_ib *sib, struct rdma_dev_addr *dev_addr)
....@@ -1107,7 +1106,7 @@
11071106 *qp_attr_mask = IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_PORT;
11081107
11091108 if (id_priv->id.qp_type == IB_QPT_UD) {
1110
- ret = cma_set_qkey(id_priv, 0);
1109
+ ret = cma_set_default_qkey(id_priv);
11111110 if (ret)
11121111 return ret;
11131112
....@@ -1793,6 +1792,14 @@
17931792 {
17941793 switch (state) {
17951794 case RDMA_CM_ADDR_QUERY:
1795
+ /*
1796
+ * We can avoid doing the rdma_addr_cancel() based on state,
1797
+ * only RDMA_CM_ADDR_QUERY has a work that could still execute.
1798
+ * Notice that the addr_handler work could still be exiting
1799
+ * outside this state, however due to the interaction with the
1800
+ * handler_mutex the work is guaranteed not to touch id_priv
1801
+ * during exit.
1802
+ */
17961803 rdma_addr_cancel(&id_priv->id.route.addr.dev_addr);
17971804 break;
17981805 case RDMA_CM_ROUTE_QUERY:
....@@ -3070,7 +3077,7 @@
30703077 route->path_rec->traffic_class = tos;
30713078 route->path_rec->mtu = iboe_get_mtu(ndev->mtu);
30723079 route->path_rec->rate_selector = IB_SA_EQ;
3073
- route->path_rec->rate = iboe_get_rate(ndev);
3080
+ route->path_rec->rate = IB_RATE_PORT_CURRENT;
30743081 dev_put(ndev);
30753082 route->path_rec->packet_life_time_selector = IB_SA_EQ;
30763083 /* In case ACK timeout is set, use this value to calculate
....@@ -3402,6 +3409,21 @@
34023409 if (dst_addr->sa_family == AF_IB) {
34033410 ret = cma_resolve_ib_addr(id_priv);
34043411 } else {
3412
+ /*
3413
+ * The FSM can return back to RDMA_CM_ADDR_BOUND after
3414
+ * rdma_resolve_ip() is called, eg through the error
3415
+ * path in addr_handler(). If this happens the existing
3416
+ * request must be canceled before issuing a new one.
3417
+ * Since canceling a request is a bit slow and this
3418
+ * oddball path is rare, keep track once a request has
3419
+ * been issued. The track turns out to be a permanent
3420
+ * state since this is the only cancel as it is
3421
+ * immediately before rdma_resolve_ip().
3422
+ */
3423
+ if (id_priv->used_resolve_ip)
3424
+ rdma_addr_cancel(&id->route.addr.dev_addr);
3425
+ else
3426
+ id_priv->used_resolve_ip = 1;
34053427 ret = rdma_resolve_ip(cma_src_addr(id_priv), dst_addr,
34063428 &id->route.addr.dev_addr,
34073429 timeout_ms, addr_handler,
....@@ -4312,7 +4334,10 @@
43124334 memset(&rep, 0, sizeof rep);
43134335 rep.status = status;
43144336 if (status == IB_SIDR_SUCCESS) {
4315
- ret = cma_set_qkey(id_priv, qkey);
4337
+ if (qkey)
4338
+ ret = cma_set_qkey(id_priv, qkey);
4339
+ else
4340
+ ret = cma_set_default_qkey(id_priv);
43164341 if (ret)
43174342 return ret;
43184343 rep.qp_num = id_priv->qp_num;
....@@ -4516,9 +4541,7 @@
45164541 enum ib_gid_type gid_type;
45174542 struct net_device *ndev;
45184543
4519
- if (!status)
4520
- status = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey));
4521
- else
4544
+ if (status)
45224545 pr_debug_ratelimited("RDMA CM: MULTICAST_ERROR: failed to join multicast. status %d\n",
45234546 status);
45244547
....@@ -4546,7 +4569,7 @@
45464569 }
45474570
45484571 event->param.ud.qp_num = 0xFFFFFF;
4549
- event->param.ud.qkey = be32_to_cpu(multicast->rec.qkey);
4572
+ event->param.ud.qkey = id_priv->qkey;
45504573
45514574 out:
45524575 if (ndev)
....@@ -4565,8 +4588,11 @@
45654588 READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING)
45664589 goto out;
45674590
4568
- cma_make_mc_event(status, id_priv, multicast, &event, mc);
4569
- ret = cma_cm_event_handler(id_priv, &event);
4591
+ ret = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey));
4592
+ if (!ret) {
4593
+ cma_make_mc_event(status, id_priv, multicast, &event, mc);
4594
+ ret = cma_cm_event_handler(id_priv, &event);
4595
+ }
45704596 rdma_destroy_ah_attr(&event.param.ud.ah_attr);
45714597 WARN_ON(ret);
45724598
....@@ -4619,9 +4645,11 @@
46194645 if (ret)
46204646 return ret;
46214647
4622
- ret = cma_set_qkey(id_priv, 0);
4623
- if (ret)
4624
- return ret;
4648
+ if (!id_priv->qkey) {
4649
+ ret = cma_set_default_qkey(id_priv);
4650
+ if (ret)
4651
+ return ret;
4652
+ }
46254653
46264654 cma_set_mgid(id_priv, (struct sockaddr *) &mc->addr, &rec.mgid);
46274655 rec.qkey = cpu_to_be32(id_priv->qkey);
....@@ -4695,7 +4723,7 @@
46954723 int err = 0;
46964724 struct sockaddr *addr = (struct sockaddr *)&mc->addr;
46974725 struct net_device *ndev = NULL;
4698
- struct ib_sa_multicast ib;
4726
+ struct ib_sa_multicast ib = {};
46994727 enum ib_gid_type gid_type;
47004728 bool send_only;
47014729
....@@ -4709,15 +4737,12 @@
47094737 cma_iboe_set_mgid(addr, &ib.rec.mgid, gid_type);
47104738
47114739 ib.rec.pkey = cpu_to_be16(0xffff);
4712
- if (id_priv->id.ps == RDMA_PS_UDP)
4713
- ib.rec.qkey = cpu_to_be32(RDMA_UDP_QKEY);
4714
-
47154740 if (dev_addr->bound_dev_if)
47164741 ndev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
47174742 if (!ndev)
47184743 return -ENODEV;
47194744
4720
- ib.rec.rate = iboe_get_rate(ndev);
4745
+ ib.rec.rate = IB_RATE_PORT_CURRENT;
47214746 ib.rec.hop_limit = 1;
47224747 ib.rec.mtu = iboe_get_mtu(ndev->mtu);
47234748
....@@ -4736,6 +4761,9 @@
47364761 dev_put(ndev);
47374762 if (err || !ib.rec.mtu)
47384763 return err ?: -EINVAL;
4764
+
4765
+ if (!id_priv->qkey)
4766
+ cma_set_default_qkey(id_priv);
47394767
47404768 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr,
47414769 &ib.rec.port_gid);
....@@ -4762,6 +4790,9 @@
47624790 READ_ONCE(id_priv->state) != RDMA_CM_ADDR_RESOLVED))
47634791 return -EINVAL;
47644792
4793
+ if (id_priv->id.qp_type != IB_QPT_UD)
4794
+ return -EINVAL;
4795
+
47654796 mc = kzalloc(sizeof(*mc), GFP_KERNEL);
47664797 if (!mc)
47674798 return -ENOMEM;