@@ -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/*
0 commit comments