diff options
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 6 | ||||
| -rw-r--r-- | arch/x86/mm/numa_64.c | 21 |
2 files changed, 25 insertions, 2 deletions
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 40e1835b35e8..c900b73f9224 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -263,8 +263,12 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c) | |||
| 263 | /* Don't do the funky fallback heuristics the AMD version employs | 263 | /* Don't do the funky fallback heuristics the AMD version employs |
| 264 | for now. */ | 264 | for now. */ |
| 265 | node = apicid_to_node[apicid]; | 265 | node = apicid_to_node[apicid]; |
| 266 | if (node == NUMA_NO_NODE || !node_online(node)) | 266 | if (node == NUMA_NO_NODE) |
| 267 | node = first_node(node_online_map); | 267 | node = first_node(node_online_map); |
| 268 | else if (!node_online(node)) { | ||
| 269 | /* reuse the value from init_cpu_to_node() */ | ||
| 270 | node = cpu_to_node(cpu); | ||
| 271 | } | ||
| 268 | numa_set_node(cpu, node); | 272 | numa_set_node(cpu, node); |
| 269 | 273 | ||
| 270 | printk(KERN_INFO "CPU %d/0x%x -> Node %d\n", cpu, apicid, node); | 274 | printk(KERN_INFO "CPU %d/0x%x -> Node %d\n", cpu, apicid, node); |
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 3acd870d316a..83bbc70d11bb 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
| @@ -764,6 +764,25 @@ static __init int numa_setup(char *opt) | |||
| 764 | early_param("numa", numa_setup); | 764 | early_param("numa", numa_setup); |
| 765 | 765 | ||
| 766 | #ifdef CONFIG_NUMA | 766 | #ifdef CONFIG_NUMA |
| 767 | |||
| 768 | static __init int find_near_online_node(int node) | ||
| 769 | { | ||
| 770 | int n, val; | ||
| 771 | int min_val = INT_MAX; | ||
| 772 | int best_node = -1; | ||
| 773 | |||
| 774 | for_each_online_node(n) { | ||
| 775 | val = node_distance(node, n); | ||
| 776 | |||
| 777 | if (val < min_val) { | ||
| 778 | min_val = val; | ||
| 779 | best_node = n; | ||
| 780 | } | ||
| 781 | } | ||
| 782 | |||
| 783 | return best_node; | ||
| 784 | } | ||
| 785 | |||
| 767 | /* | 786 | /* |
| 768 | * Setup early cpu_to_node. | 787 | * Setup early cpu_to_node. |
| 769 | * | 788 | * |
| @@ -795,7 +814,7 @@ void __init init_cpu_to_node(void) | |||
| 795 | if (node == NUMA_NO_NODE) | 814 | if (node == NUMA_NO_NODE) |
| 796 | continue; | 815 | continue; |
| 797 | if (!node_online(node)) | 816 | if (!node_online(node)) |
| 798 | continue; | 817 | node = find_near_online_node(node); |
| 799 | numa_set_node(cpu, node); | 818 | numa_set_node(cpu, node); |
| 800 | } | 819 | } |
| 801 | } | 820 | } |
