From: Willy Tarreau Date: Thu, 30 Jan 2025 15:32:35 +0000 (+0100) Subject: MEDIUM: epoll: skip reports of stale file descriptors X-Git-Tag: v3.2-dev5~69 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=8235a24782e528b9bf8ca9dd69c0a147556dfcb5;p=thirdparty%2Fhaproxy.git MEDIUM: epoll: skip reports of stale file descriptors Now that we can see that some events are reported for older instances of a file descriptor, let's skip these ones instead of reporting dangerous events on them. It might possibly qualify as a bug if it helps fixing strange issues in certain environments, in which case it can make sense to backport it along with the following recent patches: DEBUG: fd: add a counter of takeovers of an FD since it was last opened MINOR: fd: add a generation number to file descriptors DEBUG: epoll: store and compare the FD's generation count with reported event --- diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 02ac0ff95..21770aa35 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -266,7 +266,9 @@ static void _do_poll(struct poller *p, int exp, int wake) fd_gen = _HA_ATOMIC_LOAD(&fdtab[fd].generation); if (unlikely(ev_gen != fd_gen)) { - /* this is a stale report for an older instance of this FD */ + /* this is a stale report for an older instance of this FD, + * we must ignore it. + */ if (_HA_ATOMIC_LOAD(&fdtab[fd].owner)) { ulong tmask = _HA_ATOMIC_LOAD(&fdtab[fd].thread_mask); @@ -297,6 +299,7 @@ static void _do_poll(struct poller *p, int exp, int wake) } else { COUNT_IF(1, "epoll report of event on a just closed fd (harmless)"); } + continue; } if ((e & EPOLLRDHUP) && !(cur_poller.flags & HAP_POLL_F_RDHUP))