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 need its own epollfd managing its subset of flows. The key changes are: 1. Centralize epoll management by extracting helper functions into a new epoll_ctl.c/h module and moving union epoll_ref from passt.h to its more logical location in epoll_ctl.h. 2. Simplify epoll_del() to take the epollfd directly rather than extracting it from the context structure, reducing coupling between epoll operations and the global context. 3. Move epoll registration out of sock_l4_sa() into protocol-specific code, giving callers explicit control over which epoll instance manages each socket. 4. Replace the boolean in_epoll flag in TCP connections with an epollfd field in flow_common. This serves dual purposes: tracking registration status (EPOLLFD_INVALID = not registered) and identifying the owning epoll instance. The epollfd field is 8 bits, limiting values to 0-254 (255 = EPOLLFD_INVALID). 5. Apply this pattern consistently across all protocol handlers (TCP, ICMP, UDP), storing the managing epollfd in each flow's common structure. These changes make epoll ownership explicit in the flow tracking system, enabling flows to be managed by different epoll instances, a prerequisite for per-thread epollfd design in upcoming multithreading work. Changes since v1: - New patch: "epoll_ctl: Extract epoll operations" - centralizes epoll helpers into a dedicated module and relocates union epoll_ref from passt.h to epoll_ctl.h - Changed epollfd type in flow_common from int to 8-bit bitfield to avoid exceeding cacheline size threshold - Added flow_epollfd_valid() helper to check epoll registration status - Added flow_set_epollfd() helper to set the epoll instance for a flow Laurent Vivier (6): util: Simplify epoll_del() interface to take epollfd directly epoll_ctl: Extract epoll operations 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 Makefile | 22 +++++++++++----------- epoll_ctl.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ epoll_ctl.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ flow.c | 36 +++++++++++++++++++++++++++++------- flow.h | 10 +++++++++- icmp.c | 23 +++++++++++++++-------- passt.c | 2 +- passt.h | 34 ---------------------------------- pasta.c | 7 +++---- pif.c | 32 +++++++++++++++++++++++++------- repair.c | 14 +++++--------- tap.c | 15 +++++---------- tcp.c | 38 +++++++++++++++++++------------------- tcp_conn.h | 8 +------- tcp_splice.c | 25 ++++++++++++------------- udp.c | 2 +- udp_flow.c | 23 +++++++++++++++++++---- util.c | 28 ++-------------------------- util.h | 6 ++++-- vhost_user.c | 14 +++++--------- vu_common.c | 2 +- 21 files changed, 263 insertions(+), 174 deletions(-) create mode 100644 epoll_ctl.c create mode 100644 epoll_ctl.h -- 2.50.1