Date: Sun, 02 Apr 2006 20:48:51 +0000 (UTC) From: Tor Egge <Tor.Egge@cvsup.no.freebsd.org> To: peter@holm.cc Cc: truckman@freebsd.org, current@freebsd.org Subject: Re: Livelock / softdep_flush "loop" Message-ID: <20060402.204851.78799557.Tor.Egge@cvsup.no.freebsd.org> In-Reply-To: <20060402190910.GA12759@peter.osted.lan> References: <20060402094431.GA81954@peter.osted.lan> <20060402.180153.74658240.Tor.Egge@cvsup.no.freebsd.org> <20060402190910.GA12759@peter.osted.lan>
next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Sun_Apr__2_20:48:51_2006_162)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit > > The enclosed patch might help. > > > > I'm testing it right now. Similarly to the softdepflush process looping in softdep_flush(), the process creating a snapshot might loop in ffs_sync(). - Tor Egge ----Next_Part(Sun_Apr__2_20:48:51_2006_162)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="softdep2.diff2" Index: sys/ufs/ffs/ffs_softdep.c =================================================================== RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_softdep.c,v retrieving revision 1.193 diff -u -r1.193 ffs_softdep.c --- sys/ufs/ffs/ffs_softdep.c 12 Mar 2006 05:25:16 -0000 1.193 +++ sys/ufs/ffs/ffs_softdep.c 2 Apr 2006 20:20:15 -0000 @@ -718,6 +718,7 @@ { struct mount *nmp; struct mount *mp; + struct ufsmount *ump; struct thread *td; int remaining; int vfslocked; @@ -752,7 +753,9 @@ continue; vfslocked = VFS_LOCK_GIANT(mp); softdep_process_worklist(mp, 0); - remaining += VFSTOUFS(mp)->softdep_on_worklist; + ump = VFSTOUFS(mp); + remaining += ump->softdep_on_worklist - + ump->softdep_on_worklist_inprogress; VFS_UNLOCK_GIANT(vfslocked); mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); @@ -914,11 +917,17 @@ if ((flags & LK_NOWAIT) == 0 || wk->wk_type != D_DIRREM) break; wk->wk_state |= INPROGRESS; + ump->softdep_on_worklist_inprogress++; FREE_LOCK(&lk); ffs_vget(mp, WK_DIRREM(wk)->dm_oldinum, LK_NOWAIT | LK_EXCLUSIVE, &vp); ACQUIRE_LOCK(&lk); wk->wk_state &= ~INPROGRESS; + if (--ump->softdep_on_worklist_inprogress == 0 && + ump->softdep_on_worklist_inprogress_req != 0) { + ump->softdep_on_worklist_inprogress_req = 0; + wakeup(&ump->softdep_on_worklist_inprogress); + } if (vp != NULL) break; } @@ -6099,6 +6108,17 @@ VI_LOCK(devvp); continue; } + if (ump->softdep_on_worklist_inprogress != 0) { + VI_UNLOCK(devvp); + ump->softdep_on_worklist_inprogress_req = 1; + msleep(&ump->softdep_on_worklist_inprogress, + &lk, + (PUSER - 1) | PDROP, + "sdipdr" /* soft dep in progress drain */, + 0); + VI_LOCK(devvp); + continue; + } if (!MNT_ITRYLOCK(mp)) { FREE_LOCK(&lk); VI_UNLOCK(devvp); Index: sys/ufs/ufs/ufsmount.h =================================================================== RCS file: /home/ncvs/src/sys/ufs/ufs/ufsmount.h,v retrieving revision 1.36 diff -u -r1.36 ufsmount.h --- sys/ufs/ufs/ufsmount.h 8 Mar 2006 23:43:39 -0000 1.36 +++ sys/ufs/ufs/ufsmount.h 2 Apr 2006 20:20:15 -0000 @@ -76,6 +76,8 @@ struct workhead softdep_workitem_pending; /* softdep work queue */ struct worklist *softdep_worklist_tail; /* Tail pointer for above */ int softdep_on_worklist; /* Items on the worklist */ + int softdep_on_worklist_inprogress; /* Busy items on worklist */ + int softdep_on_worklist_inprogress_req;/* Wakeup when not busy */ int softdep_deps; /* Total dependency count */ int softdep_accdeps; /* accumulated dep count */ int softdep_req; /* Wakeup when deps hits 0. */ ----Next_Part(Sun_Apr__2_20:48:51_2006_162)----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060402.204851.78799557.Tor.Egge>