Summary
After the fixes in #10, #11 and #13, GROMACS round-trips migration 100% reliably (test-eessi-gromacs.sh, 14/14 passes across repeated runs, both expel and migrate ... home return paths). ESPResSo built against Open MPI still does not survive migration end-to-end, but for a different and narrower reason than any of the above three bugs.
Symptom
Post-migration, an ESPResSo/MPI process's threads intermittently fail wormhole-proxied syscalls with errors that don't correspond to any real local condition:
epoll_wait: Bad address
eventfd: Bad file descriptor (also seen from a background monitor loop polling the process, e.g. [warn] Error reading from eventfd: Bad file descriptor)
Separately, a non-leader thread has been observed issuing repeated statx RPCs at high frequency without ever terminating that loop.
No crash, no oops, no coredump — the process just stops making forward progress on its MPI progress loop.
Root cause (hypothesis, not yet fixed)
Open MPI's progress engine uses epoll/eventfd internally to wait on multiple readiness sources efficiently. The wormhole's existing proxy model (kretprobe hook → freeze calling thread → RPC to home node → single reply → resume) works for simple request/reply syscalls (open/read/write/lseek/fsync/statx) where a Ghost file's state is naturally recreated from a single round-trip.
epoll/eventfd are structurally different: they're stateful, long-lived kernel objects that track readiness over time across a set of registered fds, expected to be efficiently poll-able many times without a fresh round-trip each time. A generic single-shot request/reply proxy has no natural way to reconstruct that in-kernel readiness-tracking state after migration — there's no "one RPC" that captures "is any of these N fds ready right now, and wake me when one becomes ready."
What we ruled out
This is not the same bug as #7, #10, #11, or #13 — GROMACS (no epoll/eventfd dependency) is now 100% reliable with those fixes in place; this reproduces specifically and only with MPI's epoll-based progress engine.
Possible directions (not attempted)
- A real remote-
epoll proxy: forward epoll_ctl/epoll_wait registrations to the home node and maintain live readiness state there, pushing wake events back — nontrivial, but the "correct" fix.
- Explicitly scope MPI/epoll-heavy workloads out of migration support for now (document the limitation) rather than attempt a partial fix.
- Some MPI-transport-level workaround (e.g. forcing a different Open MPI progress/transport mode that doesn't rely on epoll) — untested, may just move the problem.
Happy to help test any direction you'd want to take here — didn't want to guess at a fix without your input on which of the above (if any) fits where you want this project to go.
Summary
After the fixes in #10, #11 and #13, GROMACS round-trips migration 100% reliably (
test-eessi-gromacs.sh, 14/14 passes across repeated runs, bothexpelandmigrate ... homereturn paths). ESPResSo built against Open MPI still does not survive migration end-to-end, but for a different and narrower reason than any of the above three bugs.Symptom
Post-migration, an ESPResSo/MPI process's threads intermittently fail wormhole-proxied syscalls with errors that don't correspond to any real local condition:
epoll_wait: Bad addresseventfd: Bad file descriptor(also seen from a background monitor loop polling the process, e.g.[warn] Error reading from eventfd: Bad file descriptor)Separately, a non-leader thread has been observed issuing repeated
statxRPCs at high frequency without ever terminating that loop.No crash, no oops, no coredump — the process just stops making forward progress on its MPI progress loop.
Root cause (hypothesis, not yet fixed)
Open MPI's progress engine uses
epoll/eventfdinternally to wait on multiple readiness sources efficiently. The wormhole's existing proxy model (kretprobe hook → freeze calling thread → RPC to home node → single reply → resume) works for simple request/reply syscalls (open/read/write/lseek/fsync/statx) where a Ghost file's state is naturally recreated from a single round-trip.epoll/eventfdare structurally different: they're stateful, long-lived kernel objects that track readiness over time across a set of registered fds, expected to be efficiently poll-able many times without a fresh round-trip each time. A generic single-shot request/reply proxy has no natural way to reconstruct that in-kernel readiness-tracking state after migration — there's no "one RPC" that captures "is any of these N fds ready right now, and wake me when one becomes ready."What we ruled out
This is not the same bug as #7, #10, #11, or #13 — GROMACS (no epoll/eventfd dependency) is now 100% reliable with those fixes in place; this reproduces specifically and only with MPI's epoll-based progress engine.
Possible directions (not attempted)
epollproxy: forwardepoll_ctl/epoll_waitregistrations to the home node and maintain live readiness state there, pushing wake events back — nontrivial, but the "correct" fix.Happy to help test any direction you'd want to take here — didn't want to guess at a fix without your input on which of the above (if any) fits where you want this project to go.