diff options
| author | Laurent Vivier <lvivier@redhat.com> | 2026-01-09 17:54:34 +0100 |
|---|---|---|
| committer | Stefano Brivio <sbrivio@redhat.com> | 2026-01-14 01:07:51 +0100 |
| commit | cce0470907d033ddfe6e80c1444dbb579c2b2c49 (patch) | |
| tree | d4d70d17a633a62c972a73ab3eb3f8fb989cb69c | |
| parent | 5614bdc62861f63a25eb2997ddaecbfdc3e06748 (diff) | |
| download | passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.tar passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.tar.gz passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.tar.bz2 passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.tar.lz passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.tar.xz passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.tar.zst passt-cce0470907d033ddfe6e80c1444dbb579c2b2c49.zip | |
tcp: cleanup timer creation
Refactor tcp_timer_ctl() to use the epoll_add() helper instead of
manually constructing epoll_event and calling epoll_ctl() directly.
Also separate the error handling for timerfd_create() failure (-1)
from fd overflow (> FD_REF_MAX) to provide more specific debug
messages. The overflow case now logs the actual fd value, using
flow_dbg_perror() in this case was not correct (no errno set).
Delay setting conn->timer until epoll_add() succeeds, removing
redundant conn->timer = -1 assignments in error paths since the
timer is already -1 when we enter this block.
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.c | 32 |
1 files changed, 17 insertions, 15 deletions
@@ -567,30 +567,32 @@ 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); + union epoll_ref ref; int fd; fd = timerfd_create(CLOCK_MONOTONIC, 0); - if (fd == -1 || fd > FD_REF_MAX) { + if (fd == -1) { 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 (fd > FD_REF_MAX) { + flow_dbg(conn, "timer fd overflow (%d > %d)", + fd, FD_REF_MAX); + close(fd); + return; + } - if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn->timer, &ev)) { - flow_dbg_perror(conn, "failed to add timer"); - close(conn->timer); - conn->timer = -1; + ref.type = EPOLL_TYPE_TCP_TIMER; + ref.flow = FLOW_IDX(conn); + ref.fd = fd; + if (epoll_add(flow_epollfd(&conn->f), EPOLLIN | EPOLLET, + ref) < 0) { + flow_dbg(conn, "failed to add timer"); + close(fd); return; } + + conn->timer = fd; } if (conn->flags & ACK_TO_TAP_DUE) { |
