]>
Commit | Line | Data |
---|---|---|
93d9a044 GKH |
1 | From 572438f9b52236bd8938b1647cc15e027d27ef55 Mon Sep 17 00:00:00 2001 |
2 | From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | |
3 | Date: Tue, 26 Oct 2010 14:22:08 -0700 | |
4 | Subject: mm: fix is_mem_section_removable() page_order BUG_ON check | |
5 | ||
6 | From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | |
7 | ||
8 | commit 572438f9b52236bd8938b1647cc15e027d27ef55 upstream. | |
9 | ||
10 | page_order() is called by memory hotplug's user interface to check the | |
11 | section is removable or not. (is_mem_section_removable()) | |
12 | ||
13 | It calls page_order() withoug holding zone->lock. | |
14 | So, even if the caller does | |
15 | ||
16 | if (PageBuddy(page)) | |
17 | ret = page_order(page) ... | |
18 | The caller may hit BUG_ON(). | |
19 | ||
20 | For fixing this, there are 2 choices. | |
21 | 1. add zone->lock. | |
22 | 2. remove BUG_ON(). | |
23 | ||
24 | is_mem_section_removable() is used for some "advice" and doesn't need to | |
25 | be 100% accurate. This is_removable() can be called via user program.. | |
26 | We don't want to take this important lock for long by user's request. So, | |
27 | this patch removes BUG_ON(). | |
28 | ||
29 | Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | |
30 | Acked-by: Wu Fengguang <fengguang.wu@intel.com> | |
31 | Acked-by: Michal Hocko <mhocko@suse.cz> | |
32 | Acked-by: Mel Gorman <mel@csn.ul.ie> | |
33 | Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | |
34 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | |
35 | Signed-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 |