OSDN Git Service

sched/topology: Introduce for_each_numa_hop_mask()
authorValentin Schneider <vschneid@redhat.com>
Sat, 21 Jan 2023 04:24:34 +0000 (20:24 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 Feb 2023 02:20:00 +0000 (18:20 -0800)
The recently introduced sched_numa_hop_mask() exposes cpumasks of CPUs
reachable within a given distance budget, wrap the logic for iterating over
all (distance, mask) values inside an iterator macro.

Signed-off-by: Valentin Schneider <vschneid@redhat.com>
Reviewed-by: Yury Norov <yury.norov@gmail.com>
Signed-off-by: Yury Norov <yury.norov@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/topology.h

index 344c236..fea3237 100644 (file)
@@ -261,4 +261,22 @@ sched_numa_hop_mask(unsigned int node, unsigned int hops)
 }
 #endif /* CONFIG_NUMA */
 
+/**
+ * for_each_numa_hop_mask - iterate over cpumasks of increasing NUMA distance
+ *                          from a given node.
+ * @mask: the iteration variable.
+ * @node: the NUMA node to start the search from.
+ *
+ * Requires rcu_lock to be held.
+ *
+ * Yields cpu_online_mask for @node == NUMA_NO_NODE.
+ */
+#define for_each_numa_hop_mask(mask, node)                                    \
+       for (unsigned int __hops = 0;                                          \
+            mask = (node != NUMA_NO_NODE || __hops) ?                         \
+                    sched_numa_hop_mask(node, __hops) :                       \
+                    cpu_online_mask,                                          \
+            !IS_ERR_OR_NULL(mask);                                            \
+            __hops++)
+
 #endif /* _LINUX_TOPOLOGY_H */