@@ -154,9 +154,6 @@ const struct verbs_ep_domain verbs_dgram_domain = {
154
154
.protocol = FI_PROTO_UNSPEC ,
155
155
};
156
156
157
- /* The list (not thread safe) is populated once when the provider is initialized */
158
- DEFINE_LIST (verbs_devs );
159
-
160
157
int vrb_check_ep_attr (const struct fi_info * hints ,
161
158
const struct fi_info * info )
162
159
{
@@ -877,7 +874,7 @@ static int vrb_alloc_info(struct ibv_context *ctx, struct fi_info **info,
877
874
return ret ;
878
875
}
879
876
880
- static void verbs_devs_print (void )
877
+ static void verbs_devs_print (struct dlist_entry * verbs_devs )
881
878
{
882
879
struct verbs_dev_info * dev ;
883
880
struct verbs_addr * addr ;
@@ -886,7 +883,7 @@ static void verbs_devs_print(void)
886
883
887
884
FI_INFO (& vrb_prov , FI_LOG_FABRIC ,
888
885
"list of verbs devices found for FI_EP_MSG:\n" );
889
- dlist_foreach_container (& verbs_devs , struct verbs_dev_info ,
886
+ dlist_foreach_container (verbs_devs , struct verbs_dev_info ,
890
887
dev , entry ) {
891
888
FI_INFO (& vrb_prov , FI_LOG_FABRIC ,
892
889
"#%d %s - IPoIB addresses:\n" , ++ i , dev -> name );
@@ -1186,7 +1183,7 @@ static int vrb_getifaddrs(struct dlist_entry *verbs_devs)
1186
1183
num_verbs_ifs ++ ;
1187
1184
}
1188
1185
1189
- verbs_devs_print ();
1186
+ verbs_devs_print (verbs_devs );
1190
1187
1191
1188
freeifaddrs (ifaddr );
1192
1189
return num_verbs_ifs ? 0 : - FI_ENODATA ;
@@ -1237,7 +1234,8 @@ static inline int vrb_cmp_domain_and_dev_name(const char *domain_name,
1237
1234
return strncmp (domain_name , dev_name , cmp_len );
1238
1235
}
1239
1236
1240
- static int vrb_get_srcaddr_devs (struct fi_info * * info )
1237
+ static int vrb_get_srcaddr_devs (struct dlist_entry * verbs_devs ,
1238
+ struct fi_info * * info )
1241
1239
{
1242
1240
struct verbs_dev_info * dev ;
1243
1241
struct fi_info * fi ;
@@ -1246,7 +1244,7 @@ static int vrb_get_srcaddr_devs(struct fi_info **info)
1246
1244
for (fi = * info ; fi ; fi = fi -> next ) {
1247
1245
if (fi -> ep_attr -> type == FI_EP_DGRAM )
1248
1246
continue ;
1249
- dlist_foreach_container (& verbs_devs , struct verbs_dev_info ,
1247
+ dlist_foreach_container (verbs_devs , struct verbs_dev_info ,
1250
1248
dev , entry ) {
1251
1249
if (!vrb_cmp_domain_and_dev_name (fi -> domain_attr -> name ,
1252
1250
dev -> name )) {
@@ -1299,7 +1297,8 @@ static int vrb_set_info_addrs(struct fi_info *info,
1299
1297
return FI_SUCCESS ;
1300
1298
}
1301
1299
1302
- static int vrb_fill_addr (struct rdma_addrinfo * rai , struct fi_info * * info ,
1300
+ static int vrb_fill_addr (struct dlist_entry * verbs_devs ,
1301
+ struct rdma_addrinfo * rai , struct fi_info * * info ,
1303
1302
struct rdma_cm_id * id )
1304
1303
{
1305
1304
struct sockaddr * local_addr ;
@@ -1313,7 +1312,7 @@ static int vrb_fill_addr(struct rdma_addrinfo *rai, struct fi_info **info,
1313
1312
goto rai_to_fi ;
1314
1313
1315
1314
if (!id -> verbs )
1316
- return vrb_get_srcaddr_devs (info );
1315
+ return vrb_get_srcaddr_devs (verbs_devs , info );
1317
1316
1318
1317
/* Handle the case when rdma_cm doesn't fill src address even
1319
1318
* though it fills the destination address (presence of id->verbs
@@ -1336,11 +1335,12 @@ static int vrb_fill_addr(struct rdma_addrinfo *rai, struct fi_info **info,
1336
1335
NULL , NULL );
1337
1336
}
1338
1337
1339
- static int vrb_device_has_ipoib_addr (const char * dev_name )
1338
+ static int vrb_device_has_ipoib_addr (struct dlist_entry * verbs_devs ,
1339
+ const char * dev_name )
1340
1340
{
1341
1341
struct verbs_dev_info * dev ;
1342
1342
1343
- dlist_foreach_container (& verbs_devs , struct verbs_dev_info , dev , entry ) {
1343
+ dlist_foreach_container (verbs_devs , struct verbs_dev_info , dev , entry ) {
1344
1344
if (!strcmp (dev_name , dev -> name ))
1345
1345
return 1 ;
1346
1346
}
@@ -1349,40 +1349,20 @@ static int vrb_device_has_ipoib_addr(const char *dev_name)
1349
1349
1350
1350
#define VERBS_NUM_DOMAIN_TYPES 3
1351
1351
1352
- static int vrb_init_info (struct fi_info * * all_infos )
1352
+ static int vrb_init_info (struct dlist_entry * verbs_devs ,
1353
+ struct fi_info * * all_infos )
1353
1354
{
1354
1355
struct ibv_context * * ctx_list ;
1355
1356
struct fi_info * fi = NULL , * tail = NULL ;
1356
1357
const struct verbs_ep_domain * ep_type [VERBS_NUM_DOMAIN_TYPES ];
1357
1358
int ret = 0 , i , j , num_devices , dom_count = 0 ;
1358
- static bool initialized = false;
1359
1359
1360
1360
vrb_prof_func_start (__func__ );
1361
1361
1362
- if (initialized )
1363
- goto done ;
1364
-
1365
- initialized = true;
1362
+ vrb_devs_free (verbs_devs );
1363
+ fi_freeinfo (* all_infos );
1366
1364
* all_infos = NULL ;
1367
1365
1368
- if (vrb_os_ini ()) {
1369
- FI_WARN (& vrb_prov , FI_LOG_FABRIC ,
1370
- "failed in OS specific device initialization\n" );
1371
- ret = - FI_ENODATA ;
1372
- goto done ;
1373
- }
1374
-
1375
- vrb_prof_func_start ("vrb_os_mem_support" );
1376
- vrb_os_mem_support (& vrb_gl_data .peer_mem_support ,
1377
- & vrb_gl_data .dmabuf_support );
1378
- vrb_prof_func_end ("vrb_os_mem_support" );
1379
-
1380
- if (vrb_read_params ()) {
1381
- VRB_INFO (FI_LOG_FABRIC , "failed to read parameters\n" );
1382
- ret = - FI_ENODATA ;
1383
- goto done ;
1384
- }
1385
-
1386
1366
if (!vrb_have_device ()) {
1387
1367
VRB_INFO (FI_LOG_FABRIC , "no RDMA devices found\n" );
1388
1368
ret = - FI_ENODATA ;
@@ -1398,13 +1378,14 @@ static int vrb_init_info(struct fi_info **all_infos)
1398
1378
"XRC not built into provider, skip allocating "
1399
1379
"fi_info for XRC FI_EP_MSG endpoints\n" );
1400
1380
}
1381
+
1401
1382
vrb_prof_func_start ("vrb_getifaddrs" );
1402
- vrb_getifaddrs (& verbs_devs );
1383
+ vrb_getifaddrs (verbs_devs );
1403
1384
vrb_prof_func_end ("vrb_getifaddrs" );
1404
1385
if (!vrb_gl_data .iface )
1405
- vrb_get_sib (& verbs_devs );
1386
+ vrb_get_sib (verbs_devs );
1406
1387
1407
- if (dlist_empty (& verbs_devs ))
1388
+ if (dlist_empty (verbs_devs ))
1408
1389
FI_WARN (& vrb_prov , FI_LOG_FABRIC ,
1409
1390
"no valid IPoIB interfaces found, FI_EP_MSG endpoint "
1410
1391
"type would not be available\n" );
@@ -1435,7 +1416,7 @@ static int vrb_init_info(struct fi_info **all_infos)
1435
1416
1436
1417
for (j = 0 ; j < dom_count ; j ++ ) {
1437
1418
if (ep_type [j ]-> type == FI_EP_MSG &&
1438
- !vrb_device_has_ipoib_addr (ctx_list [i ]-> device -> name )) {
1419
+ !vrb_device_has_ipoib_addr (verbs_devs , ctx_list [i ]-> device -> name )) {
1439
1420
FI_INFO (& vrb_prov , FI_LOG_FABRIC ,
1440
1421
"skipping device: %s for FI_EP_MSG, "
1441
1422
"it may have a filtered IPoIB interface"
@@ -1788,7 +1769,8 @@ static int vrb_handle_ib_ud_addr(const char *node, const char *service,
1788
1769
return ret ;
1789
1770
}
1790
1771
1791
- static int vrb_handle_sock_addr (const char * node , const char * service ,
1772
+ static int vrb_handle_sock_addr (struct dlist_entry * verbs_devs ,
1773
+ const char * node , const char * service ,
1792
1774
uint64_t flags , const struct fi_info * hints ,
1793
1775
struct fi_info * * info )
1794
1776
{
@@ -1807,15 +1789,16 @@ static int vrb_handle_sock_addr(const char *node, const char *service,
1807
1789
goto out ;
1808
1790
}
1809
1791
1810
- ret = vrb_fill_addr (rai , info , id );
1792
+ ret = vrb_fill_addr (verbs_devs , rai , info , id );
1811
1793
out :
1812
1794
rdma_freeaddrinfo (rai );
1813
1795
if (rdma_destroy_id (id ))
1814
1796
VRB_WARN_ERRNO (FI_LOG_FABRIC , "rdma_destroy_id" );
1815
1797
return ret ;
1816
1798
}
1817
1799
1818
- static int vrb_get_match_infos (uint32_t version , const char * node ,
1800
+ static int vrb_get_match_infos (struct dlist_entry * verbs_devs ,
1801
+ uint32_t version , const char * node ,
1819
1802
const char * service , uint64_t flags ,
1820
1803
const struct fi_info * hints ,
1821
1804
const struct fi_info * raw_info ,
@@ -1832,7 +1815,7 @@ static int vrb_get_match_infos(uint32_t version, const char *node,
1832
1815
1833
1816
if (!hints || !hints -> ep_attr || hints -> ep_attr -> type == FI_EP_MSG ||
1834
1817
hints -> ep_attr -> type == FI_EP_UNSPEC ) {
1835
- ret_sock_addr = vrb_handle_sock_addr (node , service , flags , hints , info );
1818
+ ret_sock_addr = vrb_handle_sock_addr (verbs_devs , node , service , flags , hints , info );
1836
1819
if (ret_sock_addr ) {
1837
1820
VRB_INFO (FI_LOG_FABRIC ,
1838
1821
"handling of the socket address fails - %d\n" ,
@@ -1911,21 +1894,49 @@ static void vrb_filter_info_by_addr_format(struct fi_info **info, int addr_forma
1911
1894
}
1912
1895
}
1913
1896
1897
+ void vrb_devs_free (struct dlist_entry * verbs_devs )
1898
+ {
1899
+ struct verbs_dev_info * dev ;
1900
+ struct verbs_addr * addr ;
1901
+
1902
+ while (!dlist_empty (verbs_devs )) {
1903
+ dlist_pop_front (verbs_devs , struct verbs_dev_info , dev , entry );
1904
+ while (!dlist_empty (& dev -> addrs )) {
1905
+ dlist_pop_front (& dev -> addrs , struct verbs_addr , addr , entry );
1906
+ rdma_freeaddrinfo (addr -> rai );
1907
+ free (addr );
1908
+ }
1909
+ free (dev -> name );
1910
+ free (dev );
1911
+ }
1912
+ }
1913
+
1914
1914
int vrb_getinfo (uint32_t version , const char * node , const char * service ,
1915
1915
uint64_t flags , const struct fi_info * hints ,
1916
1916
struct fi_info * * info )
1917
1917
{
1918
+ static bool init_done = false;
1918
1919
int ret ;
1919
1920
1920
1921
vrb_prof_func_start (__func__ );
1921
- ofi_mutex_lock (& vrb_info_mutex );
1922
- ret = vrb_init_info (& vrb_util_prov .info );
1923
- if (ret ) {
1924
- ofi_mutex_unlock (& vrb_info_mutex );
1925
- goto out ;
1922
+ if (!init_done || flags & FI_RESCAN ) {
1923
+ if (!init_done ) {
1924
+ ret = vrb_init ();
1925
+ if (ret ) {
1926
+ ofi_mutex_unlock (& vrb_info_mutex );
1927
+ goto out ;
1928
+ }
1929
+ init_done = true;
1930
+ }
1931
+
1932
+ ret = vrb_init_info (& vrb_devs , & vrb_util_prov .info );
1933
+ if (ret ) {
1934
+ ofi_mutex_unlock (& vrb_info_mutex );
1935
+ goto out ;
1936
+ }
1926
1937
}
1927
1938
1928
- ret = vrb_get_match_infos (version , node , service ,
1939
+ ret = vrb_get_match_infos (& vrb_devs , version , node , service ,
1929
1940
flags , hints ,
1930
1941
vrb_util_prov .info , info );
1931
1942
ofi_mutex_unlock (& vrb_info_mutex );
0 commit comments