public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Laurent Vivier <lvivier@redhat.com>
To: passt-dev@passt.top
Cc: Laurent Vivier <lvivier@redhat.com>
Subject: [PATCH v2 2/6] epoll_ctl: Extract epoll operations
Date: Tue,  7 Oct 2025 18:40:22 +0200	[thread overview]
Message-ID: <20251007164026.3882026-3-lvivier@redhat.com> (raw)
In-Reply-To: <20251007164026.3882026-1-lvivier@redhat.com>

Centralize epoll_add() and epoll_del() helper functions into new
epoll_ctl.c/h files.

This also moves the union epoll_ref definition from passt.h to
epoll_ctl.h where it's more logically placed.

The new epoll_add() helper simplifies adding file descriptors to epoll
by taking an epoll_ref and events, handling error reporting
consistently across all call sites.

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
 Makefile     | 22 +++++++++++-----------
 epoll_ctl.c  | 45 +++++++++++++++++++++++++++++++++++++++++++++
 epoll_ctl.h  | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 icmp.c       |  4 +---
 passt.c      |  2 +-
 passt.h      | 34 ----------------------------------
 pasta.c      |  7 +++----
 repair.c     | 14 +++++---------
 tap.c        | 13 ++++---------
 tcp.c        |  2 +-
 tcp_splice.c |  2 +-
 udp.c        |  2 +-
 udp_flow.c   |  1 +
 util.c       | 22 +++-------------------
 util.h       |  4 +++-
 vhost_user.c |  8 ++------
 vu_common.c  |  2 +-
 17 files changed, 134 insertions(+), 101 deletions(-)
 create mode 100644 epoll_ctl.c
 create mode 100644 epoll_ctl.h

diff --git a/Makefile b/Makefile
index 3328f8324140..91e037b8fd3c 100644
--- a/Makefile
+++ b/Makefile
@@ -37,23 +37,23 @@ FLAGS += -DPAGE_SIZE=$(shell getconf PAGE_SIZE)
 FLAGS += -DVERSION=\"$(VERSION)\"
 FLAGS += -DDUAL_STACK_SOCKETS=$(DUAL_STACK_SOCKETS)
 
-PASST_SRCS = arch.c arp.c checksum.c conf.c dhcp.c dhcpv6.c flow.c fwd.c \
-	icmp.c igmp.c inany.c iov.c ip.c isolation.c lineread.c log.c mld.c \
-	ndp.c netlink.c migrate.c packet.c passt.c pasta.c pcap.c pif.c \
-	repair.c tap.c tcp.c tcp_buf.c tcp_splice.c tcp_vu.c udp.c udp_flow.c \
-	udp_vu.c util.c vhost_user.c virtio.c vu_common.c
+PASST_SRCS = arch.c arp.c checksum.c conf.c dhcp.c dhcpv6.c epoll_ctl.c \
+	flow.c fwd.c icmp.c igmp.c inany.c iov.c ip.c isolation.c lineread.c \
+	log.c mld.c ndp.c netlink.c migrate.c packet.c passt.c pasta.c pcap.c \
+	pif.c repair.c tap.c tcp.c tcp_buf.c tcp_splice.c tcp_vu.c udp.c \
+	udp_flow.c udp_vu.c util.c vhost_user.c virtio.c vu_common.c
 QRAP_SRCS = qrap.c
 PASST_REPAIR_SRCS = passt-repair.c
 SRCS = $(PASST_SRCS) $(QRAP_SRCS) $(PASST_REPAIR_SRCS)
 
 MANPAGES = passt.1 pasta.1 qrap.1 passt-repair.1
 
-PASST_HEADERS = arch.h arp.h checksum.h conf.h dhcp.h dhcpv6.h flow.h fwd.h \
-	flow_table.h icmp.h icmp_flow.h inany.h iov.h ip.h isolation.h \
-	lineread.h log.h migrate.h ndp.h netlink.h packet.h passt.h pasta.h \
-	pcap.h pif.h repair.h siphash.h tap.h tcp.h tcp_buf.h tcp_conn.h \
-	tcp_internal.h tcp_splice.h tcp_vu.h udp.h udp_flow.h udp_internal.h \
-	udp_vu.h util.h vhost_user.h virtio.h vu_common.h
+PASST_HEADERS = arch.h arp.h checksum.h conf.h dhcp.h dhcpv6.h epoll_ctl.h \
+	flow.h fwd.h flow_table.h icmp.h icmp_flow.h inany.h iov.h ip.h \
+	isolation.h lineread.h log.h migrate.h ndp.h netlink.h packet.h \
+	passt.h pasta.h pcap.h pif.h repair.h siphash.h tap.h tcp.h tcp_buf.h \
+	tcp_conn.h tcp_internal.h tcp_splice.h tcp_vu.h udp.h udp_flow.h \
+	udp_internal.h udp_vu.h util.h vhost_user.h virtio.h vu_common.h
 HEADERS = $(PASST_HEADERS) seccomp.h
 
 C := \#include <sys/random.h>\nint main(){int a=getrandom(0, 0, 0);}
diff --git a/epoll_ctl.c b/epoll_ctl.c
new file mode 100644
index 000000000000..0a06350f87a5
--- /dev/null
+++ b/epoll_ctl.c
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* epoll_ctl.c - epoll manipulation helpers
+ *
+ * Copyright Red Hat
+ * Author: Laurent Vivier <lvivier@redhat.com>
+ */
+
+#include <errno.h>
+
+#include "epoll_ctl.h"
+
+/**
+ * epoll_add() - Add a file descriptor to an epollfd
+ * @epollfd:	epoll file descriptor to add to
+ * @events:	epoll events
+ * @ref:	epoll reference for the file descriptor (includes fd and metadata)
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+int epoll_add(int epollfd, uint32_t events, union epoll_ref *ref)
+{
+	struct epoll_event ev;
+	int ret;
+
+	ev.events = events;
+	ev.data.u64 = ref->u64;
+
+	ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, ref->fd, &ev);
+	if (ret == -1) {
+		ret = -errno;
+		warn("Failed to add fd to epoll: %s", strerror_(-ret));
+	}
+
+	return ret;
+}
+
+/**
+ * epoll_del() - Remove a file descriptor from an epollfd
+ * @epollfd:	epoll file descriptor to remove from
+ * @fd:		File descriptor to remove
+ */
+void epoll_del(int epollfd, int fd)
+{
+	epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
+}
diff --git a/epoll_ctl.h b/epoll_ctl.h
new file mode 100644
index 000000000000..cf92b0f63f26
--- /dev/null
+++ b/epoll_ctl.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright Red Hat
+ * Author: Laurent Vivier <lvivier@redhat.com>
+ */
+
+#ifndef EPOLL_CTL_H
+#define EPOLL_CTL_H
+
+#include <sys/epoll.h>
+
+#include "util.h"
+#include "passt.h"
+#include "epoll_type.h"
+#include "flow.h"
+#include "tcp.h"
+#include "udp.h"
+
+/**
+ * union epoll_ref - Breakdown of reference for epoll fd bookkeeping
+ * @type:	Type of fd (tells us what to do with events)
+ * @fd:		File descriptor number (implies < 2^24 total descriptors)
+ * @flow:	Index of the flow this fd is linked to
+ * @tcp_listen:	TCP-specific reference part for listening sockets
+ * @udp:	UDP-specific reference part
+ * @data:	Data handled by protocol handlers
+ * @nsdir_fd:	netns dirfd for fallback timer checking if namespace is gone
+ * @queue:	vhost-user queue index for this fd
+ * @u64:	Opaque reference for epoll_ctl() and epoll_wait()
+ */
+union epoll_ref {
+	struct {
+		enum epoll_type type:8;
+		int32_t		  fd:FD_REF_BITS;
+		union {
+			uint32_t flow;
+			flow_sidx_t flowside;
+			union tcp_listen_epoll_ref tcp_listen;
+			union udp_listen_epoll_ref udp;
+			uint32_t data;
+			int nsdir_fd;
+			int queue;
+		};
+	};
+	uint64_t u64;
+};
+static_assert(sizeof(union epoll_ref) <= sizeof(union epoll_data),
+	      "epoll_ref must have same size as epoll_data");
+
+int epoll_add(int epollfd, uint32_t events, union epoll_ref *ref);
+void epoll_del(int epollfd, int fd);
+#endif /* EPOLL_CTL_H */
diff --git a/icmp.c b/icmp.c
index bd3108a21675..c26561da80bf 100644
--- a/icmp.c
+++ b/icmp.c
@@ -15,7 +15,6 @@
 #include <errno.h>
 #include <net/ethernet.h>
 #include <net/if.h>
-#include <netinet/in.h>
 #include <netinet/ip.h>
 #include <netinet/ip_icmp.h>
 #include <stdio.h>
@@ -23,10 +22,8 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <string.h>
-#include <sys/epoll.h>
 #include <sys/types.h>
 #include <sys/socket.h>
-#include <unistd.h>
 #include <time.h>
 
 #include <linux/icmpv6.h>
@@ -41,6 +38,7 @@
 #include "inany.h"
 #include "icmp.h"
 #include "flow_table.h"
+#include "epoll_ctl.h"
 
 #define ICMP_ECHO_TIMEOUT	60 /* s, timeout for ICMP socket activity */
 #define ICMP_NUM_IDS		(1U << 16)
diff --git a/passt.c b/passt.c
index 31fbb75b1b12..e595f13a56f7 100644
--- a/passt.c
+++ b/passt.c
@@ -19,7 +19,6 @@
  * created in a separate network namespace).
  */
 
-#include <sys/epoll.h>
 #include <fcntl.h>
 #include <sys/mman.h>
 #include <sys/resource.h>
@@ -53,6 +52,7 @@
 #include "vu_common.h"
 #include "migrate.h"
 #include "repair.h"
+#include "epoll_ctl.h"
 
 #define EPOLL_EVENTS		8
 
diff --git a/passt.h b/passt.h
index 0075eb4b3b16..befe56bb167b 100644
--- a/passt.h
+++ b/passt.h
@@ -35,40 +35,6 @@ union epoll_ref;
 #define MAC_OUR_LAA	\
 	((uint8_t [ETH_ALEN]){0x9a, 0x55, 0x9a, 0x55, 0x9a, 0x55})
 
-/**
- * union epoll_ref - Breakdown of reference for epoll fd bookkeeping
- * @type:	Type of fd (tells us what to do with events)
- * @fd:		File descriptor number (implies < 2^24 total descriptors)
- * @flow:	Index of the flow this fd is linked to
- * @tcp_listen:	TCP-specific reference part for listening sockets
- * @udp:	UDP-specific reference part
- * @icmp:	ICMP-specific reference part
- * @data:	Data handled by protocol handlers
- * @nsdir_fd:	netns dirfd for fallback timer checking if namespace is gone
- * @queue:	vhost-user queue index for this fd
- * @u64:	Opaque reference for epoll_ctl() and epoll_wait()
- */
-union epoll_ref {
-	struct {
-		enum epoll_type type:8;
-#define FD_REF_BITS		24
-#define FD_REF_MAX		((int)MAX_FROM_BITS(FD_REF_BITS))
-		int32_t		fd:FD_REF_BITS;
-		union {
-			uint32_t flow;
-			flow_sidx_t flowside;
-			union tcp_listen_epoll_ref tcp_listen;
-			union udp_listen_epoll_ref udp;
-			uint32_t data;
-			int nsdir_fd;
-			int queue;
-		};
-	};
-	uint64_t u64;
-};
-static_assert(sizeof(union epoll_ref) <= sizeof(union epoll_data),
-	      "epoll_ref must have same size as epoll_data");
-
 /* Large enough for ~128 maximum size frames */
 #define PKT_BUF_BYTES		(8UL << 20)
 
diff --git a/pasta.c b/pasta.c
index 687406b6e736..e905f6d33b95 100644
--- a/pasta.c
+++ b/pasta.c
@@ -27,7 +27,6 @@
 #include <stdint.h>
 #include <unistd.h>
 #include <syslog.h>
-#include <sys/epoll.h>
 #include <sys/inotify.h>
 #include <sys/mount.h>
 #include <sys/timerfd.h>
@@ -49,6 +48,7 @@
 #include "isolation.h"
 #include "netlink.h"
 #include "log.h"
+#include "epoll_ctl.h"
 
 #define HOSTNAME_PREFIX		"pasta-"
 
@@ -444,7 +444,6 @@ static int pasta_netns_quit_timer(void)
  */
 void pasta_netns_quit_init(const struct ctx *c)
 {
-	struct epoll_event ev = { .events = EPOLLIN };
 	int flags = O_NONBLOCK | O_CLOEXEC;
 	struct statfs s = { 0 };
 	bool try_inotify = true;
@@ -487,8 +486,8 @@ void pasta_netns_quit_init(const struct ctx *c)
 		die("netns monitor file number %i too big, exiting", fd);
 
 	ref.fd = fd;
-	ev.data.u64 = ref.u64;
-	epoll_ctl(c->epollfd, EPOLL_CTL_ADD, fd, &ev);
+
+	epoll_add(c->epollfd, EPOLLIN, &ref);
 }
 
 /**
diff --git a/repair.c b/repair.c
index f6b1bf36479c..c8f4737fa62a 100644
--- a/repair.c
+++ b/repair.c
@@ -22,6 +22,7 @@
 #include "inany.h"
 #include "flow.h"
 #include "flow_table.h"
+#include "epoll_ctl.h"
 
 #include "repair.h"
 
@@ -47,7 +48,6 @@ static int repair_nfds;
 void repair_sock_init(const struct ctx *c)
 {
 	union epoll_ref ref = { .type = EPOLL_TYPE_REPAIR_LISTEN };
-	struct epoll_event ev = { 0 };
 
 	if (c->fd_repair_listen == -1)
 		return;
@@ -58,9 +58,7 @@ void repair_sock_init(const struct ctx *c)
 	}
 
 	ref.fd = c->fd_repair_listen;
-	ev.events = EPOLLIN | EPOLLHUP | EPOLLET;
-	ev.data.u64 = ref.u64;
-	if (epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_repair_listen, &ev))
+	if (epoll_add(c->epollfd, EPOLLIN | EPOLLHUP | EPOLLET, &ref))
 		err_perror("repair helper socket epoll_ctl(), won't migrate");
 }
 
@@ -74,7 +72,6 @@ void repair_sock_init(const struct ctx *c)
 int repair_listen_handler(struct ctx *c, uint32_t events)
 {
 	union epoll_ref ref = { .type = EPOLL_TYPE_REPAIR };
-	struct epoll_event ev = { 0 };
 	struct ucred ucred;
 	socklen_t len;
 	int rc;
@@ -112,10 +109,9 @@ int repair_listen_handler(struct ctx *c, uint32_t events)
 		info("Accepted TCP_REPAIR helper, PID %i", ucred.pid);
 
 	ref.fd = c->fd_repair;
-	ev.events = EPOLLHUP | EPOLLET;
-	ev.data.u64 = ref.u64;
-	if (epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_repair, &ev)) {
-		rc = errno;
+
+	rc = epoll_add(c->epollfd, EPOLLHUP | EPOLLET, &ref);
+	if (rc < 0) {
 		debug_perror("epoll_ctl() on TCP_REPAIR helper socket");
 		close(c->fd_repair);
 		c->fd_repair = -1;
diff --git a/tap.c b/tap.c
index 134c37a72979..873874796f79 100644
--- a/tap.c
+++ b/tap.c
@@ -26,7 +26,6 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <stdint.h>
-#include <sys/epoll.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -61,6 +60,7 @@
 #include "log.h"
 #include "vhost_user.h"
 #include "vu_common.h"
+#include "epoll_ctl.h"
 
 /* Maximum allowed frame lengths (including L2 header) */
 
@@ -1327,14 +1327,12 @@ static void tap_backend_show_hints(struct ctx *c)
 static void tap_sock_unix_init(const struct ctx *c)
 {
 	union epoll_ref ref = { .type = EPOLL_TYPE_TAP_LISTEN };
-	struct epoll_event ev = { 0 };
 
 	listen(c->fd_tap_listen, 0);
 
 	ref.fd = c->fd_tap_listen;
-	ev.events = EPOLLIN | EPOLLET;
-	ev.data.u64 = ref.u64;
-	epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_tap_listen, &ev);
+
+	epoll_add(c->epollfd, EPOLLIN | EPOLLET, &ref);
 }
 
 /**
@@ -1343,7 +1341,6 @@ static void tap_sock_unix_init(const struct ctx *c)
  */
 static void tap_start_connection(const struct ctx *c)
 {
-	struct epoll_event ev = { 0 };
 	union epoll_ref ref = { 0 };
 
 	ref.fd = c->fd_tap;
@@ -1359,9 +1356,7 @@ static void tap_start_connection(const struct ctx *c)
 		break;
 	}
 
-	ev.events = EPOLLIN | EPOLLRDHUP;
-	ev.data.u64 = ref.u64;
-	epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_tap, &ev);
+	epoll_add(c->epollfd, EPOLLIN | EPOLLRDHUP, &ref);
 
 	if (c->ifi4)
 		arp_send_init_req(c);
diff --git a/tcp.c b/tcp.c
index 04725deabb65..25223e0a0b6e 100644
--- a/tcp.c
+++ b/tcp.c
@@ -279,7 +279,6 @@
 #include <stdbool.h>
 #include <stddef.h>
 #include <string.h>
-#include <sys/epoll.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/timerfd.h>
@@ -309,6 +308,7 @@
 #include "tcp_internal.h"
 #include "tcp_buf.h"
 #include "tcp_vu.h"
+#include "epoll_ctl.h"
 
 /*
  * The size of TCP header (including options) is given by doff (Data Offset)
diff --git a/tcp_splice.c b/tcp_splice.c
index 666ee62b738f..6f21184bdc55 100644
--- a/tcp_splice.c
+++ b/tcp_splice.c
@@ -44,7 +44,6 @@
 #include <net/ethernet.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
-#include <sys/epoll.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 
@@ -56,6 +55,7 @@
 #include "siphash.h"
 #include "inany.h"
 #include "flow.h"
+#include "epoll_ctl.h"
 
 #include "flow_table.h"
 
diff --git a/udp.c b/udp.c
index 86585b7e0942..3812d5c2336f 100644
--- a/udp.c
+++ b/udp.c
@@ -94,7 +94,6 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <string.h>
-#include <sys/epoll.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/uio.h>
@@ -115,6 +114,7 @@
 #include "flow_table.h"
 #include "udp_internal.h"
 #include "udp_vu.h"
+#include "epoll_ctl.h"
 
 #define UDP_MAX_FRAMES		32  /* max # of frames to receive at once */
 
diff --git a/udp_flow.c b/udp_flow.c
index 84973f807167..d9c75f1bb1d8 100644
--- a/udp_flow.c
+++ b/udp_flow.c
@@ -15,6 +15,7 @@
 #include "passt.h"
 #include "flow_table.h"
 #include "udp_internal.h"
+#include "epoll_ctl.h"
 
 #define UDP_CONN_TIMEOUT	180 /* s, timeout for ephemeral or local bind */
 
diff --git a/util.c b/util.c
index 88a91b1100f5..b2490123590a 100644
--- a/util.c
+++ b/util.c
@@ -18,7 +18,6 @@
 #include <unistd.h>
 #include <arpa/inet.h>
 #include <net/ethernet.h>
-#include <sys/epoll.h>
 #include <sys/uio.h>
 #include <fcntl.h>
 #include <string.h>
@@ -35,6 +34,7 @@
 #include "packet.h"
 #include "log.h"
 #include "pcap.h"
+#include "epoll_ctl.h"
 #ifdef HAS_GETRANDOM
 #include <sys/random.h>
 #endif
@@ -58,7 +58,6 @@ int sock_l4_sa(const struct ctx *c, enum epoll_type type,
 	sa_family_t af = ((const struct sockaddr *)sa)->sa_family;
 	union epoll_ref ref = { .type = type, .data = data };
 	bool freebind = false;
-	struct epoll_event ev;
 	int fd, y = 1, ret;
 	uint8_t proto;
 	int socktype;
@@ -172,13 +171,9 @@ int sock_l4_sa(const struct ctx *c, enum epoll_type type,
 		return ret;
 	}
 
-	ev.events = EPOLLIN;
-	ev.data.u64 = ref.u64;
-	if (epoll_ctl(c->epollfd, EPOLL_CTL_ADD, fd, &ev) == -1) {
-		ret = -errno;
-		warn("L4 epoll_ctl: %s", strerror_(-ret));
+	ret = epoll_add(c->epollfd, EPOLLIN, &ref);
+	if (ret < 0)
 		return ret;
-	}
 
 	return fd;
 }
@@ -994,17 +989,6 @@ void raw_random(void *buf, size_t buflen)
 		die("Unexpected EOF on random data source");
 }
 
-/**
- * epoll_del() - Remove a file descriptor from our passt epoll
- * @epollfd:	epoll file descriptor to add to
- * @fd:		File descriptor to remove
- */
-void epoll_del(int epollfd, int fd)
-{
-	epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
-
-}
-
 /**
  * encode_domain_name() - Encode domain name according to RFC 1035, section 3.1
  * @buf:		Buffer to fill in with encoded domain name
diff --git a/util.h b/util.h
index c61cbef357aa..8e4b4c5c6032 100644
--- a/util.h
+++ b/util.h
@@ -193,6 +193,9 @@ int do_clone(int (*fn)(void *), char *stack_area, size_t stack_size, int flags,
 #define SNDBUF_BIG		(4ULL * 1024 * 1024)
 #define SNDBUF_SMALL		(128ULL * 1024)
 
+#define FD_REF_BITS		24
+#define FD_REF_MAX		((int)MAX_FROM_BITS(FD_REF_BITS))
+
 #include <net/if.h>
 #include <limits.h>
 #include <stdint.h>
@@ -300,7 +303,6 @@ static inline bool mod_between(unsigned x, unsigned i, unsigned j, unsigned m)
 #define FPRINTF(f, ...)	(void)fprintf(f, __VA_ARGS__)
 
 void raw_random(void *buf, size_t buflen);
-void epoll_del(int epollfd, int fd);
 
 /*
  * Starting from glibc 2.40.9000 and commit 25a5eb4010df ("string: strerror,
diff --git a/vhost_user.c b/vhost_user.c
index 1221ac1abcd0..42ceb456615f 100644
--- a/vhost_user.c
+++ b/vhost_user.c
@@ -32,8 +32,6 @@
 #include <inttypes.h>
 #include <time.h>
 #include <net/ethernet.h>
-#include <netinet/in.h>
-#include <sys/epoll.h>
 #include <sys/eventfd.h>
 #include <sys/mman.h>
 #include <linux/vhost_types.h>
@@ -45,6 +43,7 @@
 #include "vhost_user.h"
 #include "pcap.h"
 #include "migrate.h"
+#include "epoll_ctl.h"
 
 /* vhost-user version we are compatible with */
 #define VHOST_USER_VERSION 1
@@ -753,11 +752,8 @@ static void vu_set_watch(const struct vu_dev *vdev, int idx)
 		.fd = vdev->vq[idx].kick_fd,
 		.queue = idx
 	 };
-	struct epoll_event ev = { 0 };
 
-	ev.data.u64 = ref.u64;
-	ev.events = EPOLLIN;
-	epoll_ctl(vdev->context->epollfd, EPOLL_CTL_ADD, ref.fd, &ev);
+	epoll_add(vdev->context->epollfd, EPOLLIN, &ref);
 }
 
 /**
diff --git a/vu_common.c b/vu_common.c
index b716070ea3c3..b13b7c308fd8 100644
--- a/vu_common.c
+++ b/vu_common.c
@@ -6,7 +6,6 @@
  */
 
 #include <errno.h>
-#include <unistd.h>
 #include <sys/uio.h>
 #include <sys/eventfd.h>
 #include <netinet/if_ether.h>
@@ -19,6 +18,7 @@
 #include "pcap.h"
 #include "vu_common.h"
 #include "migrate.h"
+#include "epoll_ctl.h"
 
 #define VU_MAX_TX_BUFFER_NB	2
 
-- 
2.50.1


  parent reply	other threads:[~2025-10-07 16:40 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` Laurent Vivier [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251007164026.3882026-3-lvivier@redhat.com \
    --to=lvivier@redhat.com \
    --cc=passt-dev@passt.top \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).