From: Breno Leitao <leitao@debian.org>
To: Tejun Heo <tj@kernel.org>
Cc: linux-kernel@vger.kernel.org,
Lai Jiangshan <jiangshanlai@gmail.com>,
Yao Kai <yaokai34@huawei.com>,
liuyongqiang <liuyongqiang13@huawei.com>
Subject: Re: [PATCHSET wq/for-7.4] workqueue: Make flush_workqueue() cost scale with active pwqs
Date: Wed, 9 Sep 2026 03:32:02 -0700 [thread overview]
Message-ID: <aqEznXGW0eKJ0k0T@gmail.com> (raw)
In-Reply-To: <20260901210929.3092513-1-tj@kernel.org>
On Tue, Sep 01, 2026 at 11:09:26AM -1000, Tejun Heo wrote:
> Hello,
>
> Since 636b927eba5b ("workqueue: Make unbound workqueues to use per-cpu
> pool_workqueues"), flush_workqueue() walks one pwq per possible CPU, cycling
> each pool lock, even when the workqueue is idle. Yao Kai reported the XFS
> CIL workqueue, flushed on every log force, spending up to 64us per flush in
> that walk on a 128-CPU machine.
The problem seems clear to me. Flushing a PER_CPU workqueue, mean we
__flush_workqueue() -> flush_workqueue_prep_pwqs(), and then it cycle
through every pwq (one per possible CPU). This is all done with
wq->mutex.
Then, with the lock, we update the new color for the pool.
So, the locking context here is:
mutex_lock(wq->mutex)
for_each_pwq(pwq, wq) {
raw_spin_lock_irq(¤t_pool->lock);
pwq->work_color = work_color;
raw_spin_unlock_irq(¤t_pool->lock);
}
This all makes sense. I understand that, we need(ed) to do it, in order
to keep the work_color up-to-date. Let me read the patch now and see how
you've addressed that.
Thanks for copying me,
--breno
prev parent reply other threads:[~2026-09-09 10:32 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-01 21:09 [PATCHSET wq/for-7.4] workqueue: Make flush_workqueue() cost scale with active pwqs Tejun Heo
2026-09-01 21:09 ` [PATCH 1/3] workqueue: Add for_each_node_with_fallback() Tejun Heo
2026-09-09 11:01 ` Breno Leitao
2026-09-01 21:09 ` [PATCH 2/3] workqueue: Maintain pwq->total_in_flight Tejun Heo
2026-09-09 11:40 ` Breno Leitao
2026-09-01 21:09 ` [PATCH 3/3] workqueue: Make flush_workqueue() visit only pwqs active since the last flush Tejun Heo
2026-09-10 10:53 ` Breno Leitao
2026-09-08 17:33 ` [PATCHSET wq/for-7.4] workqueue: Make flush_workqueue() cost scale with active pwqs Tejun Heo
2026-09-09 10:32 ` Breno Leitao [this message]
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=aqEznXGW0eKJ0k0T@gmail.com \
--to=leitao@debian.org \
--cc=jiangshanlai@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=liuyongqiang13@huawei.com \
--cc=tj@kernel.org \
--cc=yaokai34@huawei.com \
/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.