diff options
author | Hugh Dickins <hugh@veritas.com> | 2005-06-21 20:15:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-21 21:46:19 -0400 |
commit | 334795eca421287c41c257992027d29659dc0f97 (patch) | |
tree | c371467bea94f77bd340730c9cac724cca194b20 | |
parent | 45918e1a8bfcabc1cb4570b8df276655020eac45 (diff) |
[PATCH] bad_page: clear reclaim and slab
Since free_pages_check complains if PG_reclaim or PG_slab is set, bad_page
ought to clear them to avoid repetitive reports (Nikita noticed this too).
Let prep_new_page check page_count and PG_slab as free_pages_check does.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | mm/page_alloc.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 418102a02921..62b950901d6f 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -105,11 +105,13 @@ static void bad_page(const char *function, struct page *page) | |||
105 | printk(KERN_EMERG "Backtrace:\n"); | 105 | printk(KERN_EMERG "Backtrace:\n"); |
106 | dump_stack(); | 106 | dump_stack(); |
107 | printk(KERN_EMERG "Trying to fix it up, but a reboot is needed\n"); | 107 | printk(KERN_EMERG "Trying to fix it up, but a reboot is needed\n"); |
108 | page->flags &= ~(1 << PG_private | | 108 | page->flags &= ~(1 << PG_lru | |
109 | 1 << PG_private | | ||
109 | 1 << PG_locked | | 110 | 1 << PG_locked | |
110 | 1 << PG_lru | | ||
111 | 1 << PG_active | | 111 | 1 << PG_active | |
112 | 1 << PG_dirty | | 112 | 1 << PG_dirty | |
113 | 1 << PG_reclaim | | ||
114 | 1 << PG_slab | | ||
113 | 1 << PG_swapcache | | 115 | 1 << PG_swapcache | |
114 | 1 << PG_writeback); | 116 | 1 << PG_writeback); |
115 | set_page_count(page, 0); | 117 | set_page_count(page, 0); |
@@ -440,14 +442,17 @@ void set_page_refs(struct page *page, int order) | |||
440 | */ | 442 | */ |
441 | static void prep_new_page(struct page *page, int order) | 443 | static void prep_new_page(struct page *page, int order) |
442 | { | 444 | { |
443 | if (page->mapping || page_mapcount(page) || | 445 | if ( page_mapcount(page) || |
444 | (page->flags & ( | 446 | page->mapping != NULL || |
447 | page_count(page) != 0 || | ||
448 | (page->flags & ( | ||
449 | 1 << PG_lru | | ||
445 | 1 << PG_private | | 450 | 1 << PG_private | |
446 | 1 << PG_locked | | 451 | 1 << PG_locked | |
447 | 1 << PG_lru | | ||
448 | 1 << PG_active | | 452 | 1 << PG_active | |
449 | 1 << PG_dirty | | 453 | 1 << PG_dirty | |
450 | 1 << PG_reclaim | | 454 | 1 << PG_reclaim | |
455 | 1 << PG_slab | | ||
451 | 1 << PG_swapcache | | 456 | 1 << PG_swapcache | |
452 | 1 << PG_writeback ))) | 457 | 1 << PG_writeback ))) |
453 | bad_page(__FUNCTION__, page); | 458 | bad_page(__FUNCTION__, page); |