• Yinghai Lu's avatar
    mm: fix boundary checking in free_bootmem_core · 5a982cbc
    Yinghai Lu authored
    
    
    With numa enabled, some callers could have a range of memory on one node
    but try to free that on other node.  This can cause some pages to be
    freed wrongly.
    
    For example: when we try to allocate 128g boot ram early for
    gart/swiotlb, and free that range later so gart/swiotlb can get some
    range afterwards.
    
    With this patch, we don't need to care which node holds the range, just
    loop to call free_bootmem_node for all online nodes.
    
    This patch makes free_bootmem_core() more robust by trimming the sidx
    and eidx according the ram range that the node has.
    
    And make the free_bootmem_core handle this out of range case.  We could
    use bdata_list to make sure the range can be freed for sure.  So next
    time, we don't need to loop online nodes and could use free_bootmem
    directly.
    
    Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
    Cc: Andi Kleen <ak@suse.de>
    Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Acked-by: default avatarIngo Molnar <mingo@elte.hu>
    Tested-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: Christoph Lameter <clameter@sgi.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    5a982cbc