• Hugh Dickins's avatar
    mm: __delete_from_page_cache show Bad page if mapped · 06b241f3
    Hugh Dickins authored
    Commit e1534ae9 ("mm: differentiate page_mapped() from
    page_mapcount() for compound pages") changed the famous
    BUG_ON(page_mapped(page)) in __delete_from_page_cache() to
    VM_BUG_ON_PAGE(page_mapped(page)): which gives us more info when
    CONFIG_DEBUG_VM=y, but nothing at all when not.
    
    Although it has not usually been very helpul, being hit long after the
    error in question, we do need to know if it actually happens on users'
    systems; but reinstating a crash there is likely to be opposed :)
    
    In the non-debug case, pr_alert("BUG: Bad page cache") plus dump_page(),
    dump_stack(), add_taint() - I don't really believe LOCKDEP_NOW_UNRELIABLE,
    but that seems to be the standard procedure now.  Move that, or the
    VM_BUG_ON_PAGE(), up before the deletion from tree: so that the
    unNULLified page->mapping gives a little more information.
    
    If the inode is being evicted (rather than truncated), it won't have any
    vmas left, so it's safe(ish) to assume that the raised mapcount is
    erroneous, and we can discount it from page_count to avoid leaking the
    page (I'm less worried by leaking the occasional 4kB, than losing a
    potential 2MB page with each 4kB page leaked).
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Sasha Levin <sasha.levin@oracle.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    06b241f3
filemap.c 74.8 KB