From: Willy Tarreau Date: Thu, 29 Jul 2021 06:04:00 +0000 (+0200) Subject: MINOR: fd: update flags only once in fd_update_events() X-Git-Tag: v2.5-dev3~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a199a17d72a9cfbc734bac991d45af9feb1f1c30;p=thirdparty%2Fhaproxy.git MINOR: fd: update flags only once in fd_update_events() Since 2.4 with commit f50906519 ("MEDIUM: fd: merge fdtab[].ev and state for FD_EV_* and FD_POLL_* into state") we can merge all flag updates at once in fd_update_events(). Previously this was performed in 1 to 3 steps, setting the polling state, then setting READY_R if in/err/hup, and setting READY_W if out/err. But since the commit above, all flags are stored together in the same structure field that is being updated with the new flags, thus we can simply update the flags altogether and avoid multiple atomic operations. This even removes the need for atomic ops for FDs that are not shared. --- diff --git a/include/haproxy/fd.h b/include/haproxy/fd.h index 66a9aea8f9..e1a80d7352 100644 --- a/include/haproxy/fd.h +++ b/include/haproxy/fd.h @@ -397,6 +397,12 @@ static inline void fd_update_events(int fd, uint evts) must_stop = FD_POLL_OUT; } + if (new_flags & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) + new_flags |= FD_EV_READY_R; + + if (new_flags & (FD_POLL_OUT | FD_POLL_ERR)) + new_flags |= FD_EV_READY_W; + old = fdtab[fd].state; new = (old & ~FD_POLL_UPDT_MASK) | new_flags; @@ -409,12 +415,6 @@ static inline void fd_update_events(int fd, uint evts) fdtab[fd].state = new; } - if (fdtab[fd].state & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) - fd_may_recv(fd); - - if (fdtab[fd].state & (FD_POLL_OUT | FD_POLL_ERR)) - fd_may_send(fd); - if (fdtab[fd].iocb && fd_active(fd)) { fdtab[fd].iocb(fd); }