in src/nccl_ofi_net.c [309:363]
static void filter_tcp_info_list()
{
struct fi_info *prev = NULL, *curr = NULL;
struct fi_info *delete_info = NULL;
bool delete_prov = false;
uint64_t expected_mem_tag_format = 0;
NCCL_OFI_TRACE(NCCL_INIT | NCCL_NET, "Removing unnecessary interfaces and address formats for TCP provider");
curr = ofi_info_list;
expected_mem_tag_format = curr->ep_attr->mem_tag_format;
while (curr != NULL) {
/* Check if interface name and format matches deletion criteria */
delete_prov = match_prov_info(curr->domain_attr->name,
curr->addr_format,
curr->ep_attr->mem_tag_format,
expected_mem_tag_format);
if (delete_prov) {
if (prev != NULL) {
prev->next = curr->next;
}
ofi_ndevices--;
delete_info = curr;
curr = curr->next;
/* Delete node matching criteria */
delete_info->next = NULL;
fi_freeinfo(delete_info);
}
else {
if (prev == NULL) {
/*
* Update HEAD of ofi_info_list to point to first endpoint which
* can be used for communication.
*/
ofi_info_list = curr;
}
prev = curr;
curr = curr->next;
}
}
/*
* In case all info objects match the filter criteria,
* update HEAD of ofi_info_list to point to NULL.
*/
if (prev == NULL) {
ofi_info_list = prev;
}
}