[PATCH 2/3] powerpc/numa: Populate distance map correctly
From: Srikar Dronamraju <hidden>
Date: 2021-05-20 15:45:18
Also in:
lkml
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Michael Ellerman, Linus Torvalds
As per PAPR that defines the OS to hypervisor interface on POWER, there is no way to calculate the node_distance between 2 nodes, when either of the nodes are offline. However scheduler needs the distance map to be populated at boot time. On POWER, this information is provided within the distance_ref_points_depth array, which needs to be parsed to extract the potential node distances. To handle this scenario, lets overload arch_populate_distance_map(), to provide all the distances that are possible in the current platform. Cc: LKML <redacted> Cc: linuxppc-dev@lists.ozlabs.org Cc: Nathan Lynch <redacted> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Valentin Schneider <redacted> Cc: Scott Cheloha <redacted> Cc: Gautham R Shenoy <redacted> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> Cc: Mel Gorman <redacted> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: Rik van Riel <riel@surriel.com> Cc: Geetika Moolchandani <redacted> Reported-by: Geetika Moolchandani <redacted> Signed-off-by: Srikar Dronamraju <redacted> --- arch/powerpc/include/asm/topology.h | 3 +++ arch/powerpc/mm/numa.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+)
diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index e4db64c0e184..d7605d833b8d 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h@@ -22,6 +22,9 @@ struct drmem_lmb; cpu_all_mask : \ node_to_cpumask_map[node]) +#define arch_populate_distance_map arch_populate_distance_map +extern int arch_populate_distance_map(unsigned long *distance_map); + struct pci_bus; #ifdef CONFIG_PCI extern int pcibus_to_node(struct pci_bus *bus);
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index f2bf98bdcea2..9a225b29814a 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c@@ -221,6 +221,25 @@ static void initialize_distance_lookup_table(int nid, } } +int arch_populate_distance_map(unsigned long *distance_map) +{ + int i; + int distance = LOCAL_DISTANCE; + + bitmap_set(distance_map, distance, 1); + + if (!form1_affinity) { + bitmap_set(distance_map, REMOTE_DISTANCE, 1); + return 0; + } + + for (i = 0; i < distance_ref_points_depth; i++) { + distance *= 2; + bitmap_set(distance_map, distance, 1); + } + return 0; +} + /* * Returns nid in the range [0..nr_node_ids], or -1 if no useful NUMA * info is found.
--
2.27.0