Messages in this thread Patch in this message | | | From | Weijie Yang <> | Subject | [PATCH] mm: page_alloc: place zone id check before VM_BUG_ON_PAGE check | Date | Tue, 09 Dec 2014 15:40:35 +0800 |
| |
If the free page and its buddy has different zone id, the current zone->lock cann't prevent buddy page getting allocated, this could trigger VM_BUG_ON_PAGE in a very tiny chance:
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)
This patch fixes this issue by placing the zone id check before the VM_BUG_ON_PAGE check.
Signed-off-by: Weijie Yang <weijie.yang@samsung.com> --- mm/page_alloc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 616a2c9..491d055 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -488,17 +488,15 @@ static inline int page_is_buddy(struct page *page, struct page *buddy, return 0; if (page_is_guard(buddy) && page_order(buddy) == order) { - VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); - if (page_zone_id(page) != page_zone_id(buddy)) return 0; + VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); + return 1; } if (PageBuddy(buddy) && page_order(buddy) == order) { - VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); - /* * zone check is done late to avoid uselessly * calculating zone/node ids for pages that could @@ -507,6 +505,8 @@ static inline int page_is_buddy(struct page *page, struct page *buddy, if (page_zone_id(page) != page_zone_id(buddy)) return 0; + VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy); + return 1; } return 0; -- 1.7.10.4
| |