From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: open list <linux-kernel@vger.kernel.org>
Cc: Tejun Heo <tj@kernel.org>, Lai Jiangshan <jiangshanlai@gmail.com>,
Thomas Gleixner <tglx@linutronix.de>,
Frederic Weisbecker <frederic@kernel.org>
Subject: [PATCH] workqueue: Always use wq_select_unbound_cpu() for WORK_CPU_UNBOUND.
Date: Fri, 21 Feb 2025 12:20:03 +0100 [thread overview]
Message-ID: <20250221112003.1dSuoGyc@linutronix.de> (raw)
If the user did not specify a CPU while enqueuing a work item then
WORK_CPU_UNBOUND is passed. In this case, for WQ_UNBOUND a CPU is
selected based on wq_unbound_cpumask while the local CPU is preferred.
For !WQ_UNBOUND the local CPU is selected.
For NOHZ_FULL system with isolated CPU wq_unbound_cpumask is set to the
not isolated (housekeeping) CPUs. This leads to different behaviour if a
work item is scheduled on an isolated CPU where
schedule_delayed_work(, 1);
will move the timer to the housekeeping CPU and then schedule the work
there (on the housekeeping CPU) while
schedule_delayed_work(, 0);
will schedule the work item on the isolated CPU.
The documentation says WQ_UNBOUND prefers the local CPU. It can
preferer the local CPU if it is part of wq_unbound_cpumask.
Restrict WORK_CPU_UNBOUND to wq_unbound_cpumask via
wq_select_unbound_cpu().
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
kernel/workqueue.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index bfe030b443e27..134d9550538aa 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2261,12 +2261,8 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
rcu_read_lock();
retry:
/* pwq which will be used unless @work is executing elsewhere */
- if (req_cpu == WORK_CPU_UNBOUND) {
- if (wq->flags & WQ_UNBOUND)
- cpu = wq_select_unbound_cpu(raw_smp_processor_id());
- else
- cpu = raw_smp_processor_id();
- }
+ if (req_cpu == WORK_CPU_UNBOUND)
+ cpu = wq_select_unbound_cpu(raw_smp_processor_id());
pwq = rcu_dereference(*per_cpu_ptr(wq->cpu_pwq, cpu));
pool = pwq->pool;
--
2.47.2
next reply other threads:[~2025-02-21 11:20 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-21 11:20 Sebastian Andrzej Siewior [this message]
2025-02-21 14:49 ` [PATCH] workqueue: Always use wq_select_unbound_cpu() for WORK_CPU_UNBOUND Frederic Weisbecker
2025-02-21 16:48 ` Tejun Heo
2025-02-26 15:02 ` Frederic Weisbecker
2025-02-26 16:33 ` Tejun Heo
2025-02-26 16:18 ` Sebastian Andrzej Siewior
2025-02-26 16:44 ` Tejun Heo
2025-04-02 16:40 ` Frederic Weisbecker
2025-04-02 18:16 ` Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250221112003.1dSuoGyc@linutronix.de \
--to=bigeasy@linutronix.de \
--cc=frederic@kernel.org \
--cc=jiangshanlai@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.