This series refactors how epoll file descriptors are managed throughout the codebase in preparation for introducing multithreading support. Currently, passt uses a single global epollfd accessed through the context structure. With multithreading, each thread will have its own epollfd managing its subset of flows. The key changes are: 1. Simplify epoll_del() to take the epollfd directly rather than extracting it from the context structure, reducing tight coupling. 2. Move epoll registration out of the socket creation function (sock_l4_sa()) into protocol-specific code, giving callers explicit control over which epoll instance manages each socket. 3. Replace the boolean in_epoll flag in TCP connection structures with an epollfd field in flow_common. This serves dual purposes: tracking whether a flow is registered (zero = not registered) and which epoll instance owns it (non-zero = specific epollfd). 4. Apply this pattern consistently across all protocol handlers (TCP, ICMP, UDP), storing the managing epollfd in each flow's common structure. These changes make the epoll ownership model explicit in the flow tracking system, allowing flows to be managed by different epoll instances - a prerequisite for the per-thread epollfd design in the upcoming multithreading work. Laurent Vivier (5): util: Simplify epoll_del() interface to take epollfd directly util: Move epoll registration out of sock_l4_sa() tcp, flow: Replace per-connection in_epoll flag with epollfd in flow_common icmp: Use epollfd from flow_common structure udp: Use epollfd from flow_common structure flow.c | 12 +++++------- flow.h | 4 +++- icmp.c | 23 ++++++++++++++++++----- pif.c | 34 ++++++++++++++++++++++++++++------ tap.c | 2 +- tcp.c | 36 ++++++++++++++++++------------------ tcp_conn.h | 8 +------- tcp_splice.c | 23 +++++++++++------------ udp_flow.c | 23 ++++++++++++++++++++--- util.c | 21 ++++----------------- util.h | 4 ++-- vhost_user.c | 6 +++--- 12 files changed, 114 insertions(+), 82 deletions(-) -- 2.50.1