• Jan Kara's avatar
    mm: fix assertion mapping->nrpages == 0 in end_writeback() · 08142579
    Jan Kara authored
    Under heavy memory and filesystem load, users observe the assertion
    mapping->nrpages == 0 in end_writeback() trigger.  This can be caused by
    page reclaim reclaiming the last page from a mapping in the following
    race:
    
    	CPU0				CPU1
      ...
      shrink_page_list()
        __remove_mapping()
          __delete_from_page_cache()
            radix_tree_delete()
    					evict_inode()
    					  truncate_inode_pages()
    					    truncate_inode_pages_range()
    					      pagevec_lookup() - finds nothing
    					  end_writeback()
    					    mapping->nrpages != 0 -> BUG
            page->mapping = NULL
            mapping->nrpages--
    
    Fix the problem by doing a reliable check of mapping->nrpages under
    mapping->tree_lock in end_writeback().
    
    Analyzed by Jay <jinshan.xiong@whamcloud.com>, lost in LKML, and dug out
    by Miklos Szeredi <mszeredi@suse.de>.
    
    Cc: Jay <jinshan.xiong@whamcloud.com>
    Cc: Miklos Szeredi <mszeredi@suse.de>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    08142579
truncate.c 17.8 KB