diff options
author | Tejun Heo <tj@kernel.org> | 2011-01-23 08:37:39 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-01-28 08:54:09 -0500 |
commit | bbc9e2f452d9c4b166d1f9a78d941d80173312fe (patch) | |
tree | d75d41187b296235f833e942ed8c1dd938a7bae4 /arch/x86/mm/numa_64.c | |
parent | 89e5dc218e084e13a3996db6693b01478912f4ee (diff) |
x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
The mapping between cpu/apicid and node is done via
apicid_to_node[] on 64bit and apicid_2_node[] +
apic->x86_32_numa_cpu_node() on 32bit. This difference makes it
difficult to further unify 32 and 64bit NUMA handling.
This patch unifies it by replacing both apicid_to_node[] and
apicid_2_node[] with __apicid_to_node[] array, which is accessed
by two accessors - set_apicid_to_node() and numa_cpu_node(). On
64bit, numa_cpu_node() always consults __apicid_to_node[]
directly while 32bit goes through apic->numa_cpu_node() method
to allow apic implementations to override it.
srat_detect_node() for amd cpus contains workaround for broken
NUMA configuration which assumes relationship between APIC ID,
HT node ID and NUMA topology. Leave it to access
__apicid_to_node[] directly as mapping through CPU might result
in undesirable behavior change. The comment is reformatted and
updated to note the ugliness.
Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Pekka Enberg <penberg@kernel.org>
Cc: eric.dumazet@gmail.com
Cc: yinghai@kernel.org
Cc: brgerst@gmail.com
Cc: gorcunov@gmail.com
Cc: shaohui.zheng@intel.com
Cc: rientjes@google.com
LKML-Reference: <1295789862-25482-14-git-send-email-tj@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: David Rientjes <rientjes@google.com>
Diffstat (limited to 'arch/x86/mm/numa_64.c')
-rw-r--r-- | arch/x86/mm/numa_64.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 95ea1551eebc..1e1026f61a5a 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -26,10 +26,6 @@ EXPORT_SYMBOL(node_data); | |||
26 | 26 | ||
27 | struct memnode memnode; | 27 | struct memnode memnode; |
28 | 28 | ||
29 | s16 apicid_to_node[MAX_LOCAL_APIC] __cpuinitdata = { | ||
30 | [0 ... MAX_LOCAL_APIC-1] = NUMA_NO_NODE | ||
31 | }; | ||
32 | |||
33 | static unsigned long __initdata nodemap_addr; | 29 | static unsigned long __initdata nodemap_addr; |
34 | static unsigned long __initdata nodemap_size; | 30 | static unsigned long __initdata nodemap_size; |
35 | 31 | ||
@@ -716,12 +712,8 @@ void __init init_cpu_to_node(void) | |||
716 | BUG_ON(cpu_to_apicid == NULL); | 712 | BUG_ON(cpu_to_apicid == NULL); |
717 | 713 | ||
718 | for_each_possible_cpu(cpu) { | 714 | for_each_possible_cpu(cpu) { |
719 | int node; | 715 | int node = numa_cpu_node(cpu); |
720 | u16 apicid = cpu_to_apicid[cpu]; | ||
721 | 716 | ||
722 | if (apicid == BAD_APICID) | ||
723 | continue; | ||
724 | node = apicid_to_node[apicid]; | ||
725 | if (node == NUMA_NO_NODE) | 717 | if (node == NUMA_NO_NODE) |
726 | continue; | 718 | continue; |
727 | if (!node_online(node)) | 719 | if (!node_online(node)) |
@@ -731,6 +723,14 @@ void __init init_cpu_to_node(void) | |||
731 | } | 723 | } |
732 | #endif | 724 | #endif |
733 | 725 | ||
726 | int __cpuinit numa_cpu_node(int cpu) | ||
727 | { | ||
728 | int apicid = early_per_cpu(x86_cpu_to_apicid, cpu); | ||
729 | |||
730 | if (apicid != BAD_APICID) | ||
731 | return __apicid_to_node[apicid]; | ||
732 | return NUMA_NO_NODE; | ||
733 | } | ||
734 | 734 | ||
735 | void __cpuinit numa_set_node(int cpu, int node) | 735 | void __cpuinit numa_set_node(int cpu, int node) |
736 | { | 736 | { |
@@ -776,13 +776,9 @@ void __cpuinit numa_remove_cpu(int cpu) | |||
776 | void __cpuinit numa_add_cpu(int cpu) | 776 | void __cpuinit numa_add_cpu(int cpu) |
777 | { | 777 | { |
778 | unsigned long addr; | 778 | unsigned long addr; |
779 | u16 apicid; | 779 | int physnid, nid; |
780 | int physnid; | ||
781 | int nid = NUMA_NO_NODE; | ||
782 | 780 | ||
783 | apicid = early_per_cpu(x86_cpu_to_apicid, cpu); | 781 | nid = numa_cpu_node(cpu); |
784 | if (apicid != BAD_APICID) | ||
785 | nid = apicid_to_node[apicid]; | ||
786 | if (nid == NUMA_NO_NODE) | 782 | if (nid == NUMA_NO_NODE) |
787 | nid = early_cpu_to_node(cpu); | 783 | nid = early_cpu_to_node(cpu); |
788 | BUG_ON(nid == NUMA_NO_NODE || !node_online(nid)); | 784 | BUG_ON(nid == NUMA_NO_NODE || !node_online(nid)); |