From: Willy Tarreau Date: Fri, 30 Jul 2021 11:55:36 +0000 (+0200) Subject: BUG/MINOR: select: fix excess number of dead/skip reported X-Git-Tag: v2.5-dev3~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fcc5281513eabe0d7790d98e50ee8cd9be216c1b;p=thirdparty%2Fhaproxy.git BUG/MINOR: select: fix excess number of dead/skip reported In 1.8, commit ab62f5195 ("MINOR: polling: Use fd_update_events to update events seen for a fd") updated the pollers to rely on fd_update_events(), but the modification delayed the test of presence of the FD in the report, resulting in owner/thread_mask and possibly event updates being performed for each FD appearing in a block of 32 FDs around an active one. This caused the request rate to be ~3 times lower with select() than poll() under 6 threads. This can be backported as far as 1.8. --- diff --git a/src/ev_select.c b/src/ev_select.c index ab5da35b7c..3e5ee5a252 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -197,6 +197,15 @@ static void _do_poll(struct poller *p, int exp, int wake) for (count = BITS_PER_INT, fd = fds * BITS_PER_INT; count && fd < maxfd; count--, fd++) { unsigned int n = 0; + if (FD_ISSET(fd, tmp_evts[DIR_RD])) + n |= FD_EV_READY_R; + + if (FD_ISSET(fd, tmp_evts[DIR_WR])) + n |= FD_EV_READY_W; + + if (!n) + continue; + #ifdef DEBUG_FD _HA_ATOMIC_INC(&fdtab[fd].event_count); #endif @@ -210,12 +219,6 @@ static void _do_poll(struct poller *p, int exp, int wake) continue; } - if (FD_ISSET(fd, tmp_evts[DIR_RD])) - n |= FD_EV_READY_R; - - if (FD_ISSET(fd, tmp_evts[DIR_WR])) - n |= FD_EV_READY_W; - fd_update_events(fd, n); } }