From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: Re: [Bug 18632] "INFO: task" dpkg "blocked for more than 120 seconds. Date: Sun, 19 Jun 2011 11:56:46 -0400 Message-ID: <20110619155646.GA6648@infradead.org> References: <20110609033217.GA10741@localhost> <20110609035426.GA12061@localhost> <20110609082718.GA10335@infradead.org> <20110609090906.GA19186@localhost> <20110609110214.GA9017@infradead.org> <20110609121117.GA5768@localhost> <20110609121742.GA29569@infradead.org> <20110609124315.GA8789@localhost> <20110609132357.GA9928@infradead.org> <20110610032149.GA7114@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Christoph Hellwig , Carlos Alberto Lopez Perez , Dave Chinner , Andrew Morton , Jan Kara , "linux-fsdevel@vger.kernel.org" , "bugzilla-daemon@bugzilla.kernel.org" , "daaugusto@gmail.com" , "kernel-bugzilla@cygnusx-1.org" , "listposter@gmail.com" , "justincase@yopmail.com" , Tao Ma , Jens Axboe , Vivek Goyal To: Wu Fengguang Return-path: Received: from 173-166-109-252-newengland.hfc.comcastbusiness.net ([173.166.109.252]:60867 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754078Ab1FSP5M (ORCPT ); Sun, 19 Jun 2011 11:57:12 -0400 Content-Disposition: inline In-Reply-To: <20110610032149.GA7114@localhost> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Fri, Jun 10, 2011 at 11:21:49AM +0800, Wu Fengguang wrote: > > Can you check if that helps with your livelock test case? (And yes, I > > should go and try it myself. Will do as soon as I'll get a bit more > > time). > > My pleasure. It's easier to compare results on the same test bed and > I've made it very convenient to test patches :) Here's one that should be even better, although in it's current form it break a subtile corner case of sync semantics, so it'll need more work if I go down that way: Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2011-06-17 14:16:18.442399481 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2011-06-18 17:55:44.864025123 +0200 @@ -359,14 +359,16 @@ xfs_quiesce_data( { int error, error2 = 0; - /* push non-blocking */ - xfs_sync_data(mp, 0); xfs_qm_sync(mp, SYNC_TRYLOCK); - - /* push and block till complete */ - xfs_sync_data(mp, SYNC_WAIT); xfs_qm_sync(mp, SYNC_WAIT); + /* flush all pending size updates and unwritten extent conversions */ + flush_workqueue(xfsconvertd_workqueue); + flush_workqueue(xfsdatad_workqueue); + + /* force out the newly dirtied log buffers */ + xfs_log_force(mp, XFS_LOG_SYNC); + /* write superblock and hoover up shutdown errors */ error = xfs_sync_fsdata(mp); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2011-06-18 17:51:05.660705925 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2011-06-18 17:52:50.107367305 +0200 @@ -929,45 +929,12 @@ xfs_fs_write_inode( * ->sync_fs call do that for thus, which reduces the number * of synchronous log foces dramatically. */ - xfs_ioend_wait(ip); xfs_ilock(ip, XFS_ILOCK_SHARED); - if (ip->i_update_core) { + if (ip->i_update_core) error = xfs_log_inode(ip); - if (error) - goto out_unlock; - } - } else { - /* - * We make this non-blocking if the inode is contended, return - * EAGAIN to indicate to the caller that they did not succeed. - * This prevents the flush path from blocking on inodes inside - * another operation right now, they get caught later by - * xfs_sync. - */ - if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) - goto out; - - if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) - goto out_unlock; - - /* - * Now we have the flush lock and the inode is not pinned, we - * can check if the inode is really clean as we know that - * there are no pending transaction completions, it is not - * waiting on the delayed write queue and there is no IO in - * progress. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - error = 0; - goto out_unlock; - } - error = xfs_iflush(ip, SYNC_TRYLOCK); + xfs_iunlock(ip, XFS_ILOCK_SHARED); } - out_unlock: - xfs_iunlock(ip, XFS_ILOCK_SHARED); - out: /* * if we failed to write out the inode then mark * it dirty again so we'll try again later.