workqueue: Move attrs->cpumask out of worker_pool's properties when attrs->affn_strict
authorLai Jiangshan <jiangshan.ljs@antgroup.com>
Fri, 8 Mar 2024 09:42:52 +0000 (17:42 +0800)
committerTejun Heo <tj@kernel.org>
Mon, 25 Mar 2024 19:12:09 +0000 (09:12 -1000)
Allow more pools can be shared when attrs->affn_strict.

Signed-off-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
include/linux/workqueue.h
kernel/workqueue.c

index 777b0186317ec13f7679bf2a2138fa6d459f93b0..bfcf8d38f4b1b9fc466a047cc499fffdb819ae0e 100644 (file)
@@ -185,6 +185,9 @@ struct workqueue_attrs {
         * Below fields aren't properties of a worker_pool. They only modify how
         * :c:func:`apply_workqueue_attrs` select pools and thus don't
         * participate in pool hash calculations or equality comparisons.
+        *
+        * If @affn_strict is set, @cpumask isn't a property of a worker_pool
+        * either.
         */
 
        /**
index 45d2aae73c96089a74e8c41ec4170a4a87e44341..f03960f094fadbdeacda3cd333cfe48acd6818b8 100644 (file)
@@ -4625,6 +4625,8 @@ static void wqattrs_clear_for_pool(struct workqueue_attrs *attrs)
 {
        attrs->affn_scope = WQ_AFFN_NR_TYPES;
        attrs->ordered = false;
+       if (attrs->affn_strict)
+               cpumask_copy(attrs->cpumask, cpu_possible_mask);
 }
 
 /* hash value of the content of @attr */
@@ -4633,11 +4635,12 @@ static u32 wqattrs_hash(const struct workqueue_attrs *attrs)
        u32 hash = 0;
 
        hash = jhash_1word(attrs->nice, hash);
-       hash = jhash(cpumask_bits(attrs->cpumask),
-                    BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long), hash);
+       hash = jhash_1word(attrs->affn_strict, hash);
        hash = jhash(cpumask_bits(attrs->__pod_cpumask),
                     BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long), hash);
-       hash = jhash_1word(attrs->affn_strict, hash);
+       if (!attrs->affn_strict)
+               hash = jhash(cpumask_bits(attrs->cpumask),
+                            BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long), hash);
        return hash;
 }
 
@@ -4647,11 +4650,11 @@ static bool wqattrs_equal(const struct workqueue_attrs *a,
 {
        if (a->nice != b->nice)
                return false;
-       if (!cpumask_equal(a->cpumask, b->cpumask))
+       if (a->affn_strict != b->affn_strict)
                return false;
        if (!cpumask_equal(a->__pod_cpumask, b->__pod_cpumask))
                return false;
-       if (a->affn_strict != b->affn_strict)
+       if (!a->affn_strict && !cpumask_equal(a->cpumask, b->cpumask))
                return false;
        return true;
 }