aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/mm/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r--arch/x86_64/mm/init.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c
index b0a607892183..69e22d3c9238 100644
--- a/arch/x86_64/mm/init.c
+++ b/arch/x86_64/mm/init.c
@@ -565,11 +565,11 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end)
565 565
566 printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); 566 printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
567 for (addr = begin; addr < end; addr += PAGE_SIZE) { 567 for (addr = begin; addr < end; addr += PAGE_SIZE) {
568 ClearPageReserved(virt_to_page(addr)); 568 struct page *page = pfn_to_page(addr >> PAGE_SHIFT);
569 init_page_count(virt_to_page(addr)); 569 ClearPageReserved(page);
570 memset((void *)(addr & ~(PAGE_SIZE-1)), 570 init_page_count(page);
571 POISON_FREE_INITMEM, PAGE_SIZE); 571 memset(page_address(page), POISON_FREE_INITMEM, PAGE_SIZE);
572 free_page(addr); 572 __free_page(page);
573 totalram_pages++; 573 totalram_pages++;
574 } 574 }
575} 575}
@@ -579,17 +579,18 @@ void free_initmem(void)
579 memset(__initdata_begin, POISON_FREE_INITDATA, 579 memset(__initdata_begin, POISON_FREE_INITDATA,
580 __initdata_end - __initdata_begin); 580 __initdata_end - __initdata_begin);
581 free_init_pages("unused kernel memory", 581 free_init_pages("unused kernel memory",
582 (unsigned long)(&__init_begin), 582 __pa_symbol(&__init_begin),
583 (unsigned long)(&__init_end)); 583 __pa_symbol(&__init_end));
584} 584}
585 585
586#ifdef CONFIG_DEBUG_RODATA 586#ifdef CONFIG_DEBUG_RODATA
587 587
588void mark_rodata_ro(void) 588void mark_rodata_ro(void)
589{ 589{
590 unsigned long addr = (unsigned long)__start_rodata; 590 unsigned long addr = (unsigned long)__va(__pa_symbol(&__start_rodata));
591 unsigned long end = (unsigned long)__va(__pa_symbol(&__end_rodata));
591 592
592 for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE) 593 for (; addr < end; addr += PAGE_SIZE)
593 change_page_attr_addr(addr, 1, PAGE_KERNEL_RO); 594 change_page_attr_addr(addr, 1, PAGE_KERNEL_RO);
594 595
595 printk ("Write protecting the kernel read-only data: %luk\n", 596 printk ("Write protecting the kernel read-only data: %luk\n",
@@ -608,7 +609,7 @@ void mark_rodata_ro(void)
608#ifdef CONFIG_BLK_DEV_INITRD 609#ifdef CONFIG_BLK_DEV_INITRD
609void free_initrd_mem(unsigned long start, unsigned long end) 610void free_initrd_mem(unsigned long start, unsigned long end)
610{ 611{
611 free_init_pages("initrd memory", start, end); 612 free_init_pages("initrd memory", __pa(start), __pa(end));
612} 613}
613#endif 614#endif
614 615