diff options
author | Sasha Levin <sasha.levin@oracle.com> | 2014-01-23 18:52:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 19:36:50 -0500 |
commit | 309381feaee564281c3d9e90fbca8963bb7428ad (patch) | |
tree | 7e9f990c0cffcb8c5fc90deb1c7eac445c5ada0e /mm/filemap.c | |
parent | e3bba3c3c90cd434c1ccb9e5dc704a96baf9541c (diff) |
mm: dump page when hitting a VM_BUG_ON using VM_BUG_ON_PAGE
Most of the VM_BUG_ON assertions are performed on a page. Usually, when
one of these assertions fails we'll get a BUG_ON with a call stack and
the registers.
I've recently noticed based on the requests to add a small piece of code
that dumps the page to various VM_BUG_ON sites that the page dump is
quite useful to people debugging issues in mm.
This patch adds a VM_BUG_ON_PAGE(cond, page) which beyond doing what
VM_BUG_ON() does, also dumps the page before executing the actual
BUG_ON.
[akpm@linux-foundation.org: fix up includes]
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index b7749a92021c..7a7f3e0db738 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -409,9 +409,9 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) | |||
409 | { | 409 | { |
410 | int error; | 410 | int error; |
411 | 411 | ||
412 | VM_BUG_ON(!PageLocked(old)); | 412 | VM_BUG_ON_PAGE(!PageLocked(old), old); |
413 | VM_BUG_ON(!PageLocked(new)); | 413 | VM_BUG_ON_PAGE(!PageLocked(new), new); |
414 | VM_BUG_ON(new->mapping); | 414 | VM_BUG_ON_PAGE(new->mapping, new); |
415 | 415 | ||
416 | error = radix_tree_preload(gfp_mask & ~__GFP_HIGHMEM); | 416 | error = radix_tree_preload(gfp_mask & ~__GFP_HIGHMEM); |
417 | if (!error) { | 417 | if (!error) { |
@@ -461,8 +461,8 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping, | |||
461 | { | 461 | { |
462 | int error; | 462 | int error; |
463 | 463 | ||
464 | VM_BUG_ON(!PageLocked(page)); | 464 | VM_BUG_ON_PAGE(!PageLocked(page), page); |
465 | VM_BUG_ON(PageSwapBacked(page)); | 465 | VM_BUG_ON_PAGE(PageSwapBacked(page), page); |
466 | 466 | ||
467 | error = mem_cgroup_cache_charge(page, current->mm, | 467 | error = mem_cgroup_cache_charge(page, current->mm, |
468 | gfp_mask & GFP_RECLAIM_MASK); | 468 | gfp_mask & GFP_RECLAIM_MASK); |
@@ -607,7 +607,7 @@ EXPORT_SYMBOL_GPL(add_page_wait_queue); | |||
607 | */ | 607 | */ |
608 | void unlock_page(struct page *page) | 608 | void unlock_page(struct page *page) |
609 | { | 609 | { |
610 | VM_BUG_ON(!PageLocked(page)); | 610 | VM_BUG_ON_PAGE(!PageLocked(page), page); |
611 | clear_bit_unlock(PG_locked, &page->flags); | 611 | clear_bit_unlock(PG_locked, &page->flags); |
612 | smp_mb__after_clear_bit(); | 612 | smp_mb__after_clear_bit(); |
613 | wake_up_page(page, PG_locked); | 613 | wake_up_page(page, PG_locked); |
@@ -760,7 +760,7 @@ repeat: | |||
760 | page_cache_release(page); | 760 | page_cache_release(page); |
761 | goto repeat; | 761 | goto repeat; |
762 | } | 762 | } |
763 | VM_BUG_ON(page->index != offset); | 763 | VM_BUG_ON_PAGE(page->index != offset, page); |
764 | } | 764 | } |
765 | return page; | 765 | return page; |
766 | } | 766 | } |
@@ -1656,7 +1656,7 @@ retry_find: | |||
1656 | put_page(page); | 1656 | put_page(page); |
1657 | goto retry_find; | 1657 | goto retry_find; |
1658 | } | 1658 | } |
1659 | VM_BUG_ON(page->index != offset); | 1659 | VM_BUG_ON_PAGE(page->index != offset, page); |
1660 | 1660 | ||
1661 | /* | 1661 | /* |
1662 | * We have a locked page in the page cache, now we need to check | 1662 | * We have a locked page in the page cache, now we need to check |