]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: fd: use atomic ops for hap_fd_{clr,set} and remove poll_lock
authorWilly Tarreau <w@1wt.eu>
Thu, 25 Jan 2018 15:59:09 +0000 (16:59 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 29 Jan 2018 15:03:15 +0000 (16:03 +0100)
Now that we can use atomic ops to set/clear an fd occurrence in an
fd_set, we don't need the poll_lock anymore. Let's remove it.

include/common/hathreads.h
include/proto/fd.h
src/ev_poll.c
src/ev_select.c
src/fd.c

index fe1ee231ebaa0267ecdd74ca240a3dbd7079d22d..0ec1ad8dc6dffcb6f2eceb24bdf8ce7530c46840 100644 (file)
@@ -205,7 +205,6 @@ enum lock_label {
        THREAD_SYNC_LOCK = 0,
        FDCACHE_LOCK,
        FD_LOCK,
-       POLL_LOCK,
        TASK_RQ_LOCK,
        TASK_WQ_LOCK,
        POOL_LOCK,
index fcf026e2ea5c2be96e7a478d286647fc61c3d16a..0dd3e84a8d232a9c4e66b1afde0110415c040d00 100644 (file)
@@ -41,7 +41,6 @@ extern THREAD_LOCAL int *fd_updt;  // FD updates list
 extern THREAD_LOCAL int fd_nbupdt; // number of updates in the list
 
 __decl_hathreads(extern HA_RWLOCK_T   __attribute__((aligned(64))) fdcache_lock);    /* global lock to protect fd_cache array */
-__decl_hathreads(extern HA_SPINLOCK_T __attribute__((aligned(64))) poll_lock);       /* global lock to protect poll info */
 
 /* Deletes an FD from the fdsets.
  * The file descriptor is also closed.
@@ -412,12 +411,12 @@ static inline void fd_insert(int fd, unsigned long thread_mask)
 /* These are replacements for FD_SET, FD_CLR, FD_ISSET, working on uints */
 static inline void hap_fd_set(int fd, unsigned int *evts)
 {
-       evts[fd / (8*sizeof(*evts))] |= 1U << (fd & (8*sizeof(*evts) - 1));
+       HA_ATOMIC_OR(&evts[fd / (8*sizeof(*evts))], 1U << (fd & (8*sizeof(*evts) - 1)));
 }
 
 static inline void hap_fd_clr(int fd, unsigned int *evts)
 {
-       evts[fd / (8*sizeof(*evts))] &= ~(1U << (fd & (8*sizeof(*evts) - 1)));
+       HA_ATOMIC_AND(&evts[fd / (8*sizeof(*evts))], ~(1U << (fd & (8*sizeof(*evts) - 1))));
 }
 
 static inline unsigned int hap_fd_isset(int fd, unsigned int *evts)
index b8ef537943cc845b63573beb47440fd3f40eabbd..69c9a648cf38a19f50f5a447198c30f06517b1c6 100644 (file)
@@ -41,10 +41,8 @@ static THREAD_LOCAL struct pollfd *poll_events = NULL;
 
 REGPRM1 static void __fd_clo(int fd)
 {
-       HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
        hap_fd_clr(fd, fd_evts[DIR_RD]);
        hap_fd_clr(fd, fd_evts[DIR_WR]);
-       HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
 }
 
 /*
@@ -81,7 +79,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
 
                if ((eo ^ en) & FD_EV_POLLED_RW) {
                        /* poll status changed, update the lists */
-                       HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
                        if ((eo & ~en) & FD_EV_POLLED_R)
                                hap_fd_clr(fd, fd_evts[DIR_RD]);
                        else if ((en & ~eo) & FD_EV_POLLED_R) {
@@ -97,8 +94,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                                if (fd > max_add_fd)
                                        max_add_fd = fd;
                        }
-
-                       HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
                }
        }
 
index 9b6e2d0dfede740e039449b4016e9493700f7d0e..9c843ffd845053937847de652d39bd2672c7bb16 100644 (file)
@@ -32,10 +32,8 @@ static THREAD_LOCAL fd_set *tmp_evts[2];
 /* Immediately remove the entry upon close() */
 REGPRM1 static void __fd_clo(int fd)
 {
-       HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
        hap_fd_clr(fd, fd_evts[DIR_RD]);
        hap_fd_clr(fd, fd_evts[DIR_WR]);
-       HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
 }
 
 /*
@@ -73,7 +71,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
 
                if ((eo ^ en) & FD_EV_POLLED_RW) {
                        /* poll status changed, update the lists */
-                       HA_SPIN_LOCK(POLL_LOCK, &poll_lock);
                        if ((eo & ~en) & FD_EV_POLLED_R)
                                hap_fd_clr(fd, fd_evts[DIR_RD]);
                        else if ((en & ~eo) & FD_EV_POLLED_R) {
@@ -89,7 +86,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
                                if (fd > max_add_fd)
                                        max_add_fd = fd;
                        }
-                       HA_SPIN_UNLOCK(POLL_LOCK, &poll_lock);
                }
        }
 
index a47b61ad8a5ab3d57ab02656ebba70053b08bd83..0995040d6b29af9a812154ed10b30642b68ddc71 100644 (file)
--- a/src/fd.c
+++ b/src/fd.c
@@ -175,7 +175,6 @@ THREAD_LOCAL int *fd_updt  = NULL;  // FD updates list
 THREAD_LOCAL int  fd_nbupdt = 0;   // number of updates in the list
 
 __decl_hathreads(HA_RWLOCK_T   fdcache_lock);     /* global lock to protect fd_cache array */
-__decl_hathreads(HA_SPINLOCK_T poll_lock);        /* global lock to protect poll info */
 
 /* Deletes an FD from the fdsets.
  * The file descriptor is also closed.
@@ -331,7 +330,6 @@ int init_pollers()
                HA_SPIN_INIT(&fdtab[p].lock);
 
        HA_RWLOCK_INIT(&fdcache_lock);
-       HA_SPIN_INIT(&poll_lock);
        do {
                bp = NULL;
                for (p = 0; p < nbpollers; p++)
@@ -379,7 +377,6 @@ void deinit_pollers() {
        free(fdtab);    fdtab    = NULL;
 
        HA_RWLOCK_DESTROY(&fdcache_lock);
-       HA_SPIN_DESTROY(&poll_lock);
 }
 
 /*