| From b9d3c0f269a4a3578b0f5960b7d7fc0a9753d458 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 17 Oct 2021 20:04:02 +0800 |
| Subject: workqueue: make sysfs of unbound kworker cpumask more clever |
| |
| From: Menglong Dong <imagedong@tencent.com> |
| |
| [ Upstream commit d25302e46592c97d29f70ccb1be558df31a9a360 ] |
| |
| Some unfriendly component, such as dpdk, write the same mask to |
| unbound kworker cpumask again and again. Every time it write to |
| this interface some work is queue to cpu, even though the mask |
| is same with the original mask. |
| |
| So, fix it by return success and do nothing if the cpumask is |
| equal with the old one. |
| |
| Signed-off-by: Mengen Sun <mengensun@tencent.com> |
| Signed-off-by: Menglong Dong <imagedong@tencent.com> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/workqueue.c | 15 +++++++++++---- |
| 1 file changed, 11 insertions(+), 4 deletions(-) |
| |
| diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
| index 885d4792abdfc..77e6964ae1a99 100644 |
| --- a/kernel/workqueue.c |
| +++ b/kernel/workqueue.c |
| @@ -5302,9 +5302,6 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask) |
| int ret = -EINVAL; |
| cpumask_var_t saved_cpumask; |
| |
| - if (!zalloc_cpumask_var(&saved_cpumask, GFP_KERNEL)) |
| - return -ENOMEM; |
| - |
| /* |
| * Not excluding isolated cpus on purpose. |
| * If the user wishes to include them, we allow that. |
| @@ -5312,6 +5309,15 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask) |
| cpumask_and(cpumask, cpumask, cpu_possible_mask); |
| if (!cpumask_empty(cpumask)) { |
| apply_wqattrs_lock(); |
| + if (cpumask_equal(cpumask, wq_unbound_cpumask)) { |
| + ret = 0; |
| + goto out_unlock; |
| + } |
| + |
| + if (!zalloc_cpumask_var(&saved_cpumask, GFP_KERNEL)) { |
| + ret = -ENOMEM; |
| + goto out_unlock; |
| + } |
| |
| /* save the old wq_unbound_cpumask. */ |
| cpumask_copy(saved_cpumask, wq_unbound_cpumask); |
| @@ -5324,10 +5330,11 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask) |
| if (ret < 0) |
| cpumask_copy(wq_unbound_cpumask, saved_cpumask); |
| |
| + free_cpumask_var(saved_cpumask); |
| +out_unlock: |
| apply_wqattrs_unlock(); |
| } |
| |
| - free_cpumask_var(saved_cpumask); |
| return ret; |
| } |
| |
| -- |
| 2.33.0 |
| |