• Minchan Kim's avatar
    memory-hotplug: bug fix race between isolation and allocation · 41d575ad
    Minchan Kim authored
    Like below, memory-hotplug makes race between page-isolation
    and page-allocation so it can hit BUG_ON in __offline_isolated_pages.
    
    	CPU A					CPU B
    
    start_isolate_page_range
    set_migratetype_isolate
    spin_lock_irqsave(zone->lock)
    
    				free_hot_cold_page(Page A)
    				/* without zone->lock */
    				migratetype = get_pageblock_migratetype(Page A);
    				/*
    				 * Page could be moved into MIGRATE_MOVABLE
    				 * of per_cpu_pages
    				 */
    				list_add_tail(&page->lru, &pcp->lists[migratetype]);
    
    set_pageblock_isolate
    move_freepages_block
    drain_all_pages
    
    				/* Page A could be in MIGRATE_MOVABLE of free_list. */
    
    check_pages_isolated
    __test_page_isolated_in_pageblock
    /*
     * We can't catch freed page which
     * is free_list[MIGRATE_MOVABLE]
     */
    if (PageBuddy(page A))
    	pfn += 1 << page_order(page A);
    
    				/* So, Page A could be allocated */
    
    __offline_isolated_pages
    /*
     * BUG_ON hit or offline page
     * which is used by someone
     */
    BUG_ON(!PageBuddy(page A));
    
    This patch checks page's migratetype in freelist in
    __test_page_isolated_in_pageblock.  So now
    __test_page_isolated_in_pageblock can check the page caused by above race
    and can fail of memory offlining.
    Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Reviewed-by: default avatarYasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Cc: Xishi Qiu <qiuxishi@huawei.com>
    Cc: Wen Congyang <wency@cn.fujitsu.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    41d575ad
page_isolation.c 6.55 KB