Skip to content

Commit 0b3ca76

Browse files
haggaiedledford
authored andcommitted
IB/cma: Use found net_dev for passive connections
When receiving a new connection in cma_req_handler, we actually already know the net_dev that is used for the connection's creation. Instead of calling cma_translate_addr to resolve the new connection id's source address, just use the net_dev that was found. Signed-off-by: Haggai Eran <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent f887f2a commit 0b3ca76

File tree

1 file changed

+49
-27
lines changed
  • drivers/infiniband/core

1 file changed

+49
-27
lines changed

drivers/infiniband/core/cma.c

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,33 +1277,31 @@ static struct rdma_id_private *cma_find_listener(
12771277
}
12781278

12791279
static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id,
1280-
struct ib_cm_event *ib_event)
1280+
struct ib_cm_event *ib_event,
1281+
struct net_device **net_dev)
12811282
{
12821283
struct cma_req_info req;
12831284
struct rdma_bind_list *bind_list;
12841285
struct rdma_id_private *id_priv;
1285-
struct net_device *net_dev;
12861286
int err;
12871287

12881288
err = cma_save_req_info(ib_event, &req);
12891289
if (err)
12901290
return ERR_PTR(err);
12911291

1292-
net_dev = cma_get_net_dev(ib_event, &req);
1293-
if (IS_ERR(net_dev)) {
1294-
if (PTR_ERR(net_dev) == -EAFNOSUPPORT) {
1292+
*net_dev = cma_get_net_dev(ib_event, &req);
1293+
if (IS_ERR(*net_dev)) {
1294+
if (PTR_ERR(*net_dev) == -EAFNOSUPPORT) {
12951295
/* Assuming the protocol is AF_IB */
1296-
net_dev = NULL;
1296+
*net_dev = NULL;
12971297
} else {
1298-
return ERR_CAST(net_dev);
1298+
return ERR_CAST(*net_dev);
12991299
}
13001300
}
13011301

13021302
bind_list = cma_ps_find(rdma_ps_from_service_id(req.service_id),
13031303
cma_port_from_service_id(req.service_id));
1304-
id_priv = cma_find_listener(bind_list, cm_id, ib_event, &req, net_dev);
1305-
1306-
dev_put(net_dev);
1304+
id_priv = cma_find_listener(bind_list, cm_id, ib_event, &req, *net_dev);
13071305

13081306
return id_priv;
13091307
}
@@ -1553,7 +1551,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
15531551
}
15541552

15551553
static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
1556-
struct ib_cm_event *ib_event)
1554+
struct ib_cm_event *ib_event,
1555+
struct net_device *net_dev)
15571556
{
15581557
struct rdma_id_private *id_priv;
15591558
struct rdma_cm_id *id;
@@ -1585,14 +1584,16 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
15851584
if (rt->num_paths == 2)
15861585
rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
15871586

1588-
if (cma_any_addr(cma_src_addr(id_priv))) {
1589-
rt->addr.dev_addr.dev_type = ARPHRD_INFINIBAND;
1590-
rdma_addr_set_sgid(&rt->addr.dev_addr, &rt->path_rec[0].sgid);
1591-
ib_addr_set_pkey(&rt->addr.dev_addr, be16_to_cpu(rt->path_rec[0].pkey));
1592-
} else {
1593-
ret = cma_translate_addr(cma_src_addr(id_priv), &rt->addr.dev_addr);
1587+
if (net_dev) {
1588+
ret = rdma_copy_addr(&rt->addr.dev_addr, net_dev, NULL);
15941589
if (ret)
15951590
goto err;
1591+
} else {
1592+
/* An AF_IB connection */
1593+
WARN_ON_ONCE(ss_family != AF_IB);
1594+
1595+
cma_translate_ib((struct sockaddr_ib *)cma_src_addr(id_priv),
1596+
&rt->addr.dev_addr);
15961597
}
15971598
rdma_addr_set_dgid(&rt->addr.dev_addr, &rt->path_rec[0].dgid);
15981599

@@ -1605,7 +1606,8 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
16051606
}
16061607

16071608
static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
1608-
struct ib_cm_event *ib_event)
1609+
struct ib_cm_event *ib_event,
1610+
struct net_device *net_dev)
16091611
{
16101612
struct rdma_id_private *id_priv;
16111613
struct rdma_cm_id *id;
@@ -1624,10 +1626,18 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
16241626
ib_event->param.sidr_req_rcvd.service_id))
16251627
goto err;
16261628

1627-
if (!cma_any_addr((struct sockaddr *) &id->route.addr.src_addr)) {
1628-
ret = cma_translate_addr(cma_src_addr(id_priv), &id->route.addr.dev_addr);
1629+
if (net_dev) {
1630+
ret = rdma_copy_addr(&id->route.addr.dev_addr, net_dev, NULL);
16291631
if (ret)
16301632
goto err;
1633+
} else {
1634+
/* An AF_IB connection */
1635+
WARN_ON_ONCE(ss_family != AF_IB);
1636+
1637+
if (!cma_any_addr(cma_src_addr(id_priv)))
1638+
cma_translate_ib((struct sockaddr_ib *)
1639+
cma_src_addr(id_priv),
1640+
&id->route.addr.dev_addr);
16311641
}
16321642

16331643
id_priv->state = RDMA_CM_CONNECT;
@@ -1665,28 +1675,33 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
16651675
{
16661676
struct rdma_id_private *listen_id, *conn_id;
16671677
struct rdma_cm_event event;
1678+
struct net_device *net_dev;
16681679
int offset, ret;
16691680

1670-
listen_id = cma_id_from_event(cm_id, ib_event);
1681+
listen_id = cma_id_from_event(cm_id, ib_event, &net_dev);
16711682
if (IS_ERR(listen_id))
16721683
return PTR_ERR(listen_id);
16731684

1674-
if (!cma_check_req_qp_type(&listen_id->id, ib_event))
1675-
return -EINVAL;
1685+
if (!cma_check_req_qp_type(&listen_id->id, ib_event)) {
1686+
ret = -EINVAL;
1687+
goto net_dev_put;
1688+
}
16761689

1677-
if (cma_disable_callback(listen_id, RDMA_CM_LISTEN))
1678-
return -ECONNABORTED;
1690+
if (cma_disable_callback(listen_id, RDMA_CM_LISTEN)) {
1691+
ret = -ECONNABORTED;
1692+
goto net_dev_put;
1693+
}
16791694

16801695
memset(&event, 0, sizeof event);
16811696
offset = cma_user_data_offset(listen_id);
16821697
event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
16831698
if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) {
1684-
conn_id = cma_new_udp_id(&listen_id->id, ib_event);
1699+
conn_id = cma_new_udp_id(&listen_id->id, ib_event, net_dev);
16851700
event.param.ud.private_data = ib_event->private_data + offset;
16861701
event.param.ud.private_data_len =
16871702
IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset;
16881703
} else {
1689-
conn_id = cma_new_conn_id(&listen_id->id, ib_event);
1704+
conn_id = cma_new_conn_id(&listen_id->id, ib_event, net_dev);
16901705
cma_set_req_event_data(&event, &ib_event->param.req_rcvd,
16911706
ib_event->private_data, offset);
16921707
}
@@ -1724,6 +1739,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
17241739
mutex_unlock(&conn_id->handler_mutex);
17251740
mutex_unlock(&listen_id->handler_mutex);
17261741
cma_deref_id(conn_id);
1742+
if (net_dev)
1743+
dev_put(net_dev);
17271744
return 0;
17281745

17291746
err3:
@@ -1737,6 +1754,11 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
17371754
mutex_unlock(&listen_id->handler_mutex);
17381755
if (conn_id)
17391756
rdma_destroy_id(&conn_id->id);
1757+
1758+
net_dev_put:
1759+
if (net_dev)
1760+
dev_put(net_dev);
1761+
17401762
return ret;
17411763
}
17421764

0 commit comments

Comments
 (0)