aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/mm/contig.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64/mm/contig.c')
-rw-r--r--arch/ia64/mm/contig.c84
1 files changed, 24 insertions, 60 deletions
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c
index e004143ba86b..daf977ff2920 100644
--- a/arch/ia64/mm/contig.c
+++ b/arch/ia64/mm/contig.c
@@ -26,7 +26,6 @@
26#include <asm/mca.h> 26#include <asm/mca.h>
27 27
28#ifdef CONFIG_VIRTUAL_MEM_MAP 28#ifdef CONFIG_VIRTUAL_MEM_MAP
29static unsigned long num_dma_physpages;
30static unsigned long max_gap; 29static unsigned long max_gap;
31#endif 30#endif
32 31
@@ -41,10 +40,11 @@ show_mem (void)
41 int i, total = 0, reserved = 0; 40 int i, total = 0, reserved = 0;
42 int shared = 0, cached = 0; 41 int shared = 0, cached = 0;
43 42
44 printk("Mem-info:\n"); 43 printk(KERN_INFO "Mem-info:\n");
45 show_free_areas(); 44 show_free_areas();
46 45
47 printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); 46 printk(KERN_INFO "Free swap: %6ldkB\n",
47 nr_swap_pages<<(PAGE_SHIFT-10));
48 i = max_mapnr; 48 i = max_mapnr;
49 for (i = 0; i < max_mapnr; i++) { 49 for (i = 0; i < max_mapnr; i++) {
50 if (!pfn_valid(i)) { 50 if (!pfn_valid(i)) {
@@ -63,12 +63,12 @@ show_mem (void)
63 else if (page_count(mem_map + i)) 63 else if (page_count(mem_map + i))
64 shared += page_count(mem_map + i) - 1; 64 shared += page_count(mem_map + i) - 1;
65 } 65 }
66 printk("%d pages of RAM\n", total); 66 printk(KERN_INFO "%d pages of RAM\n", total);
67 printk("%d reserved pages\n", reserved); 67 printk(KERN_INFO "%d reserved pages\n", reserved);
68 printk("%d pages shared\n", shared); 68 printk(KERN_INFO "%d pages shared\n", shared);
69 printk("%d pages swap cached\n", cached); 69 printk(KERN_INFO "%d pages swap cached\n", cached);
70 printk("%ld pages in page table cache\n", 70 printk(KERN_INFO "%ld pages in page table cache\n",
71 pgtable_quicklist_total_size()); 71 pgtable_quicklist_total_size());
72} 72}
73 73
74/* physical address where the bootmem map is located */ 74/* physical address where the bootmem map is located */
@@ -218,18 +218,6 @@ count_pages (u64 start, u64 end, void *arg)
218 return 0; 218 return 0;
219} 219}
220 220
221#ifdef CONFIG_VIRTUAL_MEM_MAP
222static int
223count_dma_pages (u64 start, u64 end, void *arg)
224{
225 unsigned long *count = arg;
226
227 if (start < MAX_DMA_ADDRESS)
228 *count += (min(end, MAX_DMA_ADDRESS) - start) >> PAGE_SHIFT;
229 return 0;
230}
231#endif
232
233/* 221/*
234 * Set up the page tables. 222 * Set up the page tables.
235 */ 223 */
@@ -238,45 +226,22 @@ void __init
238paging_init (void) 226paging_init (void)
239{ 227{
240 unsigned long max_dma; 228 unsigned long max_dma;
241 unsigned long zones_size[MAX_NR_ZONES]; 229 unsigned long nid = 0;
242#ifdef CONFIG_VIRTUAL_MEM_MAP 230 unsigned long max_zone_pfns[MAX_NR_ZONES];
243 unsigned long zholes_size[MAX_NR_ZONES];
244#endif
245
246 /* initialize mem_map[] */
247
248 memset(zones_size, 0, sizeof(zones_size));
249 231
250 num_physpages = 0; 232 num_physpages = 0;
251 efi_memmap_walk(count_pages, &num_physpages); 233 efi_memmap_walk(count_pages, &num_physpages);
252 234
253 max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; 235 max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT;
236 max_zone_pfns[ZONE_DMA] = max_dma;
237 max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
254 238
255#ifdef CONFIG_VIRTUAL_MEM_MAP 239#ifdef CONFIG_VIRTUAL_MEM_MAP
256 memset(zholes_size, 0, sizeof(zholes_size)); 240 efi_memmap_walk(register_active_ranges, &nid);
257
258 num_dma_physpages = 0;
259 efi_memmap_walk(count_dma_pages, &num_dma_physpages);
260
261 if (max_low_pfn < max_dma) {
262 zones_size[ZONE_DMA] = max_low_pfn;
263 zholes_size[ZONE_DMA] = max_low_pfn - num_dma_physpages;
264 } else {
265 zones_size[ZONE_DMA] = max_dma;
266 zholes_size[ZONE_DMA] = max_dma - num_dma_physpages;
267 if (num_physpages > num_dma_physpages) {
268 zones_size[ZONE_NORMAL] = max_low_pfn - max_dma;
269 zholes_size[ZONE_NORMAL] =
270 ((max_low_pfn - max_dma) -
271 (num_physpages - num_dma_physpages));
272 }
273 }
274
275 efi_memmap_walk(find_largest_hole, (u64 *)&max_gap); 241 efi_memmap_walk(find_largest_hole, (u64 *)&max_gap);
276 if (max_gap < LARGE_GAP) { 242 if (max_gap < LARGE_GAP) {
277 vmem_map = (struct page *) 0; 243 vmem_map = (struct page *) 0;
278 free_area_init_node(0, NODE_DATA(0), zones_size, 0, 244 free_area_init_nodes(max_zone_pfns);
279 zholes_size);
280 } else { 245 } else {
281 unsigned long map_size; 246 unsigned long map_size;
282 247
@@ -288,20 +253,19 @@ paging_init (void)
288 vmem_map = (struct page *) vmalloc_end; 253 vmem_map = (struct page *) vmalloc_end;
289 efi_memmap_walk(create_mem_map_page_table, NULL); 254 efi_memmap_walk(create_mem_map_page_table, NULL);
290 255
291 NODE_DATA(0)->node_mem_map = vmem_map; 256 /*
292 free_area_init_node(0, NODE_DATA(0), zones_size, 257 * alloc_node_mem_map makes an adjustment for mem_map
293 0, zholes_size); 258 * which isn't compatible with vmem_map.
259 */
260 NODE_DATA(0)->node_mem_map = vmem_map +
261 find_min_pfn_with_active_regions();
262 free_area_init_nodes(max_zone_pfns);
294 263
295 printk("Virtual mem_map starts at 0x%p\n", mem_map); 264 printk("Virtual mem_map starts at 0x%p\n", mem_map);
296 } 265 }
297#else /* !CONFIG_VIRTUAL_MEM_MAP */ 266#else /* !CONFIG_VIRTUAL_MEM_MAP */
298 if (max_low_pfn < max_dma) 267 add_active_range(0, 0, max_low_pfn);
299 zones_size[ZONE_DMA] = max_low_pfn; 268 free_area_init_nodes(max_zone_pfns);
300 else {
301 zones_size[ZONE_DMA] = max_dma;
302 zones_size[ZONE_NORMAL] = max_low_pfn - max_dma;
303 }
304 free_area_init(zones_size);
305#endif /* !CONFIG_VIRTUAL_MEM_MAP */ 269#endif /* !CONFIG_VIRTUAL_MEM_MAP */
306 zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); 270 zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page));
307} 271}