]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/xive: rework xive_find_target_in_mask()
authorYury Norov <ynorov@nvidia.com>
Thu, 19 Mar 2026 03:36:46 +0000 (23:36 -0400)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Wed, 1 Apr 2026 03:51:04 +0000 (09:21 +0530)
Switch the function to using modern cpumask API and drop most of the
housekeeping code.

Notice, if first >= nr_cpu_ids, for_each_cpu_wrap() iterator behaves just
like for_each_cpu(), i.e. begins from 0. So even if WARN_ON() is triggered,
no special handling is needed.

Signed-off-by: Yury Norov <ynorov@nvidia.com>
Tested-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Reviewed-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Reviewed-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20260319033647.881246-3-ynorov@nvidia.com
arch/powerpc/sysdev/xive/common.c

index 33e9fb3436e1a83b26221012ae72feb40cad829a..c120be73d149fb2660478021b208eceecd847f1e 100644 (file)
@@ -548,40 +548,21 @@ static void xive_dec_target_count(int cpu)
 static int xive_find_target_in_mask(const struct cpumask *mask,
                                    unsigned int fuzz)
 {
-       int cpu, first, num, i;
+       int cpu, first;
 
        /* Pick up a starting point CPU in the mask based on  fuzz */
-       num = cpumask_weight(mask);
-       first = fuzz % num;
-
-       /* Locate it */
-       cpu = cpumask_first(mask);
-       for (i = 0; i < first && cpu < nr_cpu_ids; i++)
-               cpu = cpumask_next(cpu, mask);
-
-       /* Sanity check */
-       if (WARN_ON(cpu >= nr_cpu_ids))
-               cpu = cpumask_first(cpu_online_mask);
-
-       /* Remember first one to handle wrap-around */
-       first = cpu;
+       fuzz %= cpumask_weight(mask);
+       first = cpumask_nth(fuzz, mask);
+       WARN_ON(first >= nr_cpu_ids);
 
        /*
         * Now go through the entire mask until we find a valid
         * target.
         */
-       do {
-               /*
-                * We re-check online as the fallback case passes us
-                * an untested affinity mask
-                */
+       for_each_cpu_wrap(cpu, mask, first) {
                if (cpu_online(cpu) && xive_try_pick_target(cpu))
                        return cpu;
-               cpu = cpumask_next(cpu, mask);
-               /* Wrap around */
-               if (cpu >= nr_cpu_ids)
-                       cpu = cpumask_first(mask);
-       } while (cpu != first);
+       }
 
        return -1;
 }