aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorLaurent Vivier <lvivier@redhat.com>2026-01-19 17:19:13 +0100
committerStefano Brivio <sbrivio@redhat.com>2026-01-20 19:37:39 +0100
commit0fbd7af77d5222f46863cfc144f0582bd08eaf29 (patch)
tree9523af7635840e6ab17bab3f60b175b60848bf35
parentcee7eb0dbf89cc096b8dea50999c6b90708defe4 (diff)
downloadpasst-0fbd7af77d5222f46863cfc144f0582bd08eaf29.tar
passt-0fbd7af77d5222f46863cfc144f0582bd08eaf29.tar.gz
passt-0fbd7af77d5222f46863cfc144f0582bd08eaf29.tar.bz2
passt-0fbd7af77d5222f46863cfc144f0582bd08eaf29.tar.lz
passt-0fbd7af77d5222f46863cfc144f0582bd08eaf29.tar.xz
passt-0fbd7af77d5222f46863cfc144f0582bd08eaf29.tar.zst
passt-0fbd7af77d5222f46863cfc144f0582bd08eaf29.zip
tcp_splice: Register fds with epoll at flow creation
Register both splice connection sockets with epoll using empty events (events=0) in tcp_splice_connect(), before initiating the connection. This allows tcp_splice_epoll_ctl() to always use EPOLL_CTL_MOD, removing the need to check whether fds are already registered. As a result, the conditional ADD/MOD logic is no longer needed, simplifying the function. If the second flow_epoll_set() fails after the first succeeds, we don't need explicit rollback: tcp_splice_conn_from_sock() sets the CLOSING flag on error, and conn_flag() handles it by calling epoll_del() for both sockets. Signed-off-by: Laurent Vivier <lvivier@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--tcp_splice.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/tcp_splice.c b/tcp_splice.c
index a7c04ca..cb81e01 100644
--- a/tcp_splice.c
+++ b/tcp_splice.c
@@ -142,20 +142,12 @@ static uint32_t tcp_splice_conn_epoll_events(uint16_t events, unsigned sidei)
static int tcp_splice_epoll_ctl(struct tcp_splice_conn *conn)
{
uint32_t events[2];
- int m;
-
- if (flow_in_epoll(&conn->f)) {
- m = EPOLL_CTL_MOD;
- } else {
- flow_epollid_set(&conn->f, EPOLLFD_ID_DEFAULT);
- m = EPOLL_CTL_ADD;
- }
events[0] = tcp_splice_conn_epoll_events(conn->events, 0);
events[1] = tcp_splice_conn_epoll_events(conn->events, 1);
- if (flow_epoll_set(&conn->f, m, events[0], conn->s[0], 0) ||
- flow_epoll_set(&conn->f, m, events[1], conn->s[1], 1)) {
+ if (flow_epoll_set(&conn->f, EPOLL_CTL_MOD, events[0], conn->s[0], 0) ||
+ flow_epoll_set(&conn->f, EPOLL_CTL_MOD, events[1], conn->s[1], 1)) {
int ret = -errno;
flow_perror(conn, "ERROR on epoll_ctl()");
return ret;
@@ -368,6 +360,14 @@ static int tcp_splice_connect(const struct ctx *c, struct tcp_splice_conn *conn)
pif_sockaddr(c, &sa, tgtpif, &tgt->eaddr, tgt->eport);
+ flow_epollid_set(&conn->f, EPOLLFD_ID_DEFAULT);
+ if (flow_epoll_set(&conn->f, EPOLL_CTL_ADD, 0, conn->s[0], 0) ||
+ flow_epoll_set(&conn->f, EPOLL_CTL_ADD, 0, conn->s[1], 1)) {
+ int ret = -errno;
+ flow_perror(conn, "Cannot register to epollfd");
+ return ret;
+ }
+
conn_event(conn, SPLICE_CONNECT);
if (connect(conn->s[1], &sa.sa, socklen_inany(&sa))) {