android_kernel_oneplus_msm8998/fs/xfs
Dave Chinner b223221956 xfs: ensure reclaim cursor is reset correctly at end of AG
On a 32 bit highmem PowerPC machine, the XFS inode cache was growing
without bound and exhausting low memory causing the OOM killer to be
triggered. After some effort, the problem was reproduced on a 32 bit
x86 highmem machine.

The problem is that the per-ag inode reclaim index cursor was not
getting reset to the start of the AG if the radix tree tag lookup
found no more reclaimable inodes. Hence every further reclaim
attempt started at the same index beyond where any reclaimable
inodes lay, and no further background reclaim ever occurred from the
AG.

Without background inode reclaim the VM driven cache shrinker
simply cannot keep up with cache growth, and OOM is the result.

While the change that exposed the problem was the conversion of the
inode reclaim to use work queues for background reclaim, it was not
the cause of the bug. The bug was introduced when the cursor code
was added, just waiting for some weird configuration to strike....

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Tested-By: Christian Kujau <lists@nerdbynature.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Alex Elder <aelder@sgi.com>
2011-05-09 12:17:03 -05:00
..
linux-2.6 xfs: ensure reclaim cursor is reset correctly at end of AG 2011-05-09 12:17:03 -05:00
quota Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 2011-04-11 15:48:57 -07:00
support xfs: kill support/debug.[ch] 2011-03-07 10:09:35 +11:00
Kconfig
Makefile Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 2011-03-21 14:24:56 -07:00
xfs.h
xfs_acl.h fs: provide rcu-walk aware permission i_ops 2011-01-07 17:50:29 +11:00
xfs_ag.h xfs: exact busy extent tracking 2011-04-28 13:18:04 -05:00
xfs_alloc.c xfs: reduce the number of pagb_lock roundtrips in xfs_alloc_clear_busy 2011-04-28 13:18:09 -05:00
xfs_alloc.h xfs: reduce the number of pagb_lock roundtrips in xfs_alloc_clear_busy 2011-04-28 13:18:09 -05:00
xfs_alloc_btree.c xfs: exact busy extent tracking 2011-04-28 13:18:04 -05:00
xfs_alloc_btree.h
xfs_arch.h
xfs_attr.c
xfs_attr.h
xfs_attr_leaf.c
xfs_attr_leaf.h
xfs_attr_sf.h
xfs_bit.c
xfs_bit.h
xfs_bmap.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_bmap.h
xfs_bmap_btree.c
xfs_bmap_btree.h
xfs_btree.c
xfs_btree.h
xfs_btree_trace.c
xfs_btree_trace.h
xfs_buf_item.c Fix common misspellings 2011-03-31 11:26:23 -03:00
xfs_buf_item.h
xfs_da_btree.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_da_btree.h
xfs_dfrag.c xfs: cleanup duplicate initializations 2011-04-28 13:25:29 -05:00
xfs_dfrag.h
xfs_dinode.h
xfs_dir2.c xfs: convert xfs_fs_cmn_err to new error logging API 2011-03-07 10:05:35 +11:00
xfs_dir2.h
xfs_dir2_block.c
xfs_dir2_block.h
xfs_dir2_data.c
xfs_dir2_data.h
xfs_dir2_leaf.c
xfs_dir2_leaf.h
xfs_dir2_node.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_dir2_node.h
xfs_dir2_sf.c
xfs_dir2_sf.h
xfs_error.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_error.h xfs: kill support/debug.[ch] 2011-03-07 10:09:35 +11:00
xfs_extfree_item.c xfs: fix efi item leak on forced shutdown 2011-01-28 09:01:33 -06:00
xfs_extfree_item.h
xfs_filestream.c
xfs_filestream.h
xfs_fs.h
xfs_fsops.c xfs: convert xfs_fs_cmn_err to new error logging API 2011-03-07 10:05:35 +11:00
xfs_fsops.h xfs: ensure log covering transactions are synchronous 2011-01-11 20:28:17 -06:00
xfs_ialloc.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_ialloc.h
xfs_ialloc_btree.c
xfs_ialloc_btree.h
xfs_iget.c Merge branch 'master' into for-linus-merged 2011-01-10 21:35:55 -06:00
xfs_inode.c Fix common misspellings 2011-03-31 11:26:23 -03:00
xfs_inode.h Fix common misspellings 2011-03-31 11:26:23 -03:00
xfs_inode_item.c xfs: cleanup duplicate initializations 2011-04-28 13:25:29 -05:00
xfs_inode_item.h
xfs_inum.h
xfs_iomap.c xfs: rename xfs_cmn_err_fsblock_zero() 2011-03-07 10:06:35 +11:00
xfs_iomap.h
xfs_itable.c xfs: fix variable set but not used warnings 2011-04-08 08:09:12 -05:00
xfs_itable.h
xfs_log.c xfs: exact busy extent tracking 2011-04-28 13:18:04 -05:00
xfs_log.h xfs: exact busy extent tracking 2011-04-28 13:18:04 -05:00
xfs_log_cil.c xfs: reduce the number of pagb_lock roundtrips in xfs_alloc_clear_busy 2011-04-28 13:18:09 -05:00
xfs_log_priv.h xfs: exact busy extent tracking 2011-04-28 13:18:04 -05:00
xfs_log_recover.c Fix common misspellings 2011-03-31 11:26:23 -03:00
xfs_log_recover.h
xfs_mount.c xfs: cleanup duplicate initializations 2011-04-28 13:25:29 -05:00
xfs_mount.h xfs: introduce background inode reclaim work 2011-04-08 12:45:07 +10:00
xfs_mru_cache.c xfs: convert to alloc_workqueue() 2011-02-01 11:42:43 +01:00
xfs_mru_cache.h
xfs_quota.h xfs: Convert xlog_warn to new logging interface 2011-03-07 10:01:35 +11:00
xfs_rename.c
xfs_rtalloc.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_rtalloc.h xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_rw.c xfs: Convert remaining cmn_err() callers to new API 2011-03-07 10:08:35 +11:00
xfs_rw.h
xfs_sb.h
xfs_trans.c xfs: reduce the number of pagb_lock roundtrips in xfs_alloc_clear_busy 2011-04-28 13:18:09 -05:00
xfs_trans.h xfs: more sensible inode refcounting for ialloc 2011-02-22 20:32:28 -06:00
xfs_trans_ail.c xfs: push the AIL from memory reclaim and periodic sync 2011-04-08 12:45:07 +10:00
xfs_trans_buf.c xfs: xfs_trans_read_buf() should return an error on failure 2011-03-26 09:14:44 +11:00
xfs_trans_extfree.c
xfs_trans_inode.c Fix common misspellings 2011-03-31 11:26:23 -03:00
xfs_trans_priv.h xfs: push the AIL from memory reclaim and periodic sync 2011-04-08 12:45:07 +10:00
xfs_trans_space.h
xfs_types.h xfs: exact busy extent tracking 2011-04-28 13:18:04 -05:00
xfs_utils.c
xfs_utils.h
xfs_vnodeops.c Fix common misspellings 2011-03-31 11:26:23 -03:00
xfs_vnodeops.h xfs: preallocation transactions do not need to be synchronous 2011-03-26 09:13:08 +11:00