diff --git a/include/ofi_util.h b/include/ofi_util.h index bc590bb4d1a..f6a02c06f84 100644 --- a/include/ofi_util.h +++ b/include/ofi_util.h @@ -930,7 +930,8 @@ struct util_peer_addr { union ofi_sock_ip addr; }; -struct util_peer_addr *util_get_peer(struct rxm_av *av, const void *addr); +int util_get_peer(struct rxm_av *av, const void *addr, struct util_peer_addr **peer, + uint64_t flags); void util_put_peer(struct util_peer_addr *peer); /* All peer addresses, whether they've been inserted into the AV diff --git a/prov/rxm/src/rxm_conn.c b/prov/rxm/src/rxm_conn.c index 73b26f2a9f3..e36d17c4ba1 100644 --- a/prov/rxm/src/rxm_conn.c +++ b/prov/rxm/src/rxm_conn.c @@ -657,9 +657,9 @@ rxm_process_connreq(struct rxm_ep *ep, struct rxm_eq_cm_entry *cm_entry) ofi_addr_set_port(&peer_addr.sa, cm_entry->data.connect.port); av = container_of(ep->util_ep.av, struct rxm_av, util_av); - peer = util_get_peer(av, &peer_addr); - if (!peer) { - RXM_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", -FI_ENOMEM); + ret = util_get_peer(av, &peer_addr, &peer, 0); + if (ret) { + RXM_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", ret); goto reject; } diff --git a/prov/tcp/src/xnet_rdm_cm.c b/prov/tcp/src/xnet_rdm_cm.c index 4dfc966505d..5633b5747fc 100644 --- a/prov/tcp/src/xnet_rdm_cm.c +++ b/prov/tcp/src/xnet_rdm_cm.c @@ -438,9 +438,9 @@ static void xnet_process_connreq(struct fi_eq_cm_entry *cm_entry) ofi_addr_set_port(&peer_addr.sa, ntohs(msg->port)); av = container_of(rdm->util_ep.av, struct rxm_av, util_av); - peer = util_get_peer(av, &peer_addr); - if (!peer) { - XNET_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", -FI_ENOMEM); + ret = util_get_peer(av, &peer_addr, &peer, 0); + if (ret) { + XNET_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", ret); goto reject; } diff --git a/prov/util/src/rxm_av.c b/prov/util/src/rxm_av.c index beb11d0620c..67b027fc26d 100644 --- a/prov/util/src/rxm_av.c +++ b/prov/util/src/rxm_av.c @@ -98,23 +98,32 @@ static void rxm_free_peer(struct util_peer_addr *peer) ofi_ibuf_free(peer); } -struct util_peer_addr * -util_get_peer(struct rxm_av *av, const void *addr) + +int util_get_peer(struct rxm_av *av, const void *addr, struct util_peer_addr **peer, + uint64_t flags) { - struct util_peer_addr *peer; struct ofi_rbnode *node; + int ret; ofi_mutex_lock(&av->util_av.lock); node = ofi_rbmap_find(&av->addr_map, (void *) addr); if (node) { - peer = node->data; - peer->refcnt++; + *peer = node->data; + (*peer)->refcnt++; } else { - peer = rxm_alloc_peer(av, addr); - } + if (flags && FI_NO_CONNECT) { + *peer = NULL; + ret = -FI_EHOSTUNREACH; + goto unlock; + } + *peer = rxm_alloc_peer(av, addr); + if (!*peer) + ret = -FI_ENOMEM; + } +unlock: ofi_mutex_unlock(&av->util_av.lock); - return peer; + return peer ? FI_SUCCESS : ret; } static void util_deref_peer(struct util_peer_addr *peer) @@ -165,17 +174,17 @@ rxm_put_peer_addr(struct rxm_av *av, fi_addr_t fi_addr) static int rxm_av_add_peers(struct rxm_av *av, const void *addr, size_t count, - fi_addr_t *fi_addr, fi_addr_t *user_ids) + fi_addr_t *fi_addr, fi_addr_t *user_ids, uint64_t flags) { struct util_peer_addr *peer; const void *cur_addr; fi_addr_t cur_fi_addr; - size_t i; + size_t i, ret; for (i = 0; i < count; i++) { cur_addr = ((char *) addr + i * av->util_av.addrlen); - peer = util_get_peer(av, cur_addr); - if (!peer) + ret = util_get_peer(av, cur_addr, &peer, flags); + if (ret) goto err; if (user_ids) { @@ -206,7 +215,7 @@ rxm_av_add_peers(struct rxm_av *av, const void *addr, size_t count, ofi_mutex_unlock(&av->util_av.lock); } } - return -FI_ENOMEM; + return ret; } static int rxm_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr, @@ -299,7 +308,7 @@ static int rxm_av_insert(struct fid_av *av_fid, const void *addr, size_t count, count = ret; - ret = rxm_av_add_peers(av, addr, count, fi_addr, user_ids); + ret = rxm_av_add_peers(av, addr, count, fi_addr, user_ids, flags); if (ret) { rxm_av_remove(av_fid, fi_addr, count, flags); goto out; @@ -345,7 +354,7 @@ static int rxm_av_insertsym(struct fid_av *av_fid, const char *node, if (ret > 0 && ret < count) count = ret; - ret = rxm_av_add_peers(av, addr, count, fi_addr, NULL); + ret = rxm_av_add_peers(av, addr, count, fi_addr, NULL, flags); if (ret) { rxm_av_remove(av_fid, fi_addr, count, flags); return ret;