|
@@ -655,9 +655,22 @@ void free_initrd_mem(unsigned long start, unsigned long end)
|
|
|
|
|
|
void __init reserve_bootmem_generic(unsigned long phys, unsigned len)
|
|
|
{
|
|
|
- /* Should check here against the e820 map to avoid double free */
|
|
|
#ifdef CONFIG_NUMA
|
|
|
int nid = phys_to_nid(phys);
|
|
|
+#endif
|
|
|
+ unsigned long pfn = phys >> PAGE_SHIFT;
|
|
|
+ if (pfn >= end_pfn) {
|
|
|
+ /* This can happen with kdump kernels when accessing firmware
|
|
|
+ tables. */
|
|
|
+ if (pfn < end_pfn_map)
|
|
|
+ return;
|
|
|
+ printk(KERN_ERR "reserve_bootmem: illegal reserve %lx %u\n",
|
|
|
+ phys, len);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Should check here against the e820 map to avoid double free */
|
|
|
+#ifdef CONFIG_NUMA
|
|
|
reserve_bootmem_node(NODE_DATA(nid), phys, len);
|
|
|
#else
|
|
|
reserve_bootmem(phys, len);
|