Re: [PATCH v4 3/5] powerpc/numa: Use cpu node map of first sibling thread

2019-10-02 Thread Nathan Lynch
Srikar Dronamraju  writes:

> All the sibling threads of a core have to be part of the same node.
> To ensure that all the sibling threads map to the same node, always
> lookup/update the cpu-to-node map of the first thread in the core.

Reviewed-by: Nathan Lynch 


[PATCH v4 3/5] powerpc/numa: Use cpu node map of first sibling thread

2019-09-13 Thread Srikar Dronamraju
All the sibling threads of a core have to be part of the same node.
To ensure that all the sibling threads map to the same node, always
lookup/update the cpu-to-node map of the first thread in the core.

Signed-off-by: Srikar Dronamraju 
---
Changelog: v3->v4
As suggested by Nathan, add a warning while mapping offline cpu.

 arch/powerpc/mm/numa.c | 22 --
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 8fbe57c..63ec0c3 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -467,15 +467,20 @@ static int of_drconf_to_nid_single(struct drmem_lmb *lmb)
  */
 static int numa_setup_cpu(unsigned long lcpu)
 {
-   int nid = NUMA_NO_NODE;
struct device_node *cpu;
+   int fcpu = cpu_first_thread_sibling(lcpu);
+   int nid = NUMA_NO_NODE;
 
/*
 * If a valid cpu-to-node mapping is already available, use it
 * directly instead of querying the firmware, since it represents
 * the most recent mapping notified to us by the platform (eg: VPHN).
+* Since cpu_to_node binding remains the same for all threads in the
+* core. If a valid cpu-to-node mapping is already available, for
+* the first thread in the core, use it.
 */
-   if ((nid = numa_cpu_lookup_table[lcpu]) >= 0) {
+   nid = numa_cpu_lookup_table[fcpu];
+   if (nid >= 0) {
map_cpu_to_node(lcpu, nid);
return nid;
}
@@ -496,6 +501,19 @@ static int numa_setup_cpu(unsigned long lcpu)
if (nid < 0 || !node_possible(nid))
nid = first_online_node;
 
+   /*
+* Update for the first thread of the core. All threads of a core
+* have to be part of the same node. This not only avoids querying
+* for every other thread in the core, but always avoids a case
+* where virtual node associativity change causes subsequent threads
+* of a core to be associated with different nid. However if first
+* thread is already online, expect it to have a valid mapping.
+*/
+   if (fcpu != lcpu) {
+   WARN_ON(cpu_online(fcpu));
+   map_cpu_to_node(fcpu, nid);
+   }
+
map_cpu_to_node(lcpu, nid);
of_node_put(cpu);
 out:
-- 
1.8.3.1