Skip to content

Commit 0c66ae0

Browse files
sunkuamznshijin-aws
authored andcommitted
Revert "prov/efa: Decouple AV entry from endpoint"
This reverts commit c3f9e21. Signed-off-by: Sai Sunku <[email protected]>
1 parent d0d2725 commit 0c66ae0

File tree

13 files changed

+39
-163
lines changed

13 files changed

+39
-163
lines changed

fabtests/pytest/efa/test_multi_ep.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,10 @@
22

33
@pytest.mark.functional
44
@pytest.mark.parametrize("shared_cq", [True, False])
5-
def test_multi_ep_cq(cmdline_args, shared_cq):
5+
def test_multi_ep(cmdline_args, shared_cq):
66
from common import ClientServerTest
77
cmd = "fi_multi_ep -e rdm"
88
if shared_cq:
99
cmd += " -Q"
1010
test = ClientServerTest(cmdline_args, cmd)
1111
test.run()
12-
13-
@pytest.mark.functional
14-
def test_multi_ep_av(cmdline_args):
15-
from common import ClientServerTest
16-
cmd = "fi_multi_ep -e rdm -A"
17-
test = ClientServerTest(cmdline_args, cmd)
18-
test.run()

prov/efa/src/efa_av.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ void efa_ah_release(struct efa_av *av, struct efa_ah *ah)
243243
}
244244
}
245245

246+
static
247+
void efa_conn_release(struct efa_av *av, struct efa_conn *conn);
248+
246249
/**
247250
* @brief initialize the rdm related resources of an efa_conn object
248251
*
@@ -263,11 +266,18 @@ int efa_conn_rdm_init(struct efa_av *av, struct efa_conn *conn, bool insert_shm_
263266
int err, ret;
264267
char smr_name[EFA_SHM_NAME_MAX];
265268
size_t smr_name_len;
269+
struct efa_rdm_ep *efa_rdm_ep;
270+
struct efa_rdm_peer *peer;
266271

267272
assert(av->ep_type == FI_EP_RDM);
268273
assert(conn->ep_addr);
269274

270-
conn->shm_fi_addr = FI_ADDR_NOTAVAIL;
275+
/* currently multiple EP bind to same av is not supported */
276+
assert(!dlist_empty(&av->util_av.ep_list));
277+
efa_rdm_ep = container_of(av->util_av.ep_list.next, struct efa_rdm_ep, base_ep.util_ep.av_entry);
278+
279+
peer = &conn->rdm_peer;
280+
efa_rdm_peer_construct(peer, efa_rdm_ep, conn);
271281

272282
/*
273283
* The efa_conn_rdm_init() call can be made in two situations:
@@ -305,8 +315,8 @@ int efa_conn_rdm_init(struct efa_av *av, struct efa_conn *conn, bool insert_shm_
305315
* av. The efa provider should still use peer->shm_fiaddr for transmissions
306316
* through shm ep.
307317
*/
308-
conn->shm_fi_addr = conn->fi_addr;
309-
ret = fi_av_insert(av->shm_rdm_av, smr_name, 1, &conn->shm_fi_addr, FI_AV_USER_ID, NULL);
318+
peer->shm_fiaddr = conn->fi_addr;
319+
ret = fi_av_insert(av->shm_rdm_av, smr_name, 1, &peer->shm_fiaddr, FI_AV_USER_ID, NULL);
310320
if (OFI_UNLIKELY(ret != 1)) {
311321
EFA_WARN(FI_LOG_AV,
312322
"Failed to insert address to shm provider's av: %s\n",
@@ -316,10 +326,11 @@ int efa_conn_rdm_init(struct efa_av *av, struct efa_conn *conn, bool insert_shm_
316326

317327
EFA_INFO(FI_LOG_AV,
318328
"Successfully inserted %s to shm provider's av. efa_fiaddr: %ld shm_fiaddr = %ld\n",
319-
smr_name, conn->fi_addr, conn->shm_fi_addr);
329+
smr_name, conn->fi_addr, peer->shm_fiaddr);
320330

321-
assert(conn->shm_fi_addr < efa_env.shm_av_size);
331+
assert(peer->shm_fiaddr < efa_env.shm_av_size);
322332
av->shm_used++;
333+
peer->is_local = 1;
323334
}
324335

325336
return 0;
@@ -339,29 +350,26 @@ void efa_conn_rdm_deinit(struct efa_av *av, struct efa_conn *conn)
339350
int err;
340351
struct efa_rdm_peer *peer;
341352
struct efa_rdm_ep *ep;
342-
struct dlist_entry *entry, *tmp;
343353

344354
assert(av->ep_type == FI_EP_RDM);
345355

346356
peer = &conn->rdm_peer;
347-
if (conn->shm_fi_addr != FI_ADDR_NOTAVAIL && av->shm_rdm_av) {
348-
err = fi_av_remove(av->shm_rdm_av, &conn->shm_fi_addr, 1, 0);
357+
if (peer->is_local && av->shm_rdm_av) {
358+
err = fi_av_remove(av->shm_rdm_av, &peer->shm_fiaddr, 1, 0);
349359
if (err) {
350360
EFA_WARN(FI_LOG_AV, "remove address from shm av failed! err=%d\n", err);
351361
} else {
352362
av->shm_used--;
353-
assert(conn->shm_fi_addr < efa_env.shm_av_size);
363+
assert(peer->shm_fiaddr < efa_env.shm_av_size);
354364
}
355365
}
356366

357-
dlist_foreach_safe(&av->util_av.ep_list, entry, tmp) {
358-
ep = container_of(entry, struct efa_rdm_ep, base_ep.util_ep.av_entry);
359-
peer = efa_rdm_peer_map_lookup(&ep->fi_addr_to_peer_map, conn->fi_addr);
360-
if (peer) {
361-
efa_rdm_peer_destruct(peer, ep);
362-
efa_rdm_peer_map_remove(&ep->fi_addr_to_peer_map, conn->fi_addr, peer);
363-
}
364-
}
367+
/*
368+
* We need peer->shm_fiaddr to remove shm address from shm av table,
369+
* so efa_rdm_peer_clear must be after removing shm av table.
370+
*/
371+
ep = dlist_empty(&av->util_av.ep_list) ? NULL : container_of(av->util_av.ep_list.next, struct efa_rdm_ep, base_ep.util_ep.av_entry);
372+
efa_rdm_peer_destruct(peer, ep);
365373
}
366374

367375
/*

prov/efa/src/efa_av.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ struct efa_conn {
2727
fi_addr_t fi_addr;
2828
fi_addr_t util_av_fi_addr;
2929
struct efa_rdm_peer rdm_peer;
30-
fi_addr_t shm_fi_addr;
3130
};
3231

3332
struct efa_av_entry {
@@ -61,6 +60,7 @@ struct efa_prv_reverse_av {
6160
struct efa_av {
6261
struct fid_av *shm_rdm_av;
6362
struct efa_domain *domain;
63+
struct efa_base_ep *base_ep;
6464
size_t used;
6565
size_t shm_used;
6666
enum fi_av_type type;

prov/efa/src/efa_base_ep.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88

99
int efa_base_ep_bind_av(struct efa_base_ep *base_ep, struct efa_av *av)
1010
{
11+
/*
12+
* Binding multiple endpoints to a single AV is currently not
13+
* supported.
14+
*/
15+
if (av->base_ep) {
16+
EFA_WARN(FI_LOG_EP_CTRL,
17+
"Address vector already has endpoint bound to it.\n");
18+
return -FI_ENOSYS;
19+
}
1120
if (base_ep->domain != av->domain) {
1221
EFA_WARN(FI_LOG_EP_CTRL,
1322
"Address vector doesn't belong to same domain as EP.\n");
@@ -20,6 +29,7 @@ int efa_base_ep_bind_av(struct efa_base_ep *base_ep, struct efa_av *av)
2029
}
2130

2231
base_ep->av = av;
32+
base_ep->av->base_ep = base_ep;
2333

2434
return 0;
2535
}

prov/efa/src/efa_errno.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,7 @@
107107
_(4123, WRITE_SHM_CQ_ENTRY, Failure to write CQ entry for SHM operation) \
108108
_(4124, ESTABLISHED_RECV_UNRESP, Unresponsive receiver (connection previously established)) \
109109
_(4125, INVALID_PKT_TYPE_ZCPY_RX, Invalid packet type received when zero copy recv mode is ON) \
110-
_(4126, UNESTABLISHED_RECV_UNRESP, Unresponsive receiver (reachable by EFA device but handshake failed)) \
111-
_(4127, PEER_MAP_ENTRY_POOL_EXHAUSTED, Peer map entry pool exhausted)
110+
_(4126, UNESTABLISHED_RECV_UNRESP, Unresponsive receiver (reachable by EFA device but handshake failed))
112111

113112
/** @} */
114113

prov/efa/src/rdm/efa_rdm_ep.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ struct efa_rdm_ep_queued_copy {
4040
#define EFA_RDM_EP_MAX_WR_PER_IBV_POST_SEND (4096)
4141
#define EFA_RDM_EP_MAX_WR_PER_IBV_POST_RECV (8192)
4242

43-
struct efa_rdm_peer_map {
44-
struct efa_rdm_peer_map_entry *head;
45-
};
46-
4743
struct efa_rdm_ep {
4844
struct efa_base_ep base_ep;
4945

@@ -189,9 +185,6 @@ struct efa_rdm_ep {
189185
struct dlist_entry entry;
190186
/* the count of opes queued before handshake is made with their peers */
191187
size_t ope_queued_before_handshake_cnt;
192-
193-
struct ofi_bufpool *peer_map_entry_pool; /* bufpool to hold fi_addr->efa_rdm_peer key-value pairs */
194-
struct efa_rdm_peer_map fi_addr_to_peer_map; /* Hashmap to find efa_rdm_peer given fi_addr */
195188
};
196189

197190
int efa_rdm_ep_flush_queued_blocking_copy_to_hmem(struct efa_rdm_ep *ep);

prov/efa/src/rdm/efa_rdm_ep_fiops.c

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -307,18 +307,7 @@ int efa_rdm_ep_create_buffer_pools(struct efa_rdm_ep *ep)
307307
if (ret)
308308
goto err_free;
309309

310-
ret = ofi_bufpool_create(&ep->peer_map_entry_pool,
311-
sizeof(struct efa_rdm_peer_map_entry),
312-
EFA_RDM_BUFPOOL_ALIGNMENT,
313-
0, /* no limit to max cnt */
314-
/* Don't track usage, because endpoint can be closed without removing entries from AV */
315-
EFA_MIN_AV_SIZE, OFI_BUFPOOL_NO_TRACK);
316-
if (ret)
317-
goto err_free;
318-
319310
efa_rdm_rxe_map_construct(&ep->rxe_map);
320-
efa_rdm_peer_map_construct(&ep->fi_addr_to_peer_map);
321-
322311
return 0;
323312

324313
err_free:
@@ -352,9 +341,6 @@ int efa_rdm_ep_create_buffer_pools(struct efa_rdm_ep *ep)
352341
if (ep->efa_tx_pkt_pool)
353342
ofi_bufpool_destroy(ep->efa_tx_pkt_pool);
354343

355-
if (ep->peer_map_entry_pool)
356-
ofi_bufpool_destroy(ep->peer_map_entry_pool);
357-
358344
return ret;
359345
}
360346

@@ -842,9 +828,6 @@ static void efa_rdm_ep_destroy_buffer_pools(struct efa_rdm_ep *efa_rdm_ep)
842828

843829
if (efa_rdm_ep->rx_atomrsp_pool)
844830
ofi_bufpool_destroy(efa_rdm_ep->rx_atomrsp_pool);
845-
846-
if (efa_rdm_ep->peer_map_entry_pool)
847-
ofi_bufpool_destroy(efa_rdm_ep->peer_map_entry_pool);
848831
}
849832

850833
/*

prov/efa/src/rdm/efa_rdm_ep_utils.c

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,26 +56,14 @@ struct efa_rdm_peer *efa_rdm_ep_get_peer(struct efa_rdm_ep *ep, fi_addr_t addr)
5656
{
5757
struct util_av_entry *util_av_entry;
5858
struct efa_av_entry *av_entry;
59-
struct efa_rdm_peer *peer;
6059

6160
if (OFI_UNLIKELY(addr == FI_ADDR_NOTAVAIL))
6261
return NULL;
6362

64-
peer = efa_rdm_peer_map_lookup(&ep->fi_addr_to_peer_map, addr);
65-
if (peer)
66-
return peer;
67-
6863
util_av_entry = ofi_bufpool_get_ibuf(ep->base_ep.util_ep.av->av_entry_pool,
6964
addr);
7065
av_entry = (struct efa_av_entry *)util_av_entry->data;
71-
72-
if (av_entry->conn.ep_addr) {
73-
peer = efa_rdm_peer_map_insert(&ep->fi_addr_to_peer_map, addr, ep);
74-
efa_rdm_peer_construct(peer, ep, &av_entry->conn);
75-
return peer;
76-
}
77-
78-
return NULL;
66+
return av_entry->conn.ep_addr ? &av_entry->conn.rdm_peer : NULL;
7967
}
8068

8169
/**

prov/efa/src/rdm/efa_rdm_peer.c

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ void efa_rdm_peer_construct(struct efa_rdm_peer *peer, struct efa_rdm_ep *ep, st
3131
dlist_init(&peer->txe_list);
3232
dlist_init(&peer->rxe_list);
3333
dlist_init(&peer->overflow_pke_list);
34-
35-
if (conn->shm_fi_addr != FI_ADDR_NOTAVAIL) {
36-
peer->shm_fiaddr = conn->shm_fi_addr;
37-
peer->is_local = 1;
38-
}
3934
}
4035

4136
/**
@@ -116,41 +111,6 @@ void efa_rdm_peer_destruct(struct efa_rdm_peer *peer, struct efa_rdm_ep *ep)
116111
#endif
117112
}
118113

119-
struct efa_rdm_peer *efa_rdm_peer_map_insert(struct efa_rdm_peer_map *peer_map, fi_addr_t addr, struct efa_rdm_ep *ep) {
120-
struct efa_rdm_peer_map_entry *map_entry;
121-
struct efa_rdm_peer *peer;
122-
123-
map_entry = ofi_buf_alloc(ep->peer_map_entry_pool);
124-
if (OFI_UNLIKELY(!map_entry)) {
125-
EFA_WARN(FI_LOG_CQ,
126-
"Map entries for EFA AV to peer mapping exhausted.\n");
127-
efa_base_ep_write_eq_error(&ep->base_ep, FI_ENOBUFS, FI_EFA_ERR_PEER_MAP_ENTRY_POOL_EXHAUSTED);
128-
return NULL;
129-
}
130-
131-
map_entry->key = addr;
132-
peer = &map_entry->efa_rdm_peer;
133-
134-
HASH_ADD(hh, peer_map->head, key, sizeof(addr), map_entry);
135-
136-
return peer;
137-
}
138-
139-
struct efa_rdm_peer *efa_rdm_peer_map_lookup(struct efa_rdm_peer_map *peer_map, fi_addr_t addr) {
140-
struct efa_rdm_peer_map_entry *map_entry;
141-
142-
HASH_FIND(hh, peer_map->head, &addr, sizeof(addr), map_entry);
143-
return map_entry ? &map_entry->efa_rdm_peer : NULL;
144-
}
145-
146-
void efa_rdm_peer_map_remove(struct efa_rdm_peer_map *peer_map, fi_addr_t addr, struct efa_rdm_peer *peer) {
147-
struct efa_rdm_peer_map_entry *map_entry;
148-
149-
HASH_FIND(hh, peer_map->head, &addr, sizeof(addr), map_entry);
150-
HASH_DEL(peer_map->head, map_entry);
151-
ofi_buf_free(map_entry);
152-
}
153-
154114
/**
155115
* @brief run incoming packet_entry through reorder buffer
156116
* queue the packet entry if msg_id is larger than expected.

prov/efa/src/rdm/efa_rdm_peer.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,6 @@ struct efa_rdm_peer {
7575
struct efa_rdm_peer_user_recv_qp user_recv_qp;
7676
};
7777

78-
struct efa_rdm_peer_map_entry {
79-
uint64_t key;
80-
struct efa_rdm_peer efa_rdm_peer;
81-
UT_hash_handle hh;
82-
};
83-
8478
/**
8579
* @brief check for peer's RDMA_READ support, assuming HANDSHAKE has already occurred
8680
*
@@ -292,12 +286,6 @@ bool efa_both_support_zero_hdr_data_transfer(struct efa_rdm_ep *ep, struct efa_r
292286
(peer->extra_info[0] & EFA_RDM_EXTRA_FEATURE_REQUEST_USER_RECV_QP));
293287
}
294288

295-
static inline
296-
void efa_rdm_peer_map_construct(struct efa_rdm_peer_map *peer_map)
297-
{
298-
peer_map->head = NULL;
299-
}
300-
301289
struct efa_conn;
302290

303291
void efa_rdm_peer_construct(struct efa_rdm_peer *peer, struct efa_rdm_ep *ep, struct efa_conn *conn);
@@ -316,10 +304,4 @@ size_t efa_rdm_peer_get_runt_size(struct efa_rdm_peer *peer, struct efa_rdm_ep *
316304

317305
int efa_rdm_peer_select_readbase_rtm(struct efa_rdm_peer *peer, struct efa_rdm_ep *ep, struct efa_rdm_ope *ope);
318306

319-
struct efa_rdm_peer *efa_rdm_peer_map_insert(struct efa_rdm_peer_map *peer_map, fi_addr_t addr, struct efa_rdm_ep *ep);
320-
321-
struct efa_rdm_peer *efa_rdm_peer_map_lookup(struct efa_rdm_peer_map *peer_map, fi_addr_t addr);
322-
323-
void efa_rdm_peer_map_remove(struct efa_rdm_peer_map *peer_map, fi_addr_t addr, struct efa_rdm_peer *peer);
324-
325307
#endif /* EFA_RDM_PEER_H */

0 commit comments

Comments
 (0)