Author: arekm Date: Fri Dec 2 19:46:29 2011 GMT Module: packages Tag: LINUX_3_0 ---- Log message: - avoid 30s xfs hangs
---- Files affected: packages/kernel: kernel-small_fixes.patch (1.43.2.9 -> 1.43.2.10) ---- Diffs: ================================================================ Index: packages/kernel/kernel-small_fixes.patch diff -u packages/kernel/kernel-small_fixes.patch:1.43.2.9 packages/kernel/kernel-small_fixes.patch:1.43.2.10 --- packages/kernel/kernel-small_fixes.patch:1.43.2.9 Sun Nov 27 15:14:00 2011 +++ packages/kernel/kernel-small_fixes.patch Fri Dec 2 20:46:24 2011 @@ -1077,3 +1077,90 @@ -- 1.7.4.1 +From: Christoph Hellwig <[email protected]> +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 <[email protected]> +Signed-off-by: Christoph Hellwig <[email protected]> +Tested-by: Simon Kirby <[email protected]> +Signed-off-by: Ben Myers <[email protected]> +--- + +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/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c +index aa3dc1a..be5c51d 100644 +--- a/fs/xfs/linux-2.6/xfs_sync.c ++++ b/fs/xfs/linux-2.6/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); + } + ================================================================ ---- CVS-web: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-small_fixes.patch?r1=1.43.2.9&r2=1.43.2.10&f=u _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
