From: Willy Tarreau Date: Thu, 25 Jan 2018 17:06:46 +0000 (+0100) Subject: MEDIUM: poller: use atomic ops to update the fdtab mask X-Git-Tag: v1.9-dev1~439 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=62a627ac197fe69dcf60d87eac943c8f7f8de2f6;p=thirdparty%2Fhaproxy.git MEDIUM: poller: use atomic ops to update the fdtab mask We don't need to lock the fdtab[].lock anymore since we only have one modification left (update update_mask). Let's use an atomic AND instead. --- diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 3edaf288cb..b98ca8ca80 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -79,10 +79,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); if (fdtab[fd].polled_mask & tid_bit) { if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) { diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index fcd04fda90..cc96307b0a 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -52,10 +52,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) { if (!(fdtab[fd].polled_mask & tid_bit)) { diff --git a/src/ev_poll.c b/src/ev_poll.c index 22cb227578..edcfe65651 100644 --- a/src/ev_poll.c +++ b/src/ev_poll.c @@ -70,10 +70,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); /* we have a single state for all threads, which is why we * don't check the tid_bit. First thread to see the update diff --git a/src/ev_select.c b/src/ev_select.c index db0814d6e3..6e834678db 100644 --- a/src/ev_select.c +++ b/src/ev_select.c @@ -62,10 +62,8 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) continue; } - HA_SPIN_LOCK(FD_LOCK, &fdtab[fd].lock); - fdtab[fd].update_mask &= ~tid_bit; en = fdtab[fd].state; - HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit); /* we have a single state for all threads, which is why we * don't check the tid_bit. First thread to see the update