diff options
Diffstat (limited to 'arch/x86/mm')
-rw-r--r-- | arch/x86/mm/discontig_32.c | 6 | ||||
-rw-r--r-- | arch/x86/mm/init_32.c | 1 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 3 | ||||
-rw-r--r-- | arch/x86/mm/ioremap.c | 5 | ||||
-rw-r--r-- | arch/x86/mm/k8topology_64.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/numa_64.c | 16 | ||||
-rw-r--r-- | arch/x86/mm/pgtable_32.c | 4 | ||||
-rw-r--r-- | arch/x86/mm/srat_64.c | 32 |
8 files changed, 39 insertions, 30 deletions
diff --git a/arch/x86/mm/discontig_32.c b/arch/x86/mm/discontig_32.c index eba0bbede7a6..18378850e25a 100644 --- a/arch/x86/mm/discontig_32.c +++ b/arch/x86/mm/discontig_32.c | |||
@@ -120,7 +120,7 @@ int __init get_memcfg_numa_flat(void) | |||
120 | printk("NUMA - single node, flat memory mode\n"); | 120 | printk("NUMA - single node, flat memory mode\n"); |
121 | 121 | ||
122 | /* Run the memory configuration and find the top of memory. */ | 122 | /* Run the memory configuration and find the top of memory. */ |
123 | find_max_pfn(); | 123 | propagate_e820_map(); |
124 | node_start_pfn[0] = 0; | 124 | node_start_pfn[0] = 0; |
125 | node_end_pfn[0] = max_pfn; | 125 | node_end_pfn[0] = max_pfn; |
126 | memory_present(0, 0, max_pfn); | 126 | memory_present(0, 0, max_pfn); |
@@ -134,7 +134,7 @@ int __init get_memcfg_numa_flat(void) | |||
134 | /* | 134 | /* |
135 | * Find the highest page frame number we have available for the node | 135 | * Find the highest page frame number we have available for the node |
136 | */ | 136 | */ |
137 | static void __init find_max_pfn_node(int nid) | 137 | static void __init propagate_e820_map_node(int nid) |
138 | { | 138 | { |
139 | if (node_end_pfn[nid] > max_pfn) | 139 | if (node_end_pfn[nid] > max_pfn) |
140 | node_end_pfn[nid] = max_pfn; | 140 | node_end_pfn[nid] = max_pfn; |
@@ -379,7 +379,7 @@ unsigned long __init setup_memory(void) | |||
379 | printk("High memory starts at vaddr %08lx\n", | 379 | printk("High memory starts at vaddr %08lx\n", |
380 | (ulong) pfn_to_kaddr(highstart_pfn)); | 380 | (ulong) pfn_to_kaddr(highstart_pfn)); |
381 | for_each_online_node(nid) | 381 | for_each_online_node(nid) |
382 | find_max_pfn_node(nid); | 382 | propagate_e820_map_node(nid); |
383 | 383 | ||
384 | memset(NODE_DATA(0), 0, sizeof(struct pglist_data)); | 384 | memset(NODE_DATA(0), 0, sizeof(struct pglist_data)); |
385 | NODE_DATA(0)->bdata = &node0_bdata; | 385 | NODE_DATA(0)->bdata = &node0_bdata; |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 1500dc8d63e4..9ec62da85fd7 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/i386/mm/init.c | ||
3 | * | 2 | * |
4 | * Copyright (C) 1995 Linus Torvalds | 3 | * Copyright (C) 1995 Linus Torvalds |
5 | * | 4 | * |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 1076097dcab2..1ff7906a9a4d 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -47,9 +47,6 @@ | |||
47 | #include <asm/numa.h> | 47 | #include <asm/numa.h> |
48 | #include <asm/cacheflush.h> | 48 | #include <asm/cacheflush.h> |
49 | 49 | ||
50 | const struct dma_mapping_ops *dma_ops; | ||
51 | EXPORT_SYMBOL(dma_ops); | ||
52 | |||
53 | static unsigned long dma_reserve __initdata; | 50 | static unsigned long dma_reserve __initdata; |
54 | 51 | ||
55 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 52 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index c590fd200e29..3a4baf95e24d 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
@@ -134,7 +134,7 @@ static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size, | |||
134 | 134 | ||
135 | if (!phys_addr_valid(phys_addr)) { | 135 | if (!phys_addr_valid(phys_addr)) { |
136 | printk(KERN_WARNING "ioremap: invalid physical address %llx\n", | 136 | printk(KERN_WARNING "ioremap: invalid physical address %llx\n", |
137 | phys_addr); | 137 | (unsigned long long)phys_addr); |
138 | WARN_ON_ONCE(1); | 138 | WARN_ON_ONCE(1); |
139 | return NULL; | 139 | return NULL; |
140 | } | 140 | } |
@@ -187,7 +187,8 @@ static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size, | |||
187 | new_prot_val == _PAGE_CACHE_WB)) { | 187 | new_prot_val == _PAGE_CACHE_WB)) { |
188 | pr_debug( | 188 | pr_debug( |
189 | "ioremap error for 0x%llx-0x%llx, requested 0x%lx, got 0x%lx\n", | 189 | "ioremap error for 0x%llx-0x%llx, requested 0x%lx, got 0x%lx\n", |
190 | phys_addr, phys_addr + size, | 190 | (unsigned long long)phys_addr, |
191 | (unsigned long long)(phys_addr + size), | ||
191 | prot_val, new_prot_val); | 192 | prot_val, new_prot_val); |
192 | free_memtype(phys_addr, phys_addr + size); | 193 | free_memtype(phys_addr, phys_addr + size); |
193 | return NULL; | 194 | return NULL; |
diff --git a/arch/x86/mm/k8topology_64.c b/arch/x86/mm/k8topology_64.c index 7a2ebce87df5..86808e666f9c 100644 --- a/arch/x86/mm/k8topology_64.c +++ b/arch/x86/mm/k8topology_64.c | |||
@@ -164,7 +164,7 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end) | |||
164 | if (!found) | 164 | if (!found) |
165 | return -1; | 165 | return -1; |
166 | 166 | ||
167 | memnode_shift = compute_hash_shift(nodes, 8); | 167 | memnode_shift = compute_hash_shift(nodes, 8, NULL); |
168 | if (memnode_shift < 0) { | 168 | if (memnode_shift < 0) { |
169 | printk(KERN_ERR "No NUMA node hash function found. Contact maintainer\n"); | 169 | printk(KERN_ERR "No NUMA node hash function found. Contact maintainer\n"); |
170 | return -1; | 170 | return -1; |
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 2ea56f48f29b..cb3170186355 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -60,7 +60,7 @@ unsigned long __initdata nodemap_size; | |||
60 | * -1 if node overlap or lost ram (shift too big) | 60 | * -1 if node overlap or lost ram (shift too big) |
61 | */ | 61 | */ |
62 | static int __init populate_memnodemap(const struct bootnode *nodes, | 62 | static int __init populate_memnodemap(const struct bootnode *nodes, |
63 | int numnodes, int shift) | 63 | int numnodes, int shift, int *nodeids) |
64 | { | 64 | { |
65 | unsigned long addr, end; | 65 | unsigned long addr, end; |
66 | int i, res = -1; | 66 | int i, res = -1; |
@@ -76,7 +76,12 @@ static int __init populate_memnodemap(const struct bootnode *nodes, | |||
76 | do { | 76 | do { |
77 | if (memnodemap[addr >> shift] != NUMA_NO_NODE) | 77 | if (memnodemap[addr >> shift] != NUMA_NO_NODE) |
78 | return -1; | 78 | return -1; |
79 | memnodemap[addr >> shift] = i; | 79 | |
80 | if (!nodeids) | ||
81 | memnodemap[addr >> shift] = i; | ||
82 | else | ||
83 | memnodemap[addr >> shift] = nodeids[i]; | ||
84 | |||
80 | addr += (1UL << shift); | 85 | addr += (1UL << shift); |
81 | } while (addr < end); | 86 | } while (addr < end); |
82 | res = 1; | 87 | res = 1; |
@@ -139,7 +144,8 @@ static int __init extract_lsb_from_nodes(const struct bootnode *nodes, | |||
139 | return i; | 144 | return i; |
140 | } | 145 | } |
141 | 146 | ||
142 | int __init compute_hash_shift(struct bootnode *nodes, int numnodes) | 147 | int __init compute_hash_shift(struct bootnode *nodes, int numnodes, |
148 | int *nodeids) | ||
143 | { | 149 | { |
144 | int shift; | 150 | int shift; |
145 | 151 | ||
@@ -149,7 +155,7 @@ int __init compute_hash_shift(struct bootnode *nodes, int numnodes) | |||
149 | printk(KERN_DEBUG "NUMA: Using %d for the hash shift.\n", | 155 | printk(KERN_DEBUG "NUMA: Using %d for the hash shift.\n", |
150 | shift); | 156 | shift); |
151 | 157 | ||
152 | if (populate_memnodemap(nodes, numnodes, shift) != 1) { | 158 | if (populate_memnodemap(nodes, numnodes, shift, nodeids) != 1) { |
153 | printk(KERN_INFO "Your memory is not aligned you need to " | 159 | printk(KERN_INFO "Your memory is not aligned you need to " |
154 | "rebuild your kernel with a bigger NODEMAPSIZE " | 160 | "rebuild your kernel with a bigger NODEMAPSIZE " |
155 | "shift=%d\n", shift); | 161 | "shift=%d\n", shift); |
@@ -462,7 +468,7 @@ done: | |||
462 | } | 468 | } |
463 | } | 469 | } |
464 | out: | 470 | out: |
465 | memnode_shift = compute_hash_shift(nodes, num_nodes); | 471 | memnode_shift = compute_hash_shift(nodes, num_nodes, NULL); |
466 | if (memnode_shift < 0) { | 472 | if (memnode_shift < 0) { |
467 | memnode_shift = 0; | 473 | memnode_shift = 0; |
468 | printk(KERN_ERR "No NUMA hash function found. NUMA emulation " | 474 | printk(KERN_ERR "No NUMA hash function found. NUMA emulation " |
diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c index 3165ec0672bd..6fb9e7c6893f 100644 --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c | |||
@@ -1,7 +1,3 @@ | |||
1 | /* | ||
2 | * linux/arch/i386/mm/pgtable.c | ||
3 | */ | ||
4 | |||
5 | #include <linux/sched.h> | 1 | #include <linux/sched.h> |
6 | #include <linux/kernel.h> | 2 | #include <linux/kernel.h> |
7 | #include <linux/errno.h> | 3 | #include <linux/errno.h> |
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 1bae9c855ceb..fb43d89f46f3 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
@@ -32,6 +32,10 @@ static struct bootnode nodes_add[MAX_NUMNODES]; | |||
32 | static int found_add_area __initdata; | 32 | static int found_add_area __initdata; |
33 | int hotadd_percent __initdata = 0; | 33 | int hotadd_percent __initdata = 0; |
34 | 34 | ||
35 | static int num_node_memblks __initdata; | ||
36 | static struct bootnode node_memblk_range[NR_NODE_MEMBLKS] __initdata; | ||
37 | static int memblk_nodeid[NR_NODE_MEMBLKS] __initdata; | ||
38 | |||
35 | /* Too small nodes confuse the VM badly. Usually they result | 39 | /* Too small nodes confuse the VM badly. Usually they result |
36 | from BIOS bugs. */ | 40 | from BIOS bugs. */ |
37 | #define NODE_MIN_SIZE (4*1024*1024) | 41 | #define NODE_MIN_SIZE (4*1024*1024) |
@@ -41,17 +45,17 @@ static __init int setup_node(int pxm) | |||
41 | return acpi_map_pxm_to_node(pxm); | 45 | return acpi_map_pxm_to_node(pxm); |
42 | } | 46 | } |
43 | 47 | ||
44 | static __init int conflicting_nodes(unsigned long start, unsigned long end) | 48 | static __init int conflicting_memblks(unsigned long start, unsigned long end) |
45 | { | 49 | { |
46 | int i; | 50 | int i; |
47 | for_each_node_mask(i, nodes_parsed) { | 51 | for (i = 0; i < num_node_memblks; i++) { |
48 | struct bootnode *nd = &nodes[i]; | 52 | struct bootnode *nd = &node_memblk_range[i]; |
49 | if (nd->start == nd->end) | 53 | if (nd->start == nd->end) |
50 | continue; | 54 | continue; |
51 | if (nd->end > start && nd->start < end) | 55 | if (nd->end > start && nd->start < end) |
52 | return i; | 56 | return memblk_nodeid[i]; |
53 | if (nd->end == end && nd->start == start) | 57 | if (nd->end == end && nd->start == start) |
54 | return i; | 58 | return memblk_nodeid[i]; |
55 | } | 59 | } |
56 | return -1; | 60 | return -1; |
57 | } | 61 | } |
@@ -258,7 +262,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) | |||
258 | bad_srat(); | 262 | bad_srat(); |
259 | return; | 263 | return; |
260 | } | 264 | } |
261 | i = conflicting_nodes(start, end); | 265 | i = conflicting_memblks(start, end); |
262 | if (i == node) { | 266 | if (i == node) { |
263 | printk(KERN_WARNING | 267 | printk(KERN_WARNING |
264 | "SRAT: Warning: PXM %d (%lx-%lx) overlaps with itself (%Lx-%Lx)\n", | 268 | "SRAT: Warning: PXM %d (%lx-%lx) overlaps with itself (%Lx-%Lx)\n", |
@@ -283,10 +287,10 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) | |||
283 | nd->end = end; | 287 | nd->end = end; |
284 | } | 288 | } |
285 | 289 | ||
286 | printk(KERN_INFO "SRAT: Node %u PXM %u %Lx-%Lx\n", node, pxm, | 290 | printk(KERN_INFO "SRAT: Node %u PXM %u %lx-%lx\n", node, pxm, |
287 | nd->start, nd->end); | 291 | start, end); |
288 | e820_register_active_regions(node, nd->start >> PAGE_SHIFT, | 292 | e820_register_active_regions(node, start >> PAGE_SHIFT, |
289 | nd->end >> PAGE_SHIFT); | 293 | end >> PAGE_SHIFT); |
290 | push_node_boundaries(node, nd->start >> PAGE_SHIFT, | 294 | push_node_boundaries(node, nd->start >> PAGE_SHIFT, |
291 | nd->end >> PAGE_SHIFT); | 295 | nd->end >> PAGE_SHIFT); |
292 | 296 | ||
@@ -298,6 +302,11 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) | |||
298 | if ((nd->start | nd->end) == 0) | 302 | if ((nd->start | nd->end) == 0) |
299 | node_clear(node, nodes_parsed); | 303 | node_clear(node, nodes_parsed); |
300 | } | 304 | } |
305 | |||
306 | node_memblk_range[num_node_memblks].start = start; | ||
307 | node_memblk_range[num_node_memblks].end = end; | ||
308 | memblk_nodeid[num_node_memblks] = node; | ||
309 | num_node_memblks++; | ||
301 | } | 310 | } |
302 | 311 | ||
303 | /* Sanity check to catch more bad SRATs (they are amazingly common). | 312 | /* Sanity check to catch more bad SRATs (they are amazingly common). |
@@ -368,7 +377,8 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end) | |||
368 | return -1; | 377 | return -1; |
369 | } | 378 | } |
370 | 379 | ||
371 | memnode_shift = compute_hash_shift(nodes, MAX_NUMNODES); | 380 | memnode_shift = compute_hash_shift(node_memblk_range, num_node_memblks, |
381 | memblk_nodeid); | ||
372 | if (memnode_shift < 0) { | 382 | if (memnode_shift < 0) { |
373 | printk(KERN_ERR | 383 | printk(KERN_ERR |
374 | "SRAT: No NUMA node hash function found. Contact maintainer\n"); | 384 | "SRAT: No NUMA node hash function found. Contact maintainer\n"); |