From 7163056dc55e39e57768c0857040125e7b9db4f1 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 14 Nov 2017 11:30:47 +0100 Subject: [PATCH] MAJOR: polling: Use active_appels_mask instead of applets_active_queue applets_active_queue is the active queue size. It is a global variable. So it is underoptimized because we may be lead to consider there are active applets for a thread while in fact all active applets are assigned to the otherthreads. So, in such cases, the polling loop will be evaluated many more times than necessary. Instead, we now check if the thread id is set in the bitfield active_applets_mask. This is specific to threads, no backport is needed. --- src/applet.c | 7 ++++--- src/haproxy.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/applet.c b/src/applet.c index e24f66d05..84ffde6b8 100644 --- a/src/applet.c +++ b/src/applet.c @@ -33,10 +33,11 @@ void applet_run_active() struct stream_interface *si; struct list applet_cur_queue = LIST_HEAD_INIT(applet_cur_queue); - if (!applets_active_queue) - return; - HA_SPIN_LOCK(APPLETS_LOCK, &applet_active_lock); + if (!(active_applets_mask & tid_bit)) { + HA_SPIN_UNLOCK(APPLETS_LOCK, &applet_active_lock); + return; + } curr = LIST_NEXT(&applet_active_queue, typeof(curr), runq); while (&curr->runq != &applet_active_queue) { diff --git a/src/haproxy.c b/src/haproxy.c index 8f33e2695..ba5a4b208 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2307,7 +2307,7 @@ static void run_poll_loop() break; /* expire immediately if events are pending */ - if (fd_cache_num || (active_tasks_mask & tid_bit) || signal_queue_len || applets_active_queue) + if (fd_cache_num || (active_tasks_mask & tid_bit) || signal_queue_len || (active_applets_mask & tid_bit)) next = now_ms; /* The poller will ensure it returns around */ -- 2.47.3