From: KAMEZAWA Hiroyuki Date: Tue, 26 Oct 2010 21:22:08 +0000 (-0700) Subject: mm: fix is_mem_section_removable() page_order BUG_ON check X-Git-Tag: v2.6.27.57~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b5df7b78075c50f4918da9f4d7cdb99b145de23;p=thirdparty%2Fkernel%2Fstable.git mm: fix is_mem_section_removable() page_order BUG_ON check commit 572438f9b52236bd8938b1647cc15e027d27ef55 upstream. page_order() is called by memory hotplug's user interface to check the section is removable or not. (is_mem_section_removable()) It calls page_order() withoug holding zone->lock. So, even if the caller does if (PageBuddy(page)) ret = page_order(page) ... The caller may hit BUG_ON(). For fixing this, there are 2 choices. 1. add zone->lock. 2. remove BUG_ON(). is_mem_section_removable() is used for some "advice" and doesn't need to be 100% accurate. This is_removable() can be called via user program.. We don't want to take this important lock for long by user's request. So, this patch removes BUG_ON(). Signed-off-by: KAMEZAWA Hiroyuki Acked-by: Wu Fengguang Acked-by: Michal Hocko Acked-by: Mel Gorman Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- diff --git a/mm/internal.h b/mm/internal.h index 92729ea9dc8c9..362319a57eec6 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -49,7 +49,7 @@ extern void __free_pages_bootmem(struct page *page, unsigned int order); */ static inline unsigned long page_order(struct page *page) { - VM_BUG_ON(!PageBuddy(page)); + /* PageBuddy() must be checked by the caller */ return page_private(page); }