lib/bitmap: drop optimization of bitmap_{from,to}_arr64
[platform/kernel/linux-starfive.git] / lib / cpumask.c
index f0ae119..c7c3925 100644 (file)
@@ -128,23 +128,21 @@ unsigned int cpumask_local_spread(unsigned int i, int node)
        i %= num_online_cpus();
 
        if (node == NUMA_NO_NODE) {
-               for_each_cpu(cpu, cpu_online_mask)
-                       if (i-- == 0)
-                               return cpu;
+               cpu = cpumask_nth(i, cpu_online_mask);
+               if (cpu < nr_cpu_ids)
+                       return cpu;
        } else {
                /* NUMA first. */
-               for_each_cpu_and(cpu, cpumask_of_node(node), cpu_online_mask)
-                       if (i-- == 0)
-                               return cpu;
-
-               for_each_cpu(cpu, cpu_online_mask) {
-                       /* Skip NUMA nodes, done above. */
-                       if (cpumask_test_cpu(cpu, cpumask_of_node(node)))
-                               continue;
-
-                       if (i-- == 0)
-                               return cpu;
-               }
+               cpu = cpumask_nth_and(i, cpu_online_mask, cpumask_of_node(node));
+               if (cpu < nr_cpu_ids)
+                       return cpu;
+
+               i -= cpumask_weight_and(cpu_online_mask, cpumask_of_node(node));
+
+               /* Skip NUMA nodes, done above. */
+               cpu = cpumask_nth_andnot(i, cpu_online_mask, cpumask_of_node(node));
+               if (cpu < nr_cpu_ids)
+                       return cpu;
        }
        BUG();
 }
@@ -168,10 +166,8 @@ unsigned int cpumask_any_and_distribute(const struct cpumask *src1p,
        /* NOTE: our first selection will skip 0. */
        prev = __this_cpu_read(distribute_cpu_mask_prev);
 
-       next = cpumask_next_and(prev, src1p, src2p);
-       if (next >= nr_cpu_ids)
-               next = cpumask_first_and(src1p, src2p);
-
+       next = find_next_and_bit_wrap(cpumask_bits(src1p), cpumask_bits(src2p),
+                                       nr_cpumask_bits, prev + 1);
        if (next < nr_cpu_ids)
                __this_cpu_write(distribute_cpu_mask_prev, next);
 
@@ -185,11 +181,7 @@ unsigned int cpumask_any_distribute(const struct cpumask *srcp)
 
        /* NOTE: our first selection will skip 0. */
        prev = __this_cpu_read(distribute_cpu_mask_prev);
-
-       next = cpumask_next(prev, srcp);
-       if (next >= nr_cpu_ids)
-               next = cpumask_first(srcp);
-
+       next = find_next_bit_wrap(cpumask_bits(srcp), nr_cpumask_bits, prev + 1);
        if (next < nr_cpu_ids)
                __this_cpu_write(distribute_cpu_mask_prev, next);