public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
* [PATCH v2 0/6] Refactor epoll handling in preparation for multithreading
@ 2025-10-07 16:40 Laurent Vivier
  2025-10-07 16:40 ` [PATCH v2 1/6] util: Simplify epoll_del() interface to take epollfd directly Laurent Vivier
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Laurent Vivier @ 2025-10-07 16:40 UTC (permalink / raw)
  To: passt-dev; +Cc: Laurent Vivier

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



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-10-07 16:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-07 16:40 [PATCH v2 0/6] Refactor epoll handling in preparation for multithreading Laurent Vivier
2025-10-07 16:40 ` [PATCH v2 1/6] util: Simplify epoll_del() interface to take epollfd directly Laurent Vivier
2025-10-07 16:40 ` [PATCH v2 2/6] epoll_ctl: Extract epoll operations Laurent Vivier
2025-10-07 16:40 ` [PATCH v2 3/6] util: Move epoll registration out of sock_l4_sa() Laurent Vivier
2025-10-07 16:40 ` [PATCH v2 4/6] tcp, flow: Replace per-connection in_epoll flag with epollfd in flow_common Laurent Vivier
2025-10-07 16:40 ` [PATCH v2 5/6] icmp: Use epollfd from flow_common structure Laurent Vivier
2025-10-07 16:40 ` [PATCH v2 6/6] udp: " Laurent Vivier

Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).