aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_iget.c
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2012-03-22 01:15:10 -0400
committerBen Myers <bpm@sgi.com>2012-03-26 18:19:08 -0400
commit5132ba8f2b7705fb6b06fa6ad3d009233c816b67 (patch)
treee552a365b600af005abec13f3a1deb1f57bae3b9 /fs/xfs/xfs_iget.c
parentf616137519feb17b849894fcbe634a021d3fa7db (diff)
xfs: don't cache inodes read through bulkstat
When we read inodes via bulkstat, we generally only read them once and then throw them away - they never get used again. If we retain them in cache, then it simply causes the working set of inodes and other cached items to be reclaimed just so the inode cache can grow. Avoid this problem by marking inodes read by bulkstat not to be cached and check this flag in .drop_inode to determine whether the inode should be added to the VFS LRU or not. If the inode lookup hits an already cached inode, then don't set the flag. If the inode lookup hits an inode marked with no cache flag, remove the flag and allow it to be cached once the current reference goes away. Inodes marked as not cached will get cleaned up by the background inode reclaim or via memory pressure, so they will still generate some short term cache pressure. They will, however, be reclaimed much sooner and in preference to cache hot inodes. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_iget.c')
-rw-r--r--fs/xfs/xfs_iget.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
index a98cb4524e6c..bcc6c249b2c7 100644
--- a/fs/xfs/xfs_iget.c
+++ b/fs/xfs/xfs_iget.c
@@ -289,7 +289,7 @@ xfs_iget_cache_hit(
289 if (lock_flags != 0) 289 if (lock_flags != 0)
290 xfs_ilock(ip, lock_flags); 290 xfs_ilock(ip, lock_flags);
291 291
292 xfs_iflags_clear(ip, XFS_ISTALE); 292 xfs_iflags_clear(ip, XFS_ISTALE | XFS_IDONTCACHE);
293 XFS_STATS_INC(xs_ig_found); 293 XFS_STATS_INC(xs_ig_found);
294 294
295 return 0; 295 return 0;
@@ -314,6 +314,7 @@ xfs_iget_cache_miss(
314 struct xfs_inode *ip; 314 struct xfs_inode *ip;
315 int error; 315 int error;
316 xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ino); 316 xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ino);
317 int iflags;
317 318
318 ip = xfs_inode_alloc(mp, ino); 319 ip = xfs_inode_alloc(mp, ino);
319 if (!ip) 320 if (!ip)
@@ -358,8 +359,11 @@ xfs_iget_cache_miss(
358 * memory barrier that ensures this detection works correctly at lookup 359 * memory barrier that ensures this detection works correctly at lookup
359 * time. 360 * time.
360 */ 361 */
362 iflags = XFS_INEW;
363 if (flags & XFS_IGET_DONTCACHE)
364 iflags |= XFS_IDONTCACHE;
361 ip->i_udquot = ip->i_gdquot = NULL; 365 ip->i_udquot = ip->i_gdquot = NULL;
362 xfs_iflags_set(ip, XFS_INEW); 366 xfs_iflags_set(ip, iflags);
363 367
364 /* insert the new inode */ 368 /* insert the new inode */
365 spin_lock(&pag->pag_ici_lock); 369 spin_lock(&pag->pag_ici_lock);