]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/2.6.32.27/mm-fix-is_mem_section_removable-page_order-bug_on-check.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 2.6.32.27 / mm-fix-is_mem_section_removable-page_order-bug_on-check.patch
CommitLineData
93d9a044
GKH
1From 572438f9b52236bd8938b1647cc15e027d27ef55 Mon Sep 17 00:00:00 2001
2From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
3Date: Tue, 26 Oct 2010 14:22:08 -0700
4Subject: mm: fix is_mem_section_removable() page_order BUG_ON check
5
6From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
7
8commit 572438f9b52236bd8938b1647cc15e027d27ef55 upstream.
9
10page_order() is called by memory hotplug's user interface to check the
11section is removable or not. (is_mem_section_removable())
12
13It calls page_order() withoug holding zone->lock.
14So, even if the caller does
15
16 if (PageBuddy(page))
17 ret = page_order(page) ...
18The caller may hit BUG_ON().
19
20For fixing this, there are 2 choices.
21 1. add zone->lock.
22 2. remove BUG_ON().
23
24is_mem_section_removable() is used for some "advice" and doesn't need to
25be 100% accurate. This is_removable() can be called via user program..
26We don't want to take this important lock for long by user's request. So,
27this patch removes BUG_ON().
28
29Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
30Acked-by: Wu Fengguang <fengguang.wu@intel.com>
31Acked-by: Michal Hocko <mhocko@suse.cz>
32Acked-by: Mel Gorman <mel@csn.ul.ie>
33Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
34Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
35Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
36
37---
38 mm/internal.h | 2 +-
39 1 file changed, 1 insertion(+), 1 deletion(-)
40
41--- a/mm/internal.h
42+++ b/mm/internal.h
43@@ -59,7 +59,7 @@ extern void prep_compound_page(struct pa
44 */
45 static inline unsigned long page_order(struct page *page)
46 {
47- VM_BUG_ON(!PageBuddy(page));
48+ /* PageBuddy() must be checked by the caller */
49 return page_private(page);
50 }
51