Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | From | Leonardo Bras <> | Subject | [RFC PATCH v1 1/1] wq: Avoid using isolated cpus' timers on unbounded queue_delayed_work | Date | Wed, 24 Jan 2024 05:29:37 -0300 |
| |
When __queue_delayed_work() is called with WORK_CPU_UNBOUND, it means any cpu is able to run the work, as well as any cpu timer is able to be used.
This is not good if a system does use CPU isolation, because it can take away some valuable cpu time to: 1 - deal with the timer interrupt, 2 - schedule-out the desired task, 3 - queue work on a random workqueue, and 4 - schedule the desired task back to the cpu.
So to fix this, during __queue_delayed_work(), if both: - Work is not cpu-bounded, - CPU isolation is in place, then pick a random non-isolated cpu to use both the timer and the system per-cpu workqueue.
Signed-off-by: Leonardo Bras <leobras@redhat.com> --- kernel/workqueue.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 76e60faed8923..0c50f41d9f95e 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1954,6 +1954,14 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, return; } + /* + * If the work is cpu-unbound, and cpu isolation is in place, only + * schedule use timers from housekeeping cpus. In favor of avoiding + * cacheline bouncing, run the WQ in the same cpu as the timer. + */ + if (cpu == WORK_CPU_UNBOUND && housekeeping_enabled(HK_TYPE_TIMER)) + cpu = housekeeping_any_cpu(HK_TYPE_TIMER); + dwork->wq = wq; dwork->cpu = cpu; timer->expires = jiffies + delay; -- 2.43.0
| ![\](/images/icornerr.gif) |