]> git.pld-linux.org Git - packages/kernel.git/commitdiff
- avoid 30s xfs hangs
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Fri, 2 Dec 2011 19:49:05 +0000 (19:49 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    kernel-small_fixes.patch -> 1.50

kernel-small_fixes.patch

index 2377438fc68859ba467deab7eab3465c77318965..d518ddb3ced1028ac6f82f9f4d086bb26a74927c 100644 (file)
@@ -296,3 +296,90 @@ index c2917ffa..34767a6 100644
 -- 
 1.7.4.1
 
+From: Christoph Hellwig <hch@lst.de>
+Date: Tue, 29 Nov 2011 18:06:14 +0000 (-0600)
+Subject: xfs: force buffer writeback before blocking on the ilock in inode reclaim
+X-Git-Url: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs%2Fxfs.git;a=commitdiff_plain;h=4dd2cb4a28b7ab1f37163a4eba280926a13a8749
+
+xfs: force buffer writeback before blocking on the ilock in inode reclaim
+
+If we are doing synchronous inode reclaim we block the VM from making
+progress in memory reclaim.  So if we encouter a flush locked inode
+promote it in the delwri list and wake up xfsbufd to write it out now.
+Without this we can get hangs of up to 30 seconds during workloads hitting
+synchronous inode reclaim.
+
+The scheme is copied from what we do for dquot reclaims.
+
+Reported-by: Simon Kirby <sim@hostway.ca>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Tested-by: Simon Kirby <sim@hostway.ca>
+Signed-off-by: Ben Myers <bpm@sgi.com>
+---
+
+diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
+index c0237c6..755ee81 100644
+--- a/fs/xfs/xfs_inode.c
++++ b/fs/xfs/xfs_inode.c
+@@ -2835,6 +2835,27 @@ corrupt_out:
+       return XFS_ERROR(EFSCORRUPTED);
+ }
++void
++xfs_promote_inode(
++      struct xfs_inode        *ip)
++{
++      struct xfs_buf          *bp;
++
++      ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
++
++      bp = xfs_incore(ip->i_mount->m_ddev_targp, ip->i_imap.im_blkno,
++                      ip->i_imap.im_len, XBF_TRYLOCK);
++      if (!bp)
++              return;
++
++      if (XFS_BUF_ISDELAYWRITE(bp)) {
++              xfs_buf_delwri_promote(bp);
++              wake_up_process(ip->i_mount->m_ddev_targp->bt_task);
++      }
++
++      xfs_buf_relse(bp);
++}
++
+ /*
+  * Return a pointer to the extent record at file index idx.
+  */
+diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
+index 760140d..b4cd473 100644
+--- a/fs/xfs/xfs_inode.h
++++ b/fs/xfs/xfs_inode.h
+@@ -498,6 +498,7 @@ int                xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
+ void          xfs_iext_realloc(xfs_inode_t *, int, int);
+ void          xfs_iunpin_wait(xfs_inode_t *);
+ int           xfs_iflush(xfs_inode_t *, uint);
++void          xfs_promote_inode(struct xfs_inode *);
+ void          xfs_lock_inodes(xfs_inode_t **, int, uint);
+ void          xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint);
+diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c
+index aa3dc1a..be5c51d 100644
+--- a/fs/xfs/xfs_sync.c
++++ b/fs/xfs/xfs_sync.c
+@@ -770,6 +770,17 @@ restart:
+       if (!xfs_iflock_nowait(ip)) {
+               if (!(sync_mode & SYNC_WAIT))
+                       goto out;
++
++              /*
++               * If we only have a single dirty inode in a cluster there is
++               * a fair chance that the AIL push may have pushed it into
++               * the buffer, but xfsbufd won't touch it until 30 seconds
++               * from now, and thus we will lock up here.
++               *
++               * Promote the inode buffer to the front of the delwri list
++               * and wake up xfsbufd now.
++               */
++              xfs_promote_inode(ip);
+               xfs_iflock(ip);
+       }
This page took 0.074102 seconds and 4 git commands to generate.