aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/e820_64.c3
-rw-r--r--arch/x86/kernel/efi_64.c3
-rw-r--r--arch/x86/kernel/mpparse.c5
-rw-r--r--arch/x86/mm/init_64.c17
-rw-r--r--include/asm-x86/proto.h2
5 files changed, 20 insertions, 10 deletions
diff --git a/arch/x86/kernel/e820_64.c b/arch/x86/kernel/e820_64.c
index 124480c0008d..af1eb0789740 100644
--- a/arch/x86/kernel/e820_64.c
+++ b/arch/x86/kernel/e820_64.c
@@ -118,7 +118,8 @@ void __init early_res_to_bootmem(unsigned long start, unsigned long end)
118 continue; 118 continue;
119 printk(KERN_INFO " early res: %d [%lx-%lx] %s\n", i, 119 printk(KERN_INFO " early res: %d [%lx-%lx] %s\n", i,
120 final_start, final_end - 1, r->name); 120 final_start, final_end - 1, r->name);
121 reserve_bootmem_generic(final_start, final_end - final_start); 121 reserve_bootmem_generic(final_start, final_end - final_start,
122 BOOTMEM_DEFAULT);
122 } 123 }
123} 124}
124 125
diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/kernel/efi_64.c
index d0060fdcccac..d561dd5f1e62 100644
--- a/arch/x86/kernel/efi_64.c
+++ b/arch/x86/kernel/efi_64.c
@@ -100,7 +100,8 @@ void __init efi_call_phys_epilog(void)
100void __init efi_reserve_bootmem(void) 100void __init efi_reserve_bootmem(void)
101{ 101{
102 reserve_bootmem_generic((unsigned long)memmap.phys_map, 102 reserve_bootmem_generic((unsigned long)memmap.phys_map,
103 memmap.nr_map * memmap.desc_size); 103 memmap.nr_map * memmap.desc_size,
104 BOOTMEM_DEFAULT);
104} 105}
105 106
106void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size) 107void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size)
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 404683b94e79..4901ae3f742c 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -729,10 +729,11 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
729 if (!reserve) 729 if (!reserve)
730 return 1; 730 return 1;
731 731
732 reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE); 732 reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE,
733 BOOTMEM_DEFAULT);
733 if (mpf->mpf_physptr) 734 if (mpf->mpf_physptr)
734 reserve_bootmem_generic(mpf->mpf_physptr, 735 reserve_bootmem_generic(mpf->mpf_physptr,
735 PAGE_SIZE); 736 PAGE_SIZE, BOOTMEM_DEFAULT);
736#endif 737#endif
737 return 1; 738 return 1;
738 } 739 }
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 819dad973b13..bf7bf1de6c25 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -799,12 +799,13 @@ void free_initrd_mem(unsigned long start, unsigned long end)
799} 799}
800#endif 800#endif
801 801
802void __init reserve_bootmem_generic(unsigned long phys, unsigned len) 802int __init reserve_bootmem_generic(unsigned long phys, unsigned len, int flags)
803{ 803{
804#ifdef CONFIG_NUMA 804#ifdef CONFIG_NUMA
805 int nid, next_nid; 805 int nid, next_nid;
806#endif 806#endif
807 unsigned long pfn = phys >> PAGE_SHIFT; 807 unsigned long pfn = phys >> PAGE_SHIFT;
808 int ret;
808 809
809 if (pfn >= end_pfn) { 810 if (pfn >= end_pfn) {
810 /* 811 /*
@@ -812,11 +813,11 @@ void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
812 * firmware tables: 813 * firmware tables:
813 */ 814 */
814 if (pfn < max_pfn_mapped) 815 if (pfn < max_pfn_mapped)
815 return; 816 return -EFAULT;
816 817
817 printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %u\n", 818 printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %u\n",
818 phys, len); 819 phys, len);
819 return; 820 return -EFAULT;
820 } 821 }
821 822
822 /* Should check here against the e820 map to avoid double free */ 823 /* Should check here against the e820 map to avoid double free */
@@ -824,9 +825,13 @@ void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
824 nid = phys_to_nid(phys); 825 nid = phys_to_nid(phys);
825 next_nid = phys_to_nid(phys + len - 1); 826 next_nid = phys_to_nid(phys + len - 1);
826 if (nid == next_nid) 827 if (nid == next_nid)
827 reserve_bootmem_node(NODE_DATA(nid), phys, len, BOOTMEM_DEFAULT); 828 ret = reserve_bootmem_node(NODE_DATA(nid), phys, len, flags);
828 else 829 else
829 reserve_bootmem(phys, len, BOOTMEM_DEFAULT); 830 ret = reserve_bootmem(phys, len, flags);
831
832 if (ret != 0)
833 return ret;
834
830#else 835#else
831 reserve_bootmem(phys, len, BOOTMEM_DEFAULT); 836 reserve_bootmem(phys, len, BOOTMEM_DEFAULT);
832#endif 837#endif
@@ -835,6 +840,8 @@ void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
835 dma_reserve += len / PAGE_SIZE; 840 dma_reserve += len / PAGE_SIZE;
836 set_dma_reserve(dma_reserve); 841 set_dma_reserve(dma_reserve);
837 } 842 }
843
844 return 0;
838} 845}
839 846
840int kern_addr_valid(unsigned long addr) 847int kern_addr_valid(unsigned long addr)
diff --git a/include/asm-x86/proto.h b/include/asm-x86/proto.h
index 6c8b41b03f6d..a9f51472521e 100644
--- a/include/asm-x86/proto.h
+++ b/include/asm-x86/proto.h
@@ -14,7 +14,7 @@ extern void ia32_syscall(void);
14extern void ia32_cstar_target(void); 14extern void ia32_cstar_target(void);
15extern void ia32_sysenter_target(void); 15extern void ia32_sysenter_target(void);
16 16
17extern void reserve_bootmem_generic(unsigned long phys, unsigned len); 17extern int reserve_bootmem_generic(unsigned long phys, unsigned len, int flags);
18 18
19extern void syscall32_cpu_init(void); 19extern void syscall32_cpu_init(void);
20 20