From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=GzzGZHzG; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by passt.top (Postfix) with ESMTPS id 549A25A0626 for ; Fri, 09 Jan 2026 10:26:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1767950773; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=QY6pjmUzrCT4zCkRrcjHM8nmRDrDuvzZAOgQ5O8Rp4k=; b=GzzGZHzGiUHN0bbfYfF3GV9XJalbfELf3495ZVe5L7FLZ0jwL/ZrdzuLyYKAoxd+znpt16 7AYu0K0ImKFfwviHlufjFwpQAlGbEAqinWZMJV+IOeofy50qgb7DwfUmff3uFwODdKqjHY IyJSaaXtOwD40hJIZJPlR1h3tIWH6UE= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-139-ckwaFBdpOI2RDfuXlc06nA-1; Fri, 09 Jan 2026 04:26:11 -0500 X-MC-Unique: ckwaFBdpOI2RDfuXlc06nA-1 X-Mimecast-MFC-AGG-ID: ckwaFBdpOI2RDfuXlc06nA_1767950770 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4775d8428e8so32575925e9.0 for ; Fri, 09 Jan 2026 01:26:11 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767950770; x=1768555570; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=QY6pjmUzrCT4zCkRrcjHM8nmRDrDuvzZAOgQ5O8Rp4k=; b=EraLlhPL5njLRQY69A7sBWcFBd7h2W88fDE2Y2FQ/JpSGJ+nTDadkJw4eV1hOsTuHx ybXv+28q2jHm/aCfCDGWmiWmhjs8oFtxGpvp6dJPJUV7Io2Jlv/+m5AceyZs8EIk3fdH SGnKO889Cx2d1+aWXUawSWhdZ2VsvUrqFi0kt3IrITop3/iMwSoflZ5Uv7FrzEbUjQ7A oTpNAyBC5lqdAy70dsYrPfkkm4Gj8T2XWvTNP83bZcPs72oNmwyz/89zGjA3Kkrav1YM na2hONmUfyOK9FIo+YSGv7bC9Jq3oiYu9PIRSSTYb5p39IsplYP+7JKystE9rqobEW4/ Ji4w== X-Gm-Message-State: AOJu0YwPU3U7IOOlhlxDFIQW41GJSykcVy8hGxbSfMoFw7UFraI+0Hl6 VfpQAd55hYwJyRuo1eHaMQjpJY7BiSZHZkJIN8HWgY3DVHLBdvo7zbPHDDNvU/9mMyCuLhb1zG+ 9jx9aIYVNedC+nuYsnTjqgHivn2r0S0QsOknpJGvZiYj9xrbcweqtEQ== X-Gm-Gg: AY/fxX7IbUOE/cytiRYJDeFCvz5DKy5PIOZB/LymqKFmcywCNvwc4IvyqI8KnaStSB5 gZ4vheL8nyngFNOZdNeOsUR5QuWis2I/Ks87LZHP28bVm4AWJhJtFv8WSJ6zwl9WCPiIXpi8FRk 6gK3PgHC+9SGXeC6UGJNq3GZOPCx+ucCMVPcJV44IE5GLR5zwX34dowpUS7vHPnKkGsWzHtWMUr h0UbrB+UnG42JPtTe9ryMknKRlz/RRD5KVX30IyhuZRgVN61Dabq0ZrWrc2gqSpRMH8daGScuhd fp00E724S5PfitDU1PaE5K/7Keqm6nARvcOGpHppXbKl4OSxsYLtuD7gb8P12pJFrFhkJLTekgP 9wW+v0xzwhakyvWFzAVEYr30LqDxNb4r8WzGYzyBxLgEG+iVX X-Received: by 2002:a05:600c:3e8e:b0:477:93f7:bbc5 with SMTP id 5b1f17b1804b1-47d84b18596mr101063515e9.10.1767950769860; Fri, 09 Jan 2026 01:26:09 -0800 (PST) X-Google-Smtp-Source: AGHT+IEgLY+RKUcwDzOIozT3sEiqXBbqCMrwiD7ojdgn5BHQyVkTnBP64+0iH2UVDXszOOpPID0Bpg== X-Received: by 2002:a05:600c:3e8e:b0:477:93f7:bbc5 with SMTP id 5b1f17b1804b1-47d84b18596mr101063235e9.10.1767950769257; Fri, 09 Jan 2026 01:26:09 -0800 (PST) Received: from ?IPV6:2a01:e0a:e10:ef90:343a:68f:2e91:95c? ([2a01:e0a:e10:ef90:343a:68f:2e91:95c]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47d7f695956sm203204625e9.6.2026.01.09.01.26.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 09 Jan 2026 01:26:08 -0800 (PST) Message-ID: <69ef59f2-9a83-47da-bc34-62cf1d957553@redhat.com> Date: Fri, 9 Jan 2026 10:26:08 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 5/5] flow: Introduce flow_epoll_set() to centralize epoll operations To: David Gibson References: <20260108140119.1204797-1-lvivier@redhat.com> <20260108140119.1204797-6-lvivier@redhat.com> From: Laurent Vivier Autocrypt: addr=lvivier@redhat.com; keydata= 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 In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: V2_WVoCWQY-Yuw0L4sSuCGE5D1M5rJ9O60acpR6rBq8_1767950770 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Message-ID-Hash: E4DN54O5XQXWKOVGTCVIIF7RQO25WS3H X-Message-ID-Hash: E4DN54O5XQXWKOVGTCVIIF7RQO25WS3H X-MailFrom: lvivier@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On 1/9/26 00:33, David Gibson wrote: > On Thu, Jan 08, 2026 at 03:01:19PM +0100, Laurent Vivier wrote: >> Currently, each flow type (TCP, TCP_SPLICE, PING, UDP) has its own >> code to add or modify file descriptors in epoll. This leads to >> duplicated boilerplate code across icmp.c, tcp.c, tcp_splice.c, and >> udp_flow.c, each setting up epoll_ref unions and calling epoll_ctl() >> with flow-type-specific details. >> >> Introduce flow_epoll_set() in flow.c to handle epoll operations for >> all flow types in a unified way. The function takes an explicit epoll >> type parameter, allowing it to handle not only flow socket types but >> also the TCP timer (EPOLL_TYPE_TCP_TIMER). >> >> This will be needed to migrate queue pair from an epollfd to another. >> >> Signed-off-by: Laurent Vivier > > I'm not totally convinced if folding in TCP timers with the socket fds > makes sense. I think there's still room for improving consistency of I agree. And as we don't need to manage the EPOLL_CTL_MOD for it anymore, the case is simpler. Moreover, if we don't manage it in the function we can remove the epoll_type from the parameters as we can rely on the flow type. Thanks, Laurent > the epoll lifecycle (removing the in_epoll flag equivalent). But both > of those can be looked at later. So, > > Reviewed-by: David Gibson > >> --- >> flow.c | 33 ++++++++++++++++++++ >> flow.h | 3 ++ >> icmp.c | 11 +++---- >> tcp.c | 64 ++++++++++++++++++++------------------ >> tcp_splice.c | 86 +++++++++++++++++++++++++--------------------------- >> udp_flow.c | 12 +++----- >> 6 files changed, 119 insertions(+), 90 deletions(-) >> >> diff --git a/flow.c b/flow.c >> index 4f53486586cd..73d24f9d3765 100644 >> --- a/flow.c >> +++ b/flow.c >> @@ -20,6 +20,7 @@ >> #include "flow.h" >> #include "flow_table.h" >> #include "repair.h" >> +#include "epoll_ctl.h" >> >> const char *flow_state_str[] = { >> [FLOW_STATE_FREE] = "FREE", >> @@ -390,6 +391,38 @@ void flow_epollid_clear(struct flow_common *f) >> f->epollid = EPOLLFD_ID_INVALID; >> } >> >> +/** >> + * flow_epoll_set() - Add or modify epoll registration for a flow socket >> + * @command: epoll_ctl() command: EPOLL_CTL_ADD or EPOLL_CTL_MOD >> + * @type: epoll type >> + * @f: Flow to register socket for >> + * @events: epoll events to watch for >> + * @fd: File descriptor to register >> + * @sidei: Side index of the flow >> + * >> + * Return: 0 on success, -1 on error (from epoll_ctl()) >> + */ >> +int flow_epoll_set(int command, 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; >> + >> + ref.type = type; >> + ref.fd = fd; >> + >> + if (type == EPOLL_TYPE_TCP_TIMER) >> + ref.flow = flow_idx(f); >> + else >> + ref.flowside = flow_sidx(f, sidei); >> + >> + ev.events = events; >> + ev.data.u64 = ref.u64; >> + >> + return epoll_ctl(flow_epollfd(f), command, fd, &ev); >> +} >> + >> /** >> * flow_epollid_register() - Initialize the epoll id -> fd mapping >> * @epollid: epoll id to associate to >> diff --git a/flow.h b/flow.h >> index b43b0b1dd7f2..bd5c6d90322b 100644 >> --- a/flow.h >> +++ b/flow.h >> @@ -265,6 +265,9 @@ 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(int command, 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 9564c4963f7b..b6bb36d80715 100644 >> --- a/icmp.c >> +++ b/icmp.c >> @@ -177,7 +177,6 @@ static struct icmp_ping_flow *icmp_ping_new(const struct ctx *c, >> union flow *flow = flow_alloc(); >> struct icmp_ping_flow *pingf; >> const struct flowside *tgt; >> - union epoll_ref ref; >> >> if (!flow) >> return NULL; >> @@ -211,13 +210,11 @@ static struct icmp_ping_flow *icmp_ping_new(const struct ctx *c, >> goto cancel; >> >> flow_epollid_set(&pingf->f, EPOLLFD_ID_DEFAULT); >> - >> - ref.type = EPOLL_TYPE_PING; >> - ref.flowside = FLOW_SIDX(flow, TGTSIDE); >> - ref.fd = pingf->sock; >> - >> - if (epoll_add(flow_epollfd(&pingf->f), EPOLLIN, ref) < 0) { >> + if (flow_epoll_set(EPOLL_CTL_ADD, EPOLL_TYPE_PING, &pingf->f, >> + EPOLLIN, pingf->sock, >> + TGTSIDE) < 0) { >> close(pingf->sock); >> + flow_epollid_clear(&pingf->f); >> goto cancel; >> } >> >> diff --git a/tcp.c b/tcp.c >> index 5141cdc7e839..d8cc11b377de 100644 >> --- a/tcp.c >> +++ b/tcp.c >> @@ -523,34 +523,44 @@ static uint32_t tcp_conn_epoll_events(uint8_t events, uint8_t conn_flags) >> >> /** >> * tcp_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_epoll_ctl(const struct ctx *c, struct tcp_tap_conn *conn) >> +static int tcp_epoll_ctl(struct tcp_tap_conn *conn) >> { >> - int m = flow_in_epoll(&conn->f) ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; >> - union epoll_ref ref = { .type = EPOLL_TYPE_TCP, .fd = conn->sock, >> - .flowside = FLOW_SIDX(conn, !TAPSIDE(conn)), }; >> - struct epoll_event ev = { .data.u64 = ref.u64 }; >> - int epollfd = flow_in_epoll(&conn->f) ? flow_epollfd(&conn->f) >> - : c->epollfd; >> + uint32_t events; >> + int m; >> >> if (conn->events == CLOSED) { >> - if (flow_in_epoll(&conn->f)) >> + if (flow_in_epoll(&conn->f)) { >> + int epollfd = flow_epollfd(&conn->f); >> + >> epoll_del(epollfd, conn->sock); >> - if (conn->timer != -1) >> - epoll_del(epollfd, conn->timer); >> + if (conn->timer != -1) >> + epoll_del(epollfd, conn->timer); >> + } >> + >> return 0; >> } >> >> - ev.events = tcp_conn_epoll_events(conn->events, conn->flags); >> + events = tcp_conn_epoll_events(conn->events, conn->flags); >> >> - if (epoll_ctl(epollfd, m, conn->sock, &ev)) >> - return -errno; >> + if (flow_in_epoll(&conn->f)) { >> + m = EPOLL_CTL_MOD; >> + } else { >> + flow_epollid_set(&conn->f, EPOLLFD_ID_DEFAULT); >> + m = EPOLL_CTL_ADD; >> + } >> + >> + if (flow_epoll_set(m, EPOLL_TYPE_TCP, &conn->f, events, conn->sock, >> + !TAPSIDE(conn)) < 0) { >> + int ret = -errno; >> >> - flow_epollid_set(&conn->f, EPOLLFD_ID_DEFAULT); >> + if (m == EPOLL_CTL_ADD) >> + flow_epollid_clear(&conn->f); >> + return ret; >> + } >> >> return 0; >> } >> @@ -569,11 +579,6 @@ static void tcp_timer_ctl(const struct ctx *c, struct tcp_tap_conn *conn) >> return; >> >> if (conn->timer == -1) { >> - union epoll_ref ref = { .type = EPOLL_TYPE_TCP_TIMER, >> - .flow = FLOW_IDX(conn) }; >> - struct epoll_event ev = { .data.u64 = ref.u64, >> - .events = EPOLLIN | EPOLLET }; >> - int epollfd = flow_epollfd(&conn->f); >> int fd; >> >> fd = timerfd_create(CLOCK_MONOTONIC, 0); >> @@ -581,18 +586,17 @@ static void tcp_timer_ctl(const struct ctx *c, struct tcp_tap_conn *conn) >> flow_dbg_perror(conn, "failed to get timer"); >> if (fd > -1) >> close(fd); >> - conn->timer = -1; >> return; >> } >> - conn->timer = fd; >> - ref.fd = conn->timer; >> >> - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn->timer, &ev)) { >> + if (flow_epoll_set(EPOLL_CTL_ADD, EPOLL_TYPE_TCP_TIMER, >> + &conn->f, EPOLLIN | EPOLLET, fd, 0) < 0) { >> flow_dbg_perror(conn, "failed to add timer"); >> - close(conn->timer); >> - conn->timer = -1; >> + close(fd); >> return; >> } >> + >> + conn->timer = fd; >> } >> >> if (conn->flags & ACK_TO_TAP_DUE) { >> @@ -669,7 +673,7 @@ void conn_flag_do(const struct ctx *c, struct tcp_tap_conn *conn, >> } >> >> if (flag == STALLED || flag == ~STALLED) >> - tcp_epoll_ctl(c, conn); >> + tcp_epoll_ctl(conn); >> >> if (flag == ACK_FROM_TAP_DUE || flag == ACK_TO_TAP_DUE || >> (flag == ~ACK_FROM_TAP_DUE && (conn->flags & ACK_TO_TAP_DUE)) || >> @@ -726,7 +730,7 @@ void conn_event_do(const struct ctx *c, struct tcp_tap_conn *conn, >> } else { >> if (event == CLOSED) >> flow_hash_remove(c, TAP_SIDX(conn)); >> - tcp_epoll_ctl(c, conn); >> + tcp_epoll_ctl(conn); >> } >> >> if (CONN_HAS(conn, SOCK_FIN_SENT | TAP_FIN_ACKED)) >> @@ -1742,7 +1746,7 @@ static void tcp_conn_from_tap(const struct ctx *c, sa_family_t af, >> conn_event(c, conn, TAP_SYN_ACK_SENT); >> } >> >> - tcp_epoll_ctl(c, conn); >> + tcp_epoll_ctl(conn); >> >> if (c->mode == MODE_VU) { /* To rebind to same oport after migration */ >> socklen_t sl = sizeof(sa); >> @@ -3984,7 +3988,7 @@ int tcp_flow_migrate_target_ext(struct ctx *c, struct tcp_tap_conn *conn, int fd >> tcp_send_flag(c, conn, ACK); >> tcp_data_from_sock(c, conn); >> >> - if ((rc = tcp_epoll_ctl(c, conn))) { >> + if ((rc = tcp_epoll_ctl(conn))) { >> flow_dbg(conn, >> "Failed to subscribe to epoll for migrated socket: %s", >> strerror_(-rc)); >> diff --git a/tcp_splice.c b/tcp_splice.c >> index bf4ff466de07..26e9845c39ee 100644 >> --- a/tcp_splice.c >> +++ b/tcp_splice.c >> @@ -135,37 +135,35 @@ 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) >> { >> - int epollfd = flow_in_epoll(&conn->f) ? flow_epollfd(&conn->f) >> - : c->epollfd; >> - int m = flow_in_epoll(&conn->f) ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; >> - const union epoll_ref ref[SIDES] = { >> - { .type = EPOLL_TYPE_TCP_SPLICE, .fd = conn->s[0], >> - .flowside = FLOW_SIDX(conn, 0) }, >> - { .type = EPOLL_TYPE_TCP_SPLICE, .fd = conn->s[1], >> - .flowside = FLOW_SIDX(conn, 1) } >> - }; >> - struct epoll_event ev[SIDES] = { { .data.u64 = ref[0].u64 }, >> - { .data.u64 = ref[1].u64 } }; >> - >> - ev[0].events = tcp_splice_conn_epoll_events(conn->events, 0); >> - ev[1].events = tcp_splice_conn_epoll_events(conn->events, 1); >> - >> - >> - if (epoll_ctl(epollfd, m, conn->s[0], &ev[0]) || >> - epoll_ctl(epollfd, m, conn->s[1], &ev[1])) { >> + 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(m, EPOLL_TYPE_TCP_SPLICE, &conn->f, events[0], >> + conn->s[0], 0) || >> + flow_epoll_set(m, EPOLL_TYPE_TCP_SPLICE, &conn->f, events[1], >> + conn->s[1], 1)) { >> int ret = -errno; >> flow_perror(conn, "ERROR on epoll_ctl()"); >> + if (m == EPOLL_CTL_ADD) >> + flow_epollid_clear(&conn->f); >> return ret; >> } >> - flow_epollid_set(&conn->f, EPOLLFD_ID_DEFAULT); >> >> return 0; >> } >> @@ -205,7 +203,7 @@ static void conn_flag_do(struct tcp_splice_conn *conn, >> } >> } >> >> -#define conn_flag(c, conn, flag) \ >> +#define conn_flag(conn, flag) \ >> do { \ >> flow_trace(conn, "flag at %s:%i", __func__, __LINE__); \ >> conn_flag_do(conn, flag); \ >> @@ -213,12 +211,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); >> @@ -240,14 +236,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)) >> - conn_flag(c, conn, CLOSING); >> + if (tcp_splice_epoll_ctl(conn)) >> + conn_flag(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) >> >> >> @@ -315,7 +311,7 @@ static int tcp_splice_connect_finish(const struct ctx *c, >> if (pipe2(conn->pipe[sidei], O_NONBLOCK | O_CLOEXEC)) { >> flow_perror(conn, "cannot create %d->%d pipe", >> sidei, !sidei); >> - conn_flag(c, conn, CLOSING); >> + conn_flag(conn, CLOSING); >> return -EIO; >> } >> >> @@ -329,7 +325,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; >> } >> @@ -376,7 +372,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) { >> @@ -385,7 +381,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); >> } >> >> @@ -445,7 +441,7 @@ void tcp_splice_conn_from_sock(const struct ctx *c, union flow *flow, int s0) >> flow_trace(conn, "failed to set TCP_QUICKACK on %i", s0); >> >> if (tcp_splice_connect(c, conn)) >> - conn_flag(c, conn, CLOSING); >> + conn_flag(conn, CLOSING); >> >> FLOW_ACTIVATE(conn); >> } >> @@ -494,14 +490,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; >> @@ -536,7 +532,7 @@ retry: >> more = SPLICE_F_MORE; >> >> if (conn->flags & lowat_set_flag) >> - conn_flag(c, conn, lowat_act_flag); >> + conn_flag(conn, lowat_act_flag); >> } >> >> do >> @@ -568,8 +564,8 @@ retry: >> "Setting SO_RCVLOWAT %i: %s", >> lowat, strerror_(errno)); >> } else { >> - conn_flag(c, conn, lowat_set_flag); >> - conn_flag(c, conn, lowat_act_flag); >> + conn_flag(conn, lowat_set_flag); >> + conn_flag(conn, lowat_act_flag); >> } >> } >> >> @@ -583,7 +579,7 @@ retry: >> if (conn->read[fromsidei] == conn->written[fromsidei]) >> break; >> >> - conn_event(c, conn, OUT_WAIT(!fromsidei)); >> + conn_event(conn, OUT_WAIT(!fromsidei)); >> break; >> } >> >> @@ -605,7 +601,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)); >> } >> } >> } >> @@ -626,7 +622,7 @@ retry: >> return; >> >> close: >> - conn_flag(c, conn, CLOSING); >> + conn_flag(conn, CLOSING); >> } >> >> /** >> @@ -762,10 +758,10 @@ void tcp_splice_timer(struct tcp_splice_conn *conn) >> flow_trace(conn, "can't set SO_RCVLOWAT on %d", >> conn->s[sidei]); >> } >> - conn_flag(c, conn, ~RCVLOWAT_SET(sidei)); >> + conn_flag(conn, ~RCVLOWAT_SET(sidei)); >> } >> } >> >> flow_foreach_sidei(sidei) >> - conn_flag(c, conn, ~RCVLOWAT_ACT(sidei)); >> + conn_flag(conn, ~RCVLOWAT_ACT(sidei)); >> } >> diff --git a/udp_flow.c b/udp_flow.c >> index c4cf35c2c89d..b016a8095ec6 100644 >> --- a/udp_flow.c >> +++ b/udp_flow.c >> @@ -74,7 +74,6 @@ static int udp_flow_sock(const struct ctx *c, >> { >> const struct flowside *side = &uflow->f.side[sidei]; >> uint8_t pif = uflow->f.pif[sidei]; >> - union epoll_ref ref; >> int rc; >> int s; >> >> @@ -84,14 +83,11 @@ static int udp_flow_sock(const struct ctx *c, >> return s; >> } >> >> - ref.type = EPOLL_TYPE_UDP; >> - ref.flowside = FLOW_SIDX(uflow, sidei); >> - ref.fd = s; >> - >> flow_epollid_set(&uflow->f, EPOLLFD_ID_DEFAULT); >> - >> - rc = epoll_add(flow_epollfd(&uflow->f), EPOLLIN, ref); >> - if (rc < 0) { >> + if (flow_epoll_set(EPOLL_CTL_ADD, EPOLL_TYPE_UDP, &uflow->f, >> + EPOLLIN, s, sidei) < 0) { >> + rc = -errno; >> + flow_epollid_clear(&uflow->f); >> close(s); >> return rc; >> } >> -- >> 2.52.0 >> >