| From 73cf624d029d776a33d0a80c695485b3f9b36231 Mon Sep 17 00:00:00 2001 |
| From: Yinghai Lu <yinghai@kernel.org> |
| Date: Sun, 10 Oct 2010 19:52:15 -0700 |
| Subject: x86, numa: For each node, register the memory blocks actually used |
| |
| From: Yinghai Lu <yinghai@kernel.org> |
| |
| commit 73cf624d029d776a33d0a80c695485b3f9b36231 upstream. |
| |
| Russ reported SGI UV is broken recently. He said: |
| |
| | The SRAT table shows that memory range is spread over two nodes. |
| | |
| | SRAT: Node 0 PXM 0 100000000-800000000 |
| | SRAT: Node 1 PXM 1 800000000-1000000000 |
| | SRAT: Node 0 PXM 0 1000000000-1080000000 |
| | |
| |Previously, the kernel early_node_map[] would show three entries |
| |with the proper node. |
| | |
| |[ 0.000000] 0: 0x00100000 -> 0x00800000 |
| |[ 0.000000] 1: 0x00800000 -> 0x01000000 |
| |[ 0.000000] 0: 0x01000000 -> 0x01080000 |
| | |
| |The problem is recent community kernel early_node_map[] shows |
| |only two entries with the node 0 entry overlapping the node 1 |
| |entry. |
| | |
| | 0: 0x00100000 -> 0x01080000 |
| | 1: 0x00800000 -> 0x01000000 |
| |
| After looking at the changelog, Found out that it has been broken for a while by |
| following commit |
| |
| |commit 8716273caef7f55f39fe4fc6c69c5f9f197f41f1 |
| |Author: David Rientjes <rientjes@google.com> |
| |Date: Fri Sep 25 15:20:04 2009 -0700 |
| | |
| | x86: Export srat physical topology |
| |
| Before that commit, register_active_regions() is called for every SRAT memory |
| entry right away. |
| |
| Use nodememblk_range[] instead of nodes[] in order to make sure we |
| capture the actual memory blocks registered with each node. nodes[] |
| contains an extended range which spans all memory regions associated |
| with a node, but that does not mean that all the memory in between are |
| included. |
| |
| Reported-by: Russ Anderson <rja@sgi.com> |
| Tested-by: Russ Anderson <rja@sgi.com> |
| Signed-off-by: Yinghai Lu <yinghai@kernel.org> |
| LKML-Reference: <4CB27BDF.5000800@kernel.org> |
| Acked-by: David Rientjes <rientjes@google.com> |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/mm/srat_64.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/arch/x86/mm/srat_64.c |
| +++ b/arch/x86/mm/srat_64.c |
| @@ -372,9 +372,11 @@ int __init acpi_scan_nodes(unsigned long |
| return -1; |
| } |
| |
| - for_each_node_mask(i, nodes_parsed) |
| - e820_register_active_regions(i, nodes[i].start >> PAGE_SHIFT, |
| - nodes[i].end >> PAGE_SHIFT); |
| + for (i = 0; i < num_node_memblks; i++) |
| + e820_register_active_regions(memblk_nodeid[i], |
| + node_memblk_range[i].start >> PAGE_SHIFT, |
| + node_memblk_range[i].end >> PAGE_SHIFT); |
| + |
| /* for out of order entries in SRAT */ |
| sort_node_map(); |
| if (!nodes_cover_memory(nodes)) { |