BUG/MINOR: pollers: always program an update for migrated FDs
authorWilly Tarreau <w@1wt.eu>
Fri, 30 Jul 2021 12:18:49 +0000 (14:18 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 12 Aug 2021 15:00:52 +0000 (17:00 +0200)
If an MT-aware poller reports that a file descriptor was migrated, it
must stop reporting it. The simplest way to do this is to program an
update if not done yet. This will automatically mark the FD for update
on next round. Otherwise there's a risk that some events are reported
a bit too often and cause extra CPU usage with these pollers. Note
that epoll is currently OK regarding this. Select does not need this
because it uses a single shared events table, so in case of migration
no FD change is expected.

This should be backported as far as 2.2.

(cherry picked from commit 79e90b96158911535c22d1676f7ab8a0e3a9f7af)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit ea2036d40f103b6443d22224abbd6460e0e5401f)
Signed-off-by: Willy Tarreau <w@1wt.eu>

src/ev_evports.c
src/ev_kqueue.c
src/ev_poll.c

index 2dd0489..272ff1d 100644 (file)
@@ -226,6 +226,8 @@ static void _do_poll(struct poller *p, int exp, int wake)
 
                if (!(fdtab[fd].thread_mask & tid_bit)) {
                        activity[tid].poll_skip_fd++;
+                       if (!HA_ATOMIC_BTS(&fdtab[fd].update_mask, tid))
+                               fd_updt[fd_nbupdt++] = fd;
                        continue;
                }
 
index a67d05b..af9a498 100644 (file)
@@ -193,6 +193,8 @@ static void _do_poll(struct poller *p, int exp, int wake)
 
                if (!(fdtab[fd].thread_mask & tid_bit)) {
                        activity[tid].poll_skip_fd++;
+                       if (!HA_ATOMIC_BTS(&fdtab[fd].update_mask, tid))
+                               fd_updt[fd_nbupdt++] = fd;
                        continue;
                }
 
index 3062277..836e0af 100644 (file)
@@ -234,6 +234,8 @@ static void _do_poll(struct poller *p, int exp, int wake)
 
                if (!(fdtab[fd].thread_mask & tid_bit)) {
                        activity[tid].poll_skip_fd++;
+                       if (!HA_ATOMIC_BTS(&fdtab[fd].update_mask, tid))
+                               fd_updt[fd_nbupdt++] = fd;
                        continue;
                }