Messages in this thread Patch in this message | | | From | Yury Norov <> | Subject | [PATCH v2 4/6] lib/group_cpus: optimize outer loop in grp_spread_init_one() | Date | Thu, 7 Dec 2023 12:38:58 -0800 |
| |
Similarly to the inner loop, in the outer loop we can use for_each_cpu() macro, and skip CPUs that have been copied.
With this patch, the function becomes O(1), despite that it's a double-loop.
Signed-off-by: Yury Norov <yury.norov@gmail.com> --- lib/group_cpus.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/lib/group_cpus.c b/lib/group_cpus.c index 7ac94664230f..cded3c8ea63b 100644 --- a/lib/group_cpus.c +++ b/lib/group_cpus.c @@ -17,16 +17,11 @@ static void grp_spread_init_one(struct cpumask *irqmsk, struct cpumask *nmsk, const struct cpumask *siblmsk; int cpu, sibl; - for ( ; cpus_per_grp > 0; ) { - cpu = cpumask_first(nmsk); - - /* Should not happen, but I'm too lazy to think about it */ - if (cpu >= nr_cpu_ids) - return; - + for_each_cpu(cpu, nmsk) { __cpumask_clear_cpu(cpu, nmsk); __cpumask_set_cpu(cpu, irqmsk); - cpus_per_grp--; + if (cpus_per_grp-- == 0) + return; /* If the cpu has siblings, use them first */ siblmsk = topology_sibling_cpumask(cpu); @@ -37,6 +32,7 @@ static void grp_spread_init_one(struct cpumask *irqmsk, struct cpumask *nmsk, __cpumask_set_cpu(sibl, irqmsk); if (cpus_per_grp-- == 0) return; + cpu = sibl + 1; } } } -- 2.40.1
| |