@@ -367,16 +367,15 @@ int smr_map_to_region(const struct fi_provider *prov, struct smr_map *map,
367367 }
368368 pthread_mutex_unlock (& ep_list_lock );
369369
370- ofi_spin_lock (& map -> lock );
371370 if (peer_buf -> region )
372- goto unlock ;
371+ return FI_SUCCESS ;
373372
373+ assert (ofi_spin_held (& map -> lock ));
374374 fd = shm_open (name , O_RDWR , S_IRUSR | S_IWUSR );
375375 if (fd < 0 ) {
376- ret = - errno ;
377376 FI_WARN_ONCE (prov , FI_LOG_AV ,
378377 "shm_open error: name %s errno %d\n" , name , errno );
379- goto unlock ;
378+ return - errno ;
380379 }
381380
382381 memset (tmp , 0 , sizeof (tmp ));
@@ -437,8 +436,6 @@ int smr_map_to_region(const struct fi_provider *prov, struct smr_map *map,
437436
438437out :
439438 close (fd );
440- unlock :
441- ofi_spin_unlock (& map -> lock );
442439 return ret ;
443440}
444441
@@ -448,6 +445,7 @@ void smr_map_to_endpoint(struct smr_region *region, int64_t id)
448445 struct smr_region * peer_smr ;
449446 struct smr_peer_data * local_peers ;
450447
448+ assert (ofi_spin_held (& region -> map -> lock ));
451449 peer_smr = smr_peer_region (region , id );
452450 if (region -> map -> peers [id ].peer .id < 0 || !peer_smr )
453451 return ;
@@ -479,32 +477,81 @@ void smr_map_to_endpoint(struct smr_region *region, int64_t id)
479477 return ;
480478}
481479
480+ void smr_unmap_region (const struct fi_provider * prov , struct smr_map * map ,
481+ int64_t peer_id , bool local )
482+ {
483+ struct smr_region * peer_region ;
484+ struct smr_peer * peer ;
485+ struct util_ep * util_ep ;
486+ struct smr_ep * smr_ep ;
487+ struct smr_av * av ;
488+ int ret = 0 ;
489+
490+ assert (ofi_spin_held (& map -> lock ));
491+ peer_region = map -> peers [peer_id ].region ;
492+ if (!peer_region )
493+ return ;
494+
495+ peer = & map -> peers [peer_id ];
496+ av = container_of (map , struct smr_av , smr_map );
497+ dlist_foreach_container (& av -> util_av .ep_list , struct util_ep , util_ep ,
498+ av_entry ) {
499+ smr_ep = container_of (util_ep , struct smr_ep , util_ep );
500+ smr_unmap_from_endpoint (smr_ep -> region , peer_id );
501+ }
502+
503+ /* Don't unmap memory owned by this pid because the endpoint it belongs
504+ * to might still be active.
505+ */
506+ if (local )
507+ return ;
508+
509+ if (map -> flags & SMR_FLAG_HMEM_ENABLED ) {
510+ ret = ofi_hmem_host_unregister (peer_region );
511+ if (ret )
512+ FI_WARN (prov , FI_LOG_EP_CTRL ,
513+ "unable to unregister shm with iface\n" );
514+
515+ if (peer -> pid_fd != -1 ) {
516+ close (peer -> pid_fd );
517+ peer -> pid_fd = -1 ;
518+ }
519+ }
520+
521+ munmap (peer_region , peer_region -> total_size );
522+ peer -> region = NULL ;
523+ }
524+
482525void smr_unmap_from_endpoint (struct smr_region * region , int64_t id )
483526{
484527 struct smr_region * peer_smr ;
485528 struct smr_peer_data * local_peers , * peer_peers ;
486529 int64_t peer_id ;
487530
488- local_peers = smr_peer_data (region );
489531 if (region -> map -> peers [id ].peer .id < 0 )
490532 return ;
491533
492534 peer_smr = smr_peer_region (region , id );
493- peer_id = smr_peer_data (region )[id ].addr .id ;
494-
535+ assert (peer_smr );
495536 peer_peers = smr_peer_data (peer_smr );
537+ peer_id = smr_peer_data (region )[id ].addr .id ;
496538
497539 peer_peers [peer_id ].addr .id = -1 ;
498540 peer_peers [peer_id ].name_sent = 0 ;
499541
542+ local_peers = smr_peer_data (region );
500543 ofi_xpmem_release (& local_peers [peer_id ].xpmem );
501544}
502545
503546void smr_exchange_all_peers (struct smr_region * region )
504547{
505548 int64_t i ;
549+
550+ ofi_spin_lock (& region -> map -> lock );
506551 for (i = 0 ; i < SMR_MAX_PEERS ; i ++ )
507552 smr_map_to_endpoint (region , i );
553+
554+ ofi_spin_unlock (& region -> map -> lock );
508555}
509556
510557int smr_map_add (const struct fi_provider * prov , struct smr_map * map ,
@@ -546,37 +593,24 @@ int smr_map_add(const struct fi_provider *prov, struct smr_map *map,
546593
547594void smr_map_del (struct smr_map * map , int64_t id )
548595{
549- struct dlist_entry * entry ;
596+ struct smr_ep_name * name ;
597+ bool local = false;
550598
551599 assert (id >= 0 && id < SMR_MAX_PEERS );
552-
553600 pthread_mutex_lock (& ep_list_lock );
554- entry = dlist_find_first_match (& ep_name_list , smr_match_name ,
555- smr_no_prefix (map -> peers [id ].peer .name ));
601+ dlist_foreach_container (& ep_name_list , struct smr_ep_name , name , entry ) {
602+ if (strcmp (name -> name , map -> peers [id ].peer .name )) {
603+ local = true;
604+ break ;
605+ }
606+ }
556607 pthread_mutex_unlock (& ep_list_lock );
557-
558608 ofi_spin_lock (& map -> lock );
559- (void ) ofi_rbmap_find_delete (& map -> rbmap ,
560- (void * ) map -> peers [id ].peer .name );
561-
609+ smr_unmap_region (& smr_prov , map , id , local );
562610 map -> peers [id ].fiaddr = FI_ADDR_NOTAVAIL ;
563611 map -> peers [id ].peer .id = -1 ;
564612 map -> num_peers -- ;
565-
566- if (!map -> peers [id ].region )
567- goto unlock ;
568-
569- if (!entry ) {
570- if (map -> flags & SMR_FLAG_HMEM_ENABLED ) {
571- if (map -> peers [id ].pid_fd != -1 )
572- close (map -> peers [id ].pid_fd );
573-
574- (void ) ofi_hmem_host_unregister (map -> peers [id ].region );
575- }
576- munmap (map -> peers [id ].region , map -> peers [id ].region -> total_size );
577- map -> peers [id ].region = NULL ;
578- }
579- unlock :
613+ ofi_rbmap_find_delete (& map -> rbmap , map -> peers [id ].peer .name );
580614 ofi_spin_unlock (& map -> lock );
581615}
582616
0 commit comments