From: Laurent Vivier <lvivier@redhat.com>
To: passt-dev@passt.top
Cc: Laurent Vivier <lvivier@redhat.com>
Subject: [PATCH 5/7] flow: Use epoll_id_to_fd[EPOLLFD_ID_DEFAULT] in flow_epollid_set()
Date: Fri, 19 Dec 2025 17:45:16 +0100 [thread overview]
Message-ID: <20251219164518.930012-6-lvivier@redhat.com> (raw)
In-Reply-To: <20251219164518.930012-1-lvivier@redhat.com>
In tcp_epoll_ctl() and tcp_splice_epoll_ctl(), flow_epollid_set() is
called after flow_epoll_set() to set the epollid to EPOLLFD_ID_DEFAULT.
When updating an existing flow (EPOLL_CTL_MOD), flow_epoll_set() already
retrieves the correct epoll fd via flow_epollfd(). For new additions
(EPOLL_CTL_ADD), we can use epoll_id_to_fd[EPOLLFD_ID_DEFAULT] directly
instead of c->epollfd, since that's the epollid that will be set.
This removes the need for the ctx parameter from flow_epoll_set() and
simplifies the API. The change cascades through all callers: tcp.c,
icmp.c, udp_flow.c, and tcp_splice.c.
In tcp_splice.c, removing ctx from flow_epoll_set() calls allows us to
also remove the ctx parameter from tcp_splice_epoll_ctl() and
conn_event_do(), further simplifying the splice connection handling.
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
flow.c | 8 +++-----
flow.h | 5 ++---
icmp.c | 2 +-
tcp.c | 6 +++---
tcp_splice.c | 32 ++++++++++++++------------------
udp_flow.c | 2 +-
6 files changed, 24 insertions(+), 31 deletions(-)
diff --git a/flow.c b/flow.c
index 9c98102e3616..a3f75015a078 100644
--- a/flow.c
+++ b/flow.c
@@ -393,7 +393,6 @@ void flow_epollid_clear(struct flow_common *f)
/**
* flow_epoll_set() - Add or modify epoll registration for a flow socket
- * @c: Execution context
* @type: epoll type
* @f: Flow to register socket for
* @events: epoll events to watch for
@@ -402,9 +401,8 @@ void flow_epollid_clear(struct flow_common *f)
*
* Return: 0 on success, -1 on error (from epoll_ctl())
*/
-int flow_epoll_set(const struct ctx *c, enum epoll_type type,
- const struct flow_common *f, uint32_t events, int fd,
- unsigned int sidei)
+int flow_epoll_set(enum epoll_type type, const struct flow_common *f,
+ uint32_t events, int fd, unsigned int sidei)
{
struct epoll_event ev;
union epoll_ref ref;
@@ -423,7 +421,7 @@ int flow_epoll_set(const struct ctx *c, enum epoll_type type,
epollfd = flow_epollfd(f);
} else {
m = EPOLL_CTL_ADD;
- epollfd = c->epollfd;
+ epollfd = epoll_id_to_fd[EPOLLFD_ID_DEFAULT];
}
break;
case EPOLL_TYPE_TCP_TIMER: {
diff --git a/flow.h b/flow.h
index 388fab124238..9740ede8963e 100644
--- a/flow.h
+++ b/flow.h
@@ -265,9 +265,8 @@ bool flow_in_epoll(const struct flow_common *f);
int flow_epollfd(const struct flow_common *f);
void flow_epollid_set(struct flow_common *f, int epollid);
void flow_epollid_clear(struct flow_common *f);
-int flow_epoll_set(const struct ctx *c, enum epoll_type type,
- const struct flow_common *f, uint32_t events, int fd,
- unsigned int sidei);
+int flow_epoll_set(enum epoll_type type, const struct flow_common *f,
+ uint32_t events, int fd, unsigned int sidei);
void flow_epollid_register(int epollid, int epollfd);
void flow_defer_handler(const struct ctx *c, const struct timespec *now);
int flow_migrate_source_early(struct ctx *c, const struct migrate_stage *stage,
diff --git a/icmp.c b/icmp.c
index 235759567060..f0b6fcff1776 100644
--- a/icmp.c
+++ b/icmp.c
@@ -210,7 +210,7 @@ static struct icmp_ping_flow *icmp_ping_new(const struct ctx *c,
goto cancel;
flow_epollid_set(&pingf->f, EPOLLFD_ID_DEFAULT);
- if (flow_epoll_set(c, EPOLL_TYPE_PING, &pingf->f, EPOLLIN, pingf->sock,
+ if (flow_epoll_set(EPOLL_TYPE_PING, &pingf->f, EPOLLIN, pingf->sock,
TGTSIDE) < 0) {
close(pingf->sock);
goto cancel;
diff --git a/tcp.c b/tcp.c
index 2907af282551..ec4f6d2ecc04 100644
--- a/tcp.c
+++ b/tcp.c
@@ -543,14 +543,14 @@ static int tcp_epoll_ctl(const struct ctx *c, struct tcp_tap_conn *conn)
events = tcp_conn_epoll_events(conn->events, conn->flags);
- if (flow_epoll_set(c, EPOLL_TYPE_TCP, &conn->f, events, conn->sock,
+ if (flow_epoll_set(EPOLL_TYPE_TCP, &conn->f, events, conn->sock,
!TAPSIDE(conn)))
return -errno;
flow_epollid_set(&conn->f, EPOLLFD_ID_DEFAULT);
if (conn->timer != -1) {
- if (flow_epoll_set(c, EPOLL_TYPE_TCP_TIMER, &conn->f,
+ if (flow_epoll_set(EPOLL_TYPE_TCP_TIMER, &conn->f,
EPOLLIN | EPOLLET, conn->timer, 0))
return -errno;
}
@@ -582,7 +582,7 @@ static void tcp_timer_ctl(const struct ctx *c, struct tcp_tap_conn *conn)
return;
}
- if (flow_epoll_set(c, EPOLL_TYPE_TCP_TIMER, &conn->f,
+ if (flow_epoll_set(EPOLL_TYPE_TCP_TIMER, &conn->f,
EPOLLIN | EPOLLET, fd, 0)) {
flow_dbg_perror(conn, "failed to add timer");
close(fd);
diff --git a/tcp_splice.c b/tcp_splice.c
index 7367f435367b..ccf627f4427d 100644
--- a/tcp_splice.c
+++ b/tcp_splice.c
@@ -135,22 +135,20 @@ static uint32_t tcp_splice_conn_epoll_events(uint16_t events, unsigned sidei)
/**
* tcp_splice_epoll_ctl() - Add/modify/delete epoll state from connection events
- * @c: Execution context
* @conn: Connection pointer
*
* Return: 0 on success, negative error code on failure (not on deletion)
*/
-static int tcp_splice_epoll_ctl(const struct ctx *c,
- struct tcp_splice_conn *conn)
+static int tcp_splice_epoll_ctl(struct tcp_splice_conn *conn)
{
uint32_t events[2];
events[0] = tcp_splice_conn_epoll_events(conn->events, 0);
events[1] = tcp_splice_conn_epoll_events(conn->events, 1);
- if (flow_epoll_set(c, EPOLL_TYPE_TCP_SPLICE, &conn->f, events[0],
+ if (flow_epoll_set(EPOLL_TYPE_TCP_SPLICE, &conn->f, events[0],
conn->s[0], 0) ||
- flow_epoll_set(c, EPOLL_TYPE_TCP_SPLICE, &conn->f, events[1],
+ flow_epoll_set(EPOLL_TYPE_TCP_SPLICE, &conn->f, events[1],
conn->s[1], 1)) {
int ret = -errno;
flow_perror(conn, "ERROR on epoll_ctl()");
@@ -204,12 +202,10 @@ static void conn_flag_do(struct tcp_splice_conn *conn,
/**
* conn_event_do() - Set and log connection events, update epoll state
- * @c: Execution context
* @conn: Connection pointer
* @event: Connection event
*/
-static void conn_event_do(const struct ctx *c, struct tcp_splice_conn *conn,
- unsigned long event)
+static void conn_event_do(struct tcp_splice_conn *conn, unsigned long event)
{
if (event & (event - 1)) {
int flag_index = fls(~event);
@@ -231,14 +227,14 @@ static void conn_event_do(const struct ctx *c, struct tcp_splice_conn *conn,
flow_dbg(conn, "%s", tcp_splice_event_str[flag_index]);
}
- if (tcp_splice_epoll_ctl(c, conn))
+ if (tcp_splice_epoll_ctl(conn))
conn_flag(c, conn, CLOSING);
}
-#define conn_event(c, conn, event) \
+#define conn_event(conn, event) \
do { \
flow_trace(conn, "event at %s:%i",__func__, __LINE__); \
- conn_event_do(c, conn, event); \
+ conn_event_do(conn, event); \
} while (0)
@@ -320,7 +316,7 @@ static int tcp_splice_connect_finish(const struct ctx *c,
}
if (!(conn->events & SPLICE_ESTABLISHED))
- conn_event(c, conn, SPLICE_ESTABLISHED);
+ conn_event(conn, SPLICE_ESTABLISHED);
return 0;
}
@@ -367,7 +363,7 @@ static int tcp_splice_connect(const struct ctx *c, struct tcp_splice_conn *conn)
pif_sockaddr(c, &sa, tgtpif, &tgt->eaddr, tgt->eport);
- conn_event(c, conn, SPLICE_CONNECT);
+ conn_event(conn, SPLICE_CONNECT);
if (connect(conn->s[1], &sa.sa, socklen_inany(&sa))) {
if (errno != EINPROGRESS) {
@@ -376,7 +372,7 @@ static int tcp_splice_connect(const struct ctx *c, struct tcp_splice_conn *conn)
return -errno;
}
} else {
- conn_event(c, conn, SPLICE_ESTABLISHED);
+ conn_event(conn, SPLICE_ESTABLISHED);
return tcp_splice_connect_finish(c, conn);
}
@@ -485,14 +481,14 @@ void tcp_splice_sock_handler(struct ctx *c, union epoll_ref ref,
if (events & EPOLLOUT) {
fromsidei = !evsidei;
- conn_event(c, conn, ~OUT_WAIT(evsidei));
+ conn_event(conn, ~OUT_WAIT(evsidei));
} else {
fromsidei = evsidei;
}
if (events & EPOLLRDHUP)
/* For side 0 this is fake, but implied */
- conn_event(c, conn, FIN_RCVD(evsidei));
+ conn_event(conn, FIN_RCVD(evsidei));
swap:
eof = 0;
@@ -574,7 +570,7 @@ retry:
if (conn->read[fromsidei] == conn->written[fromsidei])
break;
- conn_event(c, conn, OUT_WAIT(!fromsidei));
+ conn_event(conn, OUT_WAIT(!fromsidei));
break;
}
@@ -596,7 +592,7 @@ retry:
if ((conn->events & FIN_RCVD(sidei)) &&
!(conn->events & FIN_SENT(!sidei))) {
shutdown(conn->s[!sidei], SHUT_WR);
- conn_event(c, conn, FIN_SENT(!sidei));
+ conn_event(conn, FIN_SENT(!sidei));
}
}
}
diff --git a/udp_flow.c b/udp_flow.c
index 42f3622d621c..07ff589670c1 100644
--- a/udp_flow.c
+++ b/udp_flow.c
@@ -84,7 +84,7 @@ static int udp_flow_sock(const struct ctx *c,
}
flow_epollid_set(&uflow->f, EPOLLFD_ID_DEFAULT);
- rc = flow_epoll_set(c, EPOLL_TYPE_UDP, &uflow->f, EPOLLIN, s, sidei);
+ rc = flow_epoll_set(EPOLL_TYPE_UDP, &uflow->f, EPOLLIN, s, sidei);
if (rc < 0) {
close(s);
return rc;
--
2.51.1
next prev parent reply other threads:[~2025-12-19 16:45 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-19 16:45 [PATCH 0/7] flow: Introduce flow_epoll_set() to centralize epoll operations Laurent Vivier
2025-12-19 16:45 ` [PATCH 1/7] tcp: Update EPOLL_TYPE_TCP_TIMER fd Laurent Vivier
2025-12-19 16:45 ` [PATCH 2/7] udp_flow: Assign socket to flow inside udp_flow_sock() Laurent Vivier
2025-12-19 16:45 ` [PATCH 3/7] tcp_splice: Refactor tcp_splice_conn_epoll_events() to per-side computation Laurent Vivier
2025-12-19 16:45 ` [PATCH 4/7] flow: Introduce flow_epoll_set() to centralize epoll operations Laurent Vivier
2025-12-19 16:45 ` Laurent Vivier [this message]
2025-12-19 16:45 ` [PATCH 6/7] flow: Compute epoll events inside flow_epoll_set() Laurent Vivier
2025-12-19 16:45 ` [PATCH 7/7] flow: Have flow_epoll_set() retrieve file descriptor from flow structure 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=20251219164518.930012-6-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).