From fa7276592a0cc12d651a5b2bd39dd7ca45bc25bf Mon Sep 17 00:00:00 2001 From: Amir Shehata Date: Fri, 1 Apr 2016 10:41:34 -0700 Subject: [PATCH] LU-7734 lnet: handle N NIs to 1 LND peer This patch changes o2iblnd only, as socklnd already handles this case. In the new design you can have multiple NIs communicating to one peer. In the o2ilbnd the kib_peer has a pointer to the NI which implies a 1:1 relationship. This patch changes kiblnd_find_peer_locked() to use the peer NID and the NI NID as the key. This way a new peer will be created for each unique NI/peer_NI pair. This is similar to how socklnd handles this case. Signed-off-by: Amir Shehata Change-Id: Ifab7764489757ea473b15c46c1a22ef9ceeeceea Reviewed-on: http://review.whamcloud.com/19306 Reviewed-by: Doug Oucharek Tested-by: Doug Oucharek --- lnet/klnds/o2iblnd/o2iblnd.c | 13 ++++++++++--- lnet/klnds/o2iblnd/o2iblnd.h | 2 +- lnet/klnds/o2iblnd/o2iblnd_cb.c | 8 ++++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c index 3d5f65b..c07d4d18 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.c +++ b/lnet/klnds/o2iblnd/o2iblnd.c @@ -376,7 +376,7 @@ kiblnd_destroy_peer (kib_peer_t *peer) } kib_peer_t * -kiblnd_find_peer_locked (lnet_nid_t nid) +kiblnd_find_peer_locked(struct lnet_ni *ni, lnet_nid_t nid) { /* the caller is responsible for accounting the additional reference * that this creates */ @@ -389,7 +389,14 @@ kiblnd_find_peer_locked (lnet_nid_t nid) peer = list_entry(tmp, kib_peer_t, ibp_list); LASSERT(!kiblnd_peer_idle(peer)); - if (peer->ibp_nid != nid) + /* + * Match a peer if its NID and the NID of the local NI it + * communicates over are the same. Otherwise don't match + * the peer, which will result in a new lnd peer being + * created. + */ + if (peer->ibp_nid != nid || + peer->ibp_ni->ni_nid != ni->ni_nid) continue; CDEBUG(D_NET, "got peer [%p] -> %s (%d) version: %x\n", @@ -1149,7 +1156,7 @@ kiblnd_query(lnet_ni_t *ni, lnet_nid_t nid, cfs_time_t *when) read_lock_irqsave(glock, flags); - peer = kiblnd_find_peer_locked(nid); + peer = kiblnd_find_peer_locked(ni, nid); if (peer != NULL) last_alive = peer->ibp_last_alive; diff --git a/lnet/klnds/o2iblnd/o2iblnd.h b/lnet/klnds/o2iblnd/o2iblnd.h index c398b84..feb8ef3 100644 --- a/lnet/klnds/o2iblnd/o2iblnd.h +++ b/lnet/klnds/o2iblnd/o2iblnd.h @@ -1184,7 +1184,7 @@ void kiblnd_destroy_peer (kib_peer_t *peer); bool kiblnd_reconnect_peer(kib_peer_t *peer); void kiblnd_destroy_dev (kib_dev_t *dev); void kiblnd_unlink_peer_locked (kib_peer_t *peer); -kib_peer_t *kiblnd_find_peer_locked (lnet_nid_t nid); +kib_peer_t *kiblnd_find_peer_locked(struct lnet_ni *ni, lnet_nid_t nid); int kiblnd_close_stale_conns_locked (kib_peer_t *peer, int version, __u64 incarnation); int kiblnd_close_peer_conns_locked (kib_peer_t *peer, int why); diff --git a/lnet/klnds/o2iblnd/o2iblnd_cb.c b/lnet/klnds/o2iblnd/o2iblnd_cb.c index d352dd3..41b9cdb 100644 --- a/lnet/klnds/o2iblnd/o2iblnd_cb.c +++ b/lnet/klnds/o2iblnd/o2iblnd_cb.c @@ -1379,7 +1379,7 @@ kiblnd_launch_tx (lnet_ni_t *ni, kib_tx_t *tx, lnet_nid_t nid) * connected */ read_lock_irqsave(g_lock, flags); - peer = kiblnd_find_peer_locked(nid); + peer = kiblnd_find_peer_locked(ni, nid); if (peer != NULL && !list_empty(&peer->ibp_conns)) { /* Found a peer with an established connection */ conn = kiblnd_get_conn_locked(peer); @@ -1397,7 +1397,7 @@ kiblnd_launch_tx (lnet_ni_t *ni, kib_tx_t *tx, lnet_nid_t nid) /* Re-try with a write lock */ write_lock(g_lock); - peer = kiblnd_find_peer_locked(nid); + peer = kiblnd_find_peer_locked(ni, nid); if (peer != NULL) { if (list_empty(&peer->ibp_conns)) { /* found a peer, but it's still connecting... */ @@ -1435,7 +1435,7 @@ kiblnd_launch_tx (lnet_ni_t *ni, kib_tx_t *tx, lnet_nid_t nid) write_lock_irqsave(g_lock, flags); - peer2 = kiblnd_find_peer_locked(nid); + peer2 = kiblnd_find_peer_locked(ni, nid); if (peer2 != NULL) { if (list_empty(&peer2->ibp_conns)) { /* found a peer, but it's still connecting... */ @@ -2377,7 +2377,7 @@ kiblnd_passive_connect(struct rdma_cm_id *cmid, void *priv, int priv_nob) write_lock_irqsave(g_lock, flags); - peer2 = kiblnd_find_peer_locked(nid); + peer2 = kiblnd_find_peer_locked(ni, nid); if (peer2 != NULL) { if (peer2->ibp_version == 0) { peer2->ibp_version = version; -- 1.8.3.1