From: David Gibson <david@gibson.dropbear.id.au>
To: Laurent Vivier <lvivier@redhat.com>
Cc: passt-dev@passt.top
Subject: Re: [PATCH v3 2/6] epoll_ctl: Extract epoll operations
Date: Mon, 13 Oct 2025 15:28:39 +1100 [thread overview]
Message-ID: <aOx_96enGfSRHjGI@zatzit> (raw)
In-Reply-To: <20251009130409.3931795-3-lvivier@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 20186 bytes --]
On Thu, Oct 09, 2025 at 03:04:05PM +0200, Laurent Vivier wrote:
> 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>
Nice cleanup. One nit noted below.
> ---
> 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));
I think this should be err() not warn(). If we're unable to add an fd
to epoll things are almost certainly going to go badly wrong.
> + }
> +
> + 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 9100c67e57e0..c2d842bbdf4f 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 f8324c59cc6c..aea1e2cbcea5 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
>
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2025-10-13 4:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-09 13:04 [PATCH v3 0/6] Refactor epoll handling in preparation for multithreading Laurent Vivier
2025-10-09 13:04 ` [PATCH v3 1/6] util: Simplify epoll_del() interface to take epollfd directly Laurent Vivier
2025-10-16 21:31 ` Stefano Brivio
2025-10-09 13:04 ` [PATCH v3 2/6] epoll_ctl: Extract epoll operations Laurent Vivier
2025-10-13 4:28 ` David Gibson [this message]
2025-10-16 21:31 ` Stefano Brivio
2025-10-16 23:07 ` David Gibson
2025-10-09 13:04 ` [PATCH v3 3/6] util: Move epoll registration out of sock_l4_sa() Laurent Vivier
2025-10-13 4:47 ` David Gibson
2025-10-09 13:04 ` [PATCH v3 4/6] tcp, flow: Replace per-connection in_epoll flag with threadnb in flow_common Laurent Vivier
2025-10-15 3:54 ` David Gibson
2025-10-09 13:04 ` [PATCH v3 5/6] icmp: Use thread-based epoll management for ICMP flows Laurent Vivier
2025-10-09 13:04 ` [PATCH v3 6/6] udp: Use thread-based epoll management for UDP flows 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=aOx_96enGfSRHjGI@zatzit \
--to=david@gibson.dropbear.id.au \
--cc=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).