diff options
author | Yury Norov <yury.norov@gmail.com> | 2023-01-20 20:24:36 -0800 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2023-02-07 18:20:00 -0800 |
commit | 2ac4980c57f54db7c5b416f7946d2921fc16d9d2 (patch) | |
tree | e446248b006239a53bc21ef49dc7c75262be8870 /lib/cpumask.c | |
parent | 2acda57736de1e486036b90a648e67a3599080a1 (diff) | |
download | linux-2ac4980c57f54db7c5b416f7946d2921fc16d9d2.tar.gz linux-2ac4980c57f54db7c5b416f7946d2921fc16d9d2.tar.bz2 linux-2ac4980c57f54db7c5b416f7946d2921fc16d9d2.zip |
lib/cpumask: update comment for cpumask_local_spread()
Now that we have an iterator-based alternative for a very common case
of using cpumask_local_spread for all cpus in a row, it's worth to
mention that in comment to cpumask_local_spread().
Signed-off-by: Yury Norov <yury.norov@gmail.com>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'lib/cpumask.c')
-rw-r--r-- | lib/cpumask.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/cpumask.c b/lib/cpumask.c index 10aa15715c0d..e7258836b60b 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -114,11 +114,29 @@ void __init free_bootmem_cpumask_var(cpumask_var_t mask) * @i: index number * @node: local numa_node * - * This function selects an online CPU according to a numa aware policy; - * local cpus are returned first, followed by non-local ones, then it - * wraps around. + * Returns online CPU according to a numa aware policy; local cpus are returned + * first, followed by non-local ones, then it wraps around. * - * It's not very efficient, but useful for setup. + * For those who wants to enumerate all CPUs based on their NUMA distances, + * i.e. call this function in a loop, like: + * + * for (i = 0; i < num_online_cpus(); i++) { + * cpu = cpumask_local_spread(i, node); + * do_something(cpu); + * } + * + * There's a better alternative based on for_each()-like iterators: + * + * for_each_numa_hop_mask(mask, node) { + * for_each_cpu_andnot(cpu, mask, prev) + * do_something(cpu); + * prev = mask; + * } + * + * It's simpler and more verbose than above. Complexity of iterator-based + * enumeration is O(sched_domains_numa_levels * nr_cpu_ids), while + * cpumask_local_spread() when called for each cpu is + * O(sched_domains_numa_levels * nr_cpu_ids * log(nr_cpu_ids)). */ unsigned int cpumask_local_spread(unsigned int i, int node) { |