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 <linux-ker...@vger.kernel.org> Cc: linuxppc-dev@lists.ozlabs.org Cc: Nathan Lynch <nath...@linux.ibm.com> Cc: Michael Ellerman <m...@ellerman.id.au> Cc: Ingo Molnar <mi...@kernel.org> Cc: Peter Zijlstra <pet...@infradead.org> Cc: Valentin Schneider <valentin.schnei...@arm.com> Cc: Scott Cheloha <chel...@linux.ibm.com> Cc: Gautham R Shenoy <e...@linux.vnet.ibm.com> Cc: Dietmar Eggemann <dietmar.eggem...@arm.com> Cc: Mel Gorman <mgor...@techsingularity.net> Cc: Vincent Guittot <vincent.guit...@linaro.org> Cc: Rik van Riel <r...@surriel.com> Cc: Geetika Moolchandani <geetika.moolchanda...@ibm.com> Reported-by: Geetika Moolchandani <geetika.moolchanda...@ibm.com> Signed-off-by: Srikar Dronamraju <sri...@linux.vnet.ibm.com> --- 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