]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpumask: add cpumask_clear_cpus()
authorYury Norov [NVIDIA] <yury.norov@gmail.com>
Wed, 4 Jun 2025 19:39:37 +0000 (15:39 -0400)
committerLeon Romanovsky <leon@kernel.org>
Thu, 26 Jun 2025 09:19:15 +0000 (05:19 -0400)
When user wants to clear a range in cpumask, the only option the API
provides now is a for-loop, like:

for_each_cpu_from(cpu, mask) {
if (cpu >= ncpus)
break;
__cpumask_clear_cpu(cpu, mask);
}

In the bitmap API we have bitmap_clear() for that, which is
significantly faster than a for-loop. Propagate it to cpumasks.

Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
Link: https://patch.msgid.link/20250604193947.11834-2-yury.norov@gmail.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
include/linux/cpumask.h

index 7ae80a7ca81efd7a3d8ca1674e5d519548b5e030..ede95bbe8b80312f70f3e1b6bfdd428935b8d484 100644 (file)
@@ -609,6 +609,18 @@ void __cpumask_set_cpu(unsigned int cpu, struct cpumask *dstp)
        __set_bit(cpumask_check(cpu), cpumask_bits(dstp));
 }
 
+/**
+ * cpumask_clear_cpus - clear cpus in a cpumask
+ * @dstp:  the cpumask pointer
+ * @cpu:   cpu number (< nr_cpu_ids)
+ * @ncpus: number of cpus to clear (< nr_cpu_ids)
+ */
+static __always_inline void cpumask_clear_cpus(struct cpumask *dstp,
+                                               unsigned int cpu, unsigned int ncpus)
+{
+       cpumask_check(cpu + ncpus - 1);
+       bitmap_clear(cpumask_bits(dstp), cpumask_check(cpu), ncpus);
+}
 
 /**
  * cpumask_clear_cpu - clear a cpu in a cpumask