From: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
To: Michal Hocko <mhocko@suse.cz>, Mel Gorman <mgorman@suse.de>,
linux-mm@kvack.org, Christoph Lameter <cl@linux.com>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Ben Herrenschmidt <benh@kernel.crashing.org>,
Anton Blanchard <anton@samba.org>,
linuxppc-dev@lists.ozlabs.org
Subject: [PATCH 2/3] powerpc: enable CONFIG_HAVE_PERCPU_NUMA_NODE_ID
Date: Wed, 19 Feb 2014 15:18:00 -0800 [thread overview]
Message-ID: <20140219231800.GC413@linux.vnet.ibm.com> (raw)
In-Reply-To: <20140219231714.GB413@linux.vnet.ibm.com>
In order to enable CONFIG_HAVE_MEMORYLESS_NODES, it is necessary to have
somewhere to store the cpu <-> local-memory-node mapping. We could
create another powerpc-specific lookup table, but the generic functions
in include/linux/topology.h (protected by HAVE_PERCPU_NUMA_NODE_ID) are
sufficient. This also allows us to remove the existing powerpc-specific
cpu <-> node lookup table.
Signed-off-by: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
diff --git a/arch/powerpc/include/asm/mmzone.h b/arch/powerpc/include/asm/mmzone.h
index 7b58917..c8fbd1c 100644
--- a/arch/powerpc/include/asm/mmzone.h
+++ b/arch/powerpc/include/asm/mmzone.h
@@ -29,7 +29,6 @@ extern struct pglist_data *node_data[];
* Following are specific to this numa platform.
*/
-extern int numa_cpu_lookup_table[];
extern cpumask_var_t node_to_cpumask_map[];
#ifdef CONFIG_MEMORY_HOTPLUG
extern unsigned long max_pfn;
diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index d0b5fca..8bbe8cc 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h
@@ -20,19 +20,6 @@ struct device_node;
#include <asm/mmzone.h>
-static inline int cpu_to_node(int cpu)
-{
- int nid;
-
- nid = numa_cpu_lookup_table[cpu];
-
- /*
- * During early boot, the numa-cpu lookup table might not have been
- * setup for all CPUs yet. In such cases, default to node 0.
- */
- return (nid < 0) ? 0 : nid;
-}
-
#define parent_node(node) (node)
#define cpumask_of_node(node) ((node) == -1 ? \
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index ac2621a..f45e68d 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -739,6 +739,9 @@ void start_secondary(void *unused)
}
traverse_core_siblings(cpu, true);
+ set_cpu_numa_node(cpu, cpu_to_node(cpu));
+ set_cpu_numa_mem(cpu, local_memory_node(cpu_to_node(cpu)));
+
smp_wmb();
notify_cpu_starting(cpu);
set_cpu_online(cpu, true);
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 30a42e2..57e2809 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -46,11 +46,9 @@ static char *cmdline __initdata;
static int numa_debug;
#define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
-int numa_cpu_lookup_table[NR_CPUS];
cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
struct pglist_data *node_data[MAX_NUMNODES];
-EXPORT_SYMBOL(numa_cpu_lookup_table);
EXPORT_SYMBOL(node_to_cpumask_map);
EXPORT_SYMBOL(node_data);
@@ -154,22 +152,25 @@ static void __init get_node_active_region(unsigned long pfn,
}
}
-static void reset_numa_cpu_lookup_table(void)
+static void reset_numa_cpu_node(void)
{
unsigned int cpu;
- for_each_possible_cpu(cpu)
- numa_cpu_lookup_table[cpu] = -1;
+ for_each_possible_cpu(cpu) {
+ set_cpu_numa_node(cpu, -1);
+ set_cpu_numa_mem(cpu, -1);
+ }
}
-static void update_numa_cpu_lookup_table(unsigned int cpu, int node)
+static void update_numa_cpu_node(unsigned int cpu, int node)
{
- numa_cpu_lookup_table[cpu] = node;
+ set_cpu_numa_node(cpu, node);
+ set_cpu_numa_mem(cpu, local_memory_node(node));
}
static void map_cpu_to_node(int cpu, int node)
{
- update_numa_cpu_lookup_table(cpu, node);
+ update_numa_cpu_node(cpu, node);
dbg("adding cpu %d to node %d\n", cpu, node);
@@ -180,7 +181,7 @@ static void map_cpu_to_node(int cpu, int node)
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PPC_SPLPAR)
static void unmap_cpu_from_node(unsigned long cpu)
{
- int node = numa_cpu_lookup_table[cpu];
+ int node = cpu_to_node(cpu);
dbg("removing cpu %lu from node %d\n", cpu, node);
@@ -545,7 +546,7 @@ static int numa_setup_cpu(unsigned long lcpu)
* directly instead of querying the firmware, since it represents
* the most recent mapping notified to us by the platform (eg: VPHN).
*/
- if ((nid = numa_cpu_lookup_table[lcpu]) >= 0) {
+ if ((nid = cpu_to_node(lcpu)) >= 0) {
map_cpu_to_node(lcpu, nid);
return nid;
}
@@ -1119,7 +1120,7 @@ void __init do_init_bootmem(void)
*/
setup_node_to_cpumask_map();
- reset_numa_cpu_lookup_table();
+ reset_numa_cpu_node();
register_cpu_notifier(&ppc64_numa_nb);
cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
(void *)(unsigned long)boot_cpuid);
@@ -1518,7 +1519,7 @@ static int update_lookup_table(void *data)
base = cpu_first_thread_sibling(update->cpu);
for (j = 0; j < threads_per_core; j++) {
- update_numa_cpu_lookup_table(base + j, nid);
+ update_numa_cpu_node(base + j, nid);
}
}
@@ -1571,7 +1572,7 @@ int arch_update_cpu_topology(void)
if (new_nid < 0 || !node_online(new_nid))
new_nid = first_online_node;
- if (new_nid == numa_cpu_lookup_table[cpu]) {
+ if (new_nid == cpu_to_node(cpu)) {
cpumask_andnot(&cpu_associativity_changes_mask,
&cpu_associativity_changes_mask,
cpu_sibling_mask(cpu));
@@ -1583,7 +1584,7 @@ int arch_update_cpu_topology(void)
ud = &updates[i++];
ud->cpu = sibling;
ud->new_nid = new_nid;
- ud->old_nid = numa_cpu_lookup_table[sibling];
+ ud->old_nid = cpu_to_node(sibling);
cpumask_set_cpu(sibling, &updated_cpus);
if (i < weight)
ud->next = &updates[i];
next prev parent reply other threads:[~2014-02-19 23:18 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-19 23:16 [PATCH 0/3] powerpc: support memoryless nodes Nishanth Aravamudan
2014-02-19 23:17 ` [PATCH 1/3] mm: return NUMA_NO_NODE in local_memory_node if zonelists are not setup Nishanth Aravamudan
2014-02-19 23:18 ` Nishanth Aravamudan [this message]
2014-02-19 23:22 ` [PATCH 2/3 v2] powerpc: enable CONFIG_HAVE_PERCPU_NUMA_NODE_ID Nishanth Aravamudan
2014-02-19 23:23 ` [PATCH 3/3] powerpc: enable CONFIG_HAVE_MEMORYLESS_NODES Nishanth Aravamudan
2014-02-19 23:32 ` [PATCH 1/3] mm: return NUMA_NO_NODE in local_memory_node if zonelists are not setup Nishanth Aravamudan
2014-02-20 16:05 ` Christoph Lameter
2014-02-20 18:28 ` Nishanth Aravamudan
2014-02-21 22:42 ` Andrew Morton
2014-02-21 23:56 ` Nishanth Aravamudan
2014-02-24 19:43 ` Christoph Lameter
2014-02-25 2:34 ` Nishanth Aravamudan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140219231800.GC413@linux.vnet.ibm.com \
--to=nacc@linux.vnet.ibm.com \
--cc=anton@samba.org \
--cc=benh@kernel.crashing.org \
--cc=cl@linux.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mgorman@suse.de \
--cc=mhocko@suse.cz \
--cc=rientjes@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).