summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYury Norov [NVIDIA] <yury.norov@gmail.com>2025-05-09 12:20:08 -0400
committerYury Norov <yury.norov@gmail.com>2025-05-13 11:40:04 -0400
commit895ee6a22e3195b7c1fee140c842bdeedb89ed33 (patch)
treeff3267bf545568210ea89b4880652979e50ad08f
parenta256ae22570ee4c3427fdc703a58a89afee6a332 (diff)
topology: make for_each_node_with_cpus() O(N)
for_each_node_with_cpus() calls nr_cpus_node() at every iteration, which makes it O(N^2). Kernel tracks such nodes with N_CPU record in node_states array. Switching to it makes for_each_node_with_cpus() O(N). Andrea: Now we can include also offline nodes with CPUs assigned (assuming it's possible). If checking the online state is required, the user must use node_online() within the loop. CC: Andrea Righi <arighi@nvidia.com> CC:Tejun Heo <tj@kernel.org> Signed-off-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
-rw-r--r--include/linux/nodemask.h1
-rw-r--r--include/linux/topology.h5
2 files changed, 2 insertions, 4 deletions
diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
index 0aa6b63aa747..f08ae71585fa 100644
--- a/include/linux/nodemask.h
+++ b/include/linux/nodemask.h
@@ -522,6 +522,7 @@ static __always_inline int node_random(const nodemask_t *maskp)
#define for_each_node(node) for_each_node_state(node, N_POSSIBLE)
#define for_each_online_node(node) for_each_node_state(node, N_ONLINE)
+#define for_each_node_with_cpus(node) for_each_node_state(node, N_CPU)
/*
* For nodemask scratch area.
diff --git a/include/linux/topology.h b/include/linux/topology.h
index 24e715f0f6d2..ffee6b4a071a 100644
--- a/include/linux/topology.h
+++ b/include/linux/topology.h
@@ -29,6 +29,7 @@
#include <linux/arch_topology.h>
#include <linux/cpumask.h>
+#include <linux/nodemask.h>
#include <linux/bitops.h>
#include <linux/mmzone.h>
#include <linux/smp.h>
@@ -39,10 +40,6 @@
#define nr_cpus_node(node) cpumask_weight(cpumask_of_node(node))
#endif
-#define for_each_node_with_cpus(node) \
- for_each_online_node(node) \
- if (nr_cpus_node(node))
-
int arch_update_cpu_topology(void);
/* Conform to ACPI 2.0 SLIT distance definitions */