You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
prov/tcp (xnet): with FI_TCP_IFACE unset on a many-interface host, CM/rendezvous hangs indefinitely (no timeout) — same-host peers latch onto a wrong interface #12480
Summary
On a host with ~20 UP interfaces (loopback + WiFi + tailscale + a libvirt bridge + docker0 + several docker bridges + ~12 veth* + a vnet0), a 2-process job whose ranks both resolve to the same host hangs forever during connection setup when FI_TCP_IFACE is not set. Both processes spin at ~90% CPU in xnet_run_progress() (inside libtcp-fi.so) and never make progress — no timeout, no CM error, no diagnostic. Setting FI_TCP_IFACE=lo fixes it instantly and reliably.
Environment
libfabric 2.2.0 (2.2.0-impi_2021.17.2, API 2.2), as bundled with Intel oneAPI 2026 / Intel MPI 2021.17.
Consumer x86-64 Linux host, single net namespace; the collective runs 2 ranks in one container with host networking, so all ~20 host interfaces are visible to the provider.
Provider: tcp (xnet).
Consumer of libfabric: oneCCL 2021.17 (ATL/OFI transport) driving a PyTorch/XCCL tensor-parallel job across 2 GPUs. (The GPUs are irrelevant to this hang — it is purely on the TCP control/bootstrap path.)
Backtrace (both ranks, ~90% CPU, identical)
... -> oneCCL atl_ofi_comm::init_transport
-> atl_base_comm::create_comm_id
-> atl_ofi_comm::allgatherv
-> (libfabric) xnet_run_progress <-- spins here forever, in libtcp-fi.so
The allgather that bootstraps the communicator never converges because the provider selected a non-loopback interface for peers that are actually co-located on the same host.
What I expected
For same-host peers, either (a) the provider prefers/considers loopback, or (b) if a chosen interface can't establish the CM within a bound, it fails with a diagnostic — not an unbounded spin.
What happens
Indefinite hang, no error, both ranks busy-spinning in epoll-driven progress. Indistinguishable from a deadlock.
Workaround FI_TCP_IFACE=lo (also pinned FI_SOCKETS_IFACE=lo and the consumer's CCL_KVS_IFACE=lo). Instant, 100% reliable.
Requests
On a many-interface host, when FI_TCP_IFACE is unset and both endpoints resolve to the same host, prefer loopback (or at least consider it) for the tcp CM — or surface a bounded-timeout CM error instead of spinning indefinitely.
Document the unset-FI_TCP_IFACE interface-selection algorithm in fi_tcp(7) (it currently documents only that a specific iface can be requested, not how one is chosen otherwise).
Notes
#7706 (CLOSED) addressed the inverse — loopback not being filtered out when FI_TCP_IFACEis set. This report is about the unset default selection hanging.
MPI_Probe freezes on WSL2 network interface microsoft/WSL#13126 is an independent reproduction of the identical symptom (xnet_run_progress/epoll_wait hang in libtcp-fi.so, FI_TCP_IFACE=lo fixes it) filed against a different tracker — and was auto-closed for inactivity without ever being root-caused on the libfabric side. That it reproduces off-WSL too suggests this is provider-level, not app- or WSL-specific.
Happy to attach the full gstack from both ranks and fi_info output.
Summary
On a host with ~20 UP interfaces (loopback + WiFi + tailscale + a libvirt bridge +
docker0+ several docker bridges + ~12veth*+ avnet0), a 2-process job whose ranks both resolve to the same host hangs forever during connection setup whenFI_TCP_IFACEis not set. Both processes spin at ~90% CPU inxnet_run_progress()(insidelibtcp-fi.so) and never make progress — no timeout, no CM error, no diagnostic. SettingFI_TCP_IFACE=lofixes it instantly and reliably.Environment
2.2.0-impi_2021.17.2, API 2.2), as bundled with Intel oneAPI 2026 / Intel MPI 2021.17.tcp(xnet).Backtrace (both ranks, ~90% CPU, identical)
The allgather that bootstraps the communicator never converges because the provider selected a non-loopback interface for peers that are actually co-located on the same host.
What I expected
For same-host peers, either (a) the provider prefers/considers loopback, or (b) if a chosen interface can't establish the CM within a bound, it fails with a diagnostic — not an unbounded spin.
What happens
Indefinite hang, no error, both ranks busy-spinning in
epoll-driven progress. Indistinguishable from a deadlock.Workaround
FI_TCP_IFACE=lo(also pinnedFI_SOCKETS_IFACE=loand the consumer'sCCL_KVS_IFACE=lo). Instant, 100% reliable.Requests
FI_TCP_IFACEis unset and both endpoints resolve to the same host, prefer loopback (or at least consider it) for the tcp CM — or surface a bounded-timeout CM error instead of spinning indefinitely.FI_TCP_IFACEinterface-selection algorithm infi_tcp(7)(it currently documents only that a specific iface can be requested, not how one is chosen otherwise).Notes
#7706(CLOSED) addressed the inverse — loopback not being filtered out whenFI_TCP_IFACEis set. This report is about the unset default selection hanging.xnet_run_progress/epoll_waithang inlibtcp-fi.so,FI_TCP_IFACE=lofixes it) filed against a different tracker — and was auto-closed for inactivity without ever being root-caused on the libfabric side. That it reproduces off-WSL too suggests this is provider-level, not app- or WSL-specific.fi_infooutput.