Skip to content

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

Description

@TSUMUGI-XE

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

  1. 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.
  2. 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_IFACE is 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions