• Weijie Yang's avatar
    mm/page_alloc.c: place zone_id check before VM_BUG_ON_PAGE check · 4c5018ce
    Weijie Yang authored
    If the freeing page and its buddy page are not at the same zone, the
    current holding zone->lock for the freeing page cann't prevent buddy page
    getting allocated, this could trigger VM_BUG_ON_PAGE in page_is_buddy() at
    a very tiny chance, such as:
    cpu 0:						cpu 1:
    hold zone_1 lock
    check page and it buddy
    PageBuddy(buddy) is true			hold zone_2 lock
    page_order(buddy) == order is true		alloc buddy
    trigger VM_BUG_ON_PAGE(page_count(buddy) != 0)
    zone_1->lock prevents the freeing page getting allocated
    zone_2->lock prevents the buddy page getting allocated
    they are not the same zone->lock.
    If we can't remove the zone_id check statement, it's better handle this
    rare race.  This patch fixes this by placing the zone_id check before the
    VM_BUG_ON_PAGE check.
    Signed-off-by: default avatarWeijie Yang <weijie.yang@samsung.com>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Rik van Riel <riel@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
page_alloc.c 184 KB