Subject: [PATCH] memblock: Add checking about illegal using memblock.reserved After memblock is not used anymore, Clear the memblock reserved so we will not use it wrongly. Signed-off-by: Yinghai Lu --- arch/x86/mm/init_32.c | 3 +++ arch/x86/mm/init_64.c | 2 ++ include/linux/memblock.h | 1 + mm/memblock.c | 15 +++++++++++++++ 4 files changed, 21 insertions(+) Index: linux-2.6/arch/x86/mm/init_32.c =================================================================== --- linux-2.6.orig/arch/x86/mm/init_32.c +++ linux-2.6/arch/x86/mm/init_32.c @@ -759,6 +759,9 @@ void __init mem_init(void) if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp))) reservedpages++; + /* clear reserved to catch wrong usage */ + memblock_clear_reserved(); + codesize = (unsigned long) &_etext - (unsigned long) &_text; datasize = (unsigned long) &_edata - (unsigned long) &_etext; initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; Index: linux-2.6/arch/x86/mm/init_64.c =================================================================== --- linux-2.6.orig/arch/x86/mm/init_64.c +++ linux-2.6/arch/x86/mm/init_64.c @@ -699,6 +699,8 @@ void __init mem_init(void) absent_pages = absent_pages_in_range(0, max_pfn); reservedpages = max_pfn - totalram_pages - absent_pages; + /* clear reserved to catch wrong usage */ + memblock_clear_reserved(); after_bootmem = 1; codesize = (unsigned long) &_etext - (unsigned long) &_text; Index: linux-2.6/include/linux/memblock.h =================================================================== --- linux-2.6.orig/include/linux/memblock.h +++ linux-2.6/include/linux/memblock.h @@ -46,6 +46,7 @@ extern int memblock_debug; #define memblock_dbg(fmt, ...) \ if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) +void memblock_clear_reserved(void); phys_addr_t memblock_find_in_range_node(phys_addr_t start, phys_addr_t end, phys_addr_t size, phys_addr_t align, int nid); phys_addr_t memblock_find_in_range(phys_addr_t start, phys_addr_t end, Index: linux-2.6/mm/memblock.c =================================================================== --- linux-2.6.orig/mm/memblock.c +++ linux-2.6/mm/memblock.c @@ -101,6 +101,8 @@ phys_addr_t __init_memblock memblock_fin phys_addr_t this_start, this_end, cand; u64 i; + WARN_ONCE(!memblock.reserved.max, "memblock.reserved was cleared already!"); + /* pump up @end */ if (end == MEMBLOCK_ALLOC_ACCESSIBLE) end = memblock.current_limit; @@ -143,6 +145,14 @@ phys_addr_t __init_memblock memblock_fin MAX_NUMNODES); } +/* + * Clear memblock.reserved + */ +void __init_memblock memblock_clear_reserved(void) +{ + memset(&memblock.reserved, 0, sizeof(memblock.reserved)); +} + static void __init_memblock memblock_remove_region(struct memblock_type *type, unsigned long r) { type->total_size -= type->regions[r].size; @@ -535,6 +545,8 @@ int __init_memblock memblock_remove(phys int __init_memblock memblock_free(phys_addr_t base, phys_addr_t size) { + WARN_ONCE(!memblock.reserved.max, "memblock.reserved was cleared already!"); + memblock_dbg(" memblock_free: [%#016llx-%#016llx] %pF\n", (unsigned long long)base, (unsigned long long)base + size, @@ -547,6 +559,7 @@ int __init_memblock memblock_reserve(phy { struct memblock_type *_rgn = &memblock.reserved; + WARN_ONCE(!memblock.reserved.max, "memblock.reserved was cleared already!"); memblock_dbg("memblock_reserve: [%#016llx-%#016llx] %pF\n", (unsigned long long)base, (unsigned long long)base + size, @@ -587,6 +600,8 @@ void __init_memblock __next_free_mem_ran int mi = *idx & 0xffffffff; int ri = *idx >> 32; + WARN_ONCE(!rsv->max, "memblock.reserved was cleared already!"); + for ( ; mi < mem->cnt; mi++) { struct memblock_region *m = &mem->regions[mi]; phys_addr_t m_start = m->base;