]> www.infradead.org Git - users/hch/xfs.git/commitdiff
workqueue: Update cpumasks after only applying it successfully
authorLai Jiangshan <jiangshan.ljs@antgroup.com>
Tue, 2 Jul 2024 04:14:55 +0000 (12:14 +0800)
committerTejun Heo <tj@kernel.org>
Tue, 2 Jul 2024 17:14:33 +0000 (07:14 -1000)
Make workqueue_unbound_exclude_cpumask() and workqueue_set_unbound_cpumask()
only update wq_isolated_cpumask and wq_requested_unbound_cpumask when
workqueue_apply_unbound_cpumask() returns successfully.

Fixes: fe28f631fa94("workqueue: Add workqueue_unbound_exclude_cpumask() to exclude CPUs from wq_unbound_cpumask")
Cc: Waiman Long <longman@redhat.com>
Signed-off-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c

index e271d02f3d8cb9ef5df5ed8c5ccdb9fd4b3cfb7d..6adee950077a8719cf05c83cda850c17f282b703 100644 (file)
@@ -6848,9 +6848,6 @@ int workqueue_unbound_exclude_cpumask(cpumask_var_t exclude_cpumask)
        lockdep_assert_cpus_held();
        mutex_lock(&wq_pool_mutex);
 
-       /* Save the current isolated cpumask & export it via sysfs */
-       cpumask_copy(wq_isolated_cpumask, exclude_cpumask);
-
        /*
         * If the operation fails, it will fall back to
         * wq_requested_unbound_cpumask which is initially set to
@@ -6862,6 +6859,10 @@ int workqueue_unbound_exclude_cpumask(cpumask_var_t exclude_cpumask)
        if (!cpumask_equal(cpumask, wq_unbound_cpumask))
                ret = workqueue_apply_unbound_cpumask(cpumask);
 
+       /* Save the current isolated cpumask & export it via sysfs */
+       if (!ret)
+               cpumask_copy(wq_isolated_cpumask, exclude_cpumask);
+
        mutex_unlock(&wq_pool_mutex);
        free_cpumask_var(cpumask);
        return ret;
@@ -7197,7 +7198,6 @@ static int workqueue_set_unbound_cpumask(cpumask_var_t cpumask)
        cpumask_and(cpumask, cpumask, cpu_possible_mask);
        if (!cpumask_empty(cpumask)) {
                apply_wqattrs_lock();
-               cpumask_copy(wq_requested_unbound_cpumask, cpumask);
                if (cpumask_equal(cpumask, wq_unbound_cpumask)) {
                        ret = 0;
                        goto out_unlock;
@@ -7206,6 +7206,8 @@ static int workqueue_set_unbound_cpumask(cpumask_var_t cpumask)
                ret = workqueue_apply_unbound_cpumask(cpumask);
 
 out_unlock:
+               if (!ret)
+                       cpumask_copy(wq_requested_unbound_cpumask, cpumask);
                apply_wqattrs_unlock();
        }