2022-03-29 07:38:09

by Zqiang

[permalink] [raw]
Subject: [PATCH] workqueue: Restrict kworker in the offline CPU pool running on housekeeping CPUs

When CPU going offline, all workers in this CPU pool will lose
affinity to this CPU, and may run to isolated CPU. like kworker
in unbound pool, set CPU affinity of these kworker is housekeeping
cpumask.

Signed-off-by: Zqiang <[email protected]>
---
kernel/workqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index abcc9a2ac319..c509ce73a783 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -5023,7 +5023,8 @@ static void unbind_workers(int cpu)

for_each_pool_worker(worker, pool) {
kthread_set_per_cpu(worker->task, -1);
- WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
+ WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
+ housekeeping_cpumask(HK_TYPE_WQ)) < 0);
}

mutex_unlock(&wq_pool_attach_mutex);
--
2.25.1


2022-03-31 05:20:13

by Lai Jiangshan

[permalink] [raw]
Subject: Re: [PATCH] workqueue: Restrict kworker in the offline CPU pool running on housekeeping CPUs

Acked-by: Lai Jiangshan <[email protected]>

I don't think the patch can be applied to the wq tree due to
the change
https://lore.kernel.org/lkml/164512420798.16921.1042432342597886877.tip-bot2@tip-bot2/
which did the rename of HK_TYPE_WQ has not been merged into Linus's tree.

On Tue, Mar 29, 2022 at 1:16 PM Zqiang <[email protected]> wrote:
>
> When CPU going offline, all workers in this CPU pool will lose
> affinity to this CPU, and may run to isolated CPU. like kworker
> in unbound pool, set CPU affinity of these kworker is housekeeping
> cpumask.
>
> Signed-off-by: Zqiang <[email protected]>
> ---
> kernel/workqueue.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index abcc9a2ac319..c509ce73a783 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -5023,7 +5023,8 @@ static void unbind_workers(int cpu)
>
> for_each_pool_worker(worker, pool) {
> kthread_set_per_cpu(worker->task, -1);
> - WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_possible_mask) < 0);
> + WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
> + housekeeping_cpumask(HK_TYPE_WQ)) < 0);
> }
>
> mutex_unlock(&wq_pool_attach_mutex);
> --
> 2.25.1
>