Commit 413e4055 authored by Srikar Dronamraju's avatar Srikar Dronamraju Committed by Michael Ellerman

powerpc/numa: Use cpu node map of first sibling thread

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: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
Reported-by: default avatarAbdul Haleem <abdhalee@linux.vnet.ibm.com>
Reviewed-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200129135301.24739-4-srikar@linux.vnet.ibm.com
parent 76b7bfb1
......@@ -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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment