Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Nov 2007 23:41:31 +0100
From:      Kris Kennaway <kris@FreeBSD.org>
To:        Kris Kennaway <kris@FreeBSD.org>
Cc:        Attilio Rao <attilio@freebsd.org>, freebsd-stable@freebsd.org, Alexey Popov <lol@chistydom.ru>
Subject:   Re: 2 x quad-core system is slower that 2 x dual core on FreeBSD
Message-ID:  <4743629B.9090408@FreeBSD.org>
In-Reply-To: <474339E9.4080301@FreeBSD.org>
References:  <4741905E.8050300@chistydom.ru>	<fhs3s5$knj$1@ger.gmane.org>	<47419AB3.5030008@chistydom.ru>	<fhs7hp$2es$2@ger.gmane.org> <4741A7DA.2050706@chistydom.ru> <4741DA15.9000308@FreeBSD.org> <47429DB8.7040504@chistydom.ru> <4742ADFE.40902@FreeBSD.org> <4742C46A.1060701@chistydom.ru> <47432F77.3030606@FreeBSD.org> <474339E9.4080301@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------090206040000020400040605
Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

Kris Kennaway wrote:
> Kris Kennaway wrote:
>> In the meantime there is unfortunately not a lot that can be done, 
>> AFAICT.  There is one hack that I will send you later but it is not 
>> likely to help much.  I will also think about how to track down the 
>> cause of the contention further (the profiling trace only shows that 
>> it comes mostly from vget/vput but doesn't show where these are called 
>> from).
> 
> Actually this patch might help.  It doesn't replace lockmgr but it does 
> fix a silly thundering herd behaviour.  It probably needs some 
> adjustment to get it to apply cleanly (it is about 7 months old), and I 
> apparently stopped using it because I ran into deadlocks.  It might be 
> stable enough to at least see how much it helps.
> 
> Set the vfs.lookup_shared=1 sysctl to enable the other half of the patch.
> 
> Kris
> 

Try this one instead, it applies to HEAD.  You'll need to manually enter 
the paths though because of how p4 mangles diffs.

Kris

--------------090206040000020400040605
Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0";
	name="lockmgr.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="lockmgr.diff"

==== //depot/user/kris/contention/sys/kern/kern_lock.c#10 - /zoo/kris/contention/kern/kern_lock.c ====
@@ -109,7 +109,6 @@
 #define LK_ALL (LK_HAVE_EXCL | LK_WANT_EXCL | LK_WANT_UPGRADE | \
 	LK_SHARE_NONZERO | LK_WAIT_NONZERO)
 
-static int acquire(struct lock **lkpp, int extflags, int wanted, int *contested, uint64_t *waittime);
 static int acquiredrain(struct lock *lkp, int extflags) ;
 
 static __inline void
@@ -126,61 +125,17 @@
 
 	COUNT(td, -decr);
 	if (lkp->lk_sharecount == decr) {
-		lkp->lk_flags &= ~LK_SHARE_NONZERO;
-		if (lkp->lk_flags & (LK_WANT_UPGRADE | LK_WANT_EXCL)) {
-			wakeup(lkp);
-		}
+		if (lkp->lk_exclusivewait != 0)
+			wakeup_one(&lkp->lk_exclusivewait);
 		lkp->lk_sharecount = 0;
 	} else {
 		lkp->lk_sharecount -= decr;
+		if (lkp->lk_sharecount == 1 && lkp->lk_flags & LK_WANT_UPGRADE)
+			wakeup(&lkp->lk_flags);
 	}
 }
 
-static int
-acquire(struct lock **lkpp, int extflags, int wanted, int *contested, uint64_t *waittime)
-{
-	struct lock *lkp = *lkpp;
-	int error;
-	CTR3(KTR_LOCK,
-	    "acquire(): lkp == %p, extflags == 0x%x, wanted == 0x%x",
-	    lkp, extflags, wanted);
 
-	if ((extflags & LK_NOWAIT) && (lkp->lk_flags & wanted))
-		return EBUSY;
-	error = 0;
-	if ((lkp->lk_flags & wanted) != 0)
-		lock_profile_obtain_lock_failed(&lkp->lk_object, contested, waittime);
-	
-	while ((lkp->lk_flags & wanted) != 0) {
-		CTR2(KTR_LOCK,
-		    "acquire(): lkp == %p, lk_flags == 0x%x sleeping",
-		    lkp, lkp->lk_flags);
-		lkp->lk_flags |= LK_WAIT_NONZERO;
-		lkp->lk_waitcount++;
-		error = msleep(lkp, lkp->lk_interlock, lkp->lk_prio,
-		    lkp->lk_wmesg, 
-		    ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
-		lkp->lk_waitcount--;
-		if (lkp->lk_waitcount == 0)
-			lkp->lk_flags &= ~LK_WAIT_NONZERO;
-		if (error)
-			break;
-		if (extflags & LK_SLEEPFAIL) {
-			error = ENOLCK;
-			break;
-		}
-		if (lkp->lk_newlock != NULL) {
-			mtx_lock(lkp->lk_newlock->lk_interlock);
-			mtx_unlock(lkp->lk_interlock);
-			if (lkp->lk_waitcount == 0)
-				wakeup((void *)(&lkp->lk_newlock));
-			*lkpp = lkp = lkp->lk_newlock;
-		}
-	}
-	mtx_assert(lkp->lk_interlock, MA_OWNED);
-	return (error);
-}
-
 /*
  * Set, change, or release a lock.
  *
@@ -189,16 +144,16 @@
  * accepted shared locks and shared-to-exclusive upgrades to go away.
  */
 int
-_lockmgr(struct lock *lkp, u_int flags, struct mtx *interlkp, 
-	 struct thread *td, char *file, int line)
-
+lockmgr(lkp, flags, interlkp, td)
+	struct lock *lkp;
+	u_int flags;
+	struct mtx *interlkp;
+	struct thread *td;
 {
 	int error;
 	struct thread *thr;
-	int extflags, lockflags;
-	int contested = 0;
-	uint64_t waitstart = 0;
-	
+	int extflags;
+
 	error = 0;
 	if (td == NULL)
 		thr = LK_KERNPROC;
@@ -226,7 +181,7 @@
 
 	if ((flags & (LK_NOWAIT|LK_RELEASE)) == 0)
 		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK,
-		    &lkp->lk_interlock->lock_object,
+		    &lkp->lk_interlock->mtx_object,
 		    "Acquiring lockmgr lock \"%s\"", lkp->lk_wmesg);
 
 	if (panicstr != NULL) {
@@ -253,16 +208,30 @@
 		 * lock itself ).
 		 */
 		if (lkp->lk_lockholder != thr) {
-			lockflags = LK_HAVE_EXCL;
-			if (td != NULL && !(td->td_pflags & TDP_DEADLKTREAT))
-				lockflags |= LK_WANT_EXCL | LK_WANT_UPGRADE;
-			error = acquire(&lkp, extflags, lockflags, &contested, &waitstart);
-			if (error)
+			
+			while (lkp->lk_exclusivecount != 0 /*  ||
+			    (!(td->td_pflags & TDP_DEADLKTREAT) && 
+				(lkp->lk_flags & LK_WANT_UPGRADE)) */) {
+				lkp->lk_sharewait++;
+			       	error = msleep(&lkp->lk_sharewait, lkp->lk_interlock,
+				    lkp->lk_prio,lkp->lk_wmesg, 
+				    ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
+			
+				if (error)
+					break;
+				if (extflags & LK_SLEEPFAIL) {
+					error = ENOLCK;
+					break;
+				}
+
+				lkp->lk_sharewait--;
+			}
+
+			if (error != 0) {
+				shareunlock(td,lkp,0);
 				break;
+			}
 			sharelock(td, lkp, 1);
-			if (lkp->lk_sharecount == 1)
-				lock_profile_obtain_lock_success(&lkp->lk_object, contested, waitstart, file, line);
-
 #if defined(DEBUG_LOCKS)
 			stack_save(&lkp->lk_stack);
 #endif
@@ -273,8 +242,6 @@
 		 * An alternative would be to fail with EDEADLK.
 		 */
 		sharelock(td, lkp, 1);
-		if (lkp->lk_sharecount == 1)
-			lock_profile_obtain_lock_success(&lkp->lk_object, contested, waitstart, file, line);
 		/* FALLTHROUGH downgrade */
 
 	case LK_DOWNGRADE:
@@ -285,10 +252,9 @@
 		sharelock(td, lkp, lkp->lk_exclusivecount);
 		COUNT(td, -lkp->lk_exclusivecount);
 		lkp->lk_exclusivecount = 0;
-		lkp->lk_flags &= ~LK_HAVE_EXCL;
 		lkp->lk_lockholder = LK_NOPROC;
-		if (lkp->lk_waitcount)
-			wakeup((void *)lkp);
+		if (lkp->lk_sharewait)
+			wakeup((void *)&lkp->lk_sharewait);
 		break;
 
 	case LK_EXCLUPGRADE:
@@ -317,15 +283,13 @@
 			panic("lockmgr: upgrade exclusive lock");
 		if (lkp->lk_sharecount <= 0)
 			panic("lockmgr: upgrade without shared");
-		shareunlock(td, lkp, 1);
-		if (lkp->lk_sharecount == 0)
-			lock_profile_release_lock(&lkp->lk_object);
 		/*
 		 * If we are just polling, check to see if we will block.
 		 */
 		if ((extflags & LK_NOWAIT) &&
 		    ((lkp->lk_flags & LK_WANT_UPGRADE) ||
 		     lkp->lk_sharecount > 1)) {
+			shareunlock(td, lkp, 1);
 			error = EBUSY;
 			break;
 		}
@@ -336,34 +300,43 @@
 			 * drop to zero, then take exclusive lock.
 			 */
 			lkp->lk_flags |= LK_WANT_UPGRADE;
-			error = acquire(&lkp, extflags, LK_SHARE_NONZERO, &contested, &waitstart);
+
+			while(lkp->lk_sharecount != 1) {
+
+				error = msleep(&lkp->lk_flags, lkp->lk_interlock,
+				    lkp->lk_prio,lkp->lk_wmesg, 
+				    ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
+			
+				if (error)
+					break;
+				if (extflags & LK_SLEEPFAIL) {
+					error = ENOLCK;
+					break;
+				}
+			}
+
 			lkp->lk_flags &= ~LK_WANT_UPGRADE;
 
 			if (error) {
-			         if ((lkp->lk_flags & ( LK_WANT_EXCL | LK_WAIT_NONZERO)) == (LK_WANT_EXCL | LK_WAIT_NONZERO))
-			                   wakeup((void *)lkp);
+				shareunlock(td, lkp, 1);
+				if (lkp->lk_sharewait)
+					wakeup(&lkp->lk_sharewait);
 			         break;
 			}
+
 			if (lkp->lk_exclusivecount != 0)
 				panic("lockmgr: non-zero exclusive count");
-			lkp->lk_flags |= LK_HAVE_EXCL;
 			lkp->lk_lockholder = thr;
 			lkp->lk_exclusivecount = 1;
+			lkp->lk_sharecount = 0;	
 			COUNT(td, 1);
-			lock_profile_obtain_lock_success(&lkp->lk_object, contested, waitstart, file, line);
 #if defined(DEBUG_LOCKS)
 			stack_save(&lkp->lk_stack);
 #endif
 			break;
 		}
-		/*
-		 * Someone else has requested upgrade. Release our shared
-		 * lock, awaken upgrade requestor if we are the last shared
-		 * lock, then request an exclusive lock.
-		 */
-		if ( (lkp->lk_flags & (LK_SHARE_NONZERO|LK_WAIT_NONZERO)) ==
-			LK_WAIT_NONZERO)
-			wakeup((void *)lkp);
+
+		shareunlock(td, lkp, 1);
 		/* FALLTHROUGH exclusive request */
 
 	case LK_EXCLUSIVE:
@@ -379,38 +352,52 @@
 				break;
 			}
 		}
-		/*
-		 * If we are just polling, check to see if we will sleep.
-		 */
-		if ((extflags & LK_NOWAIT) &&
-		    (lkp->lk_flags & (LK_HAVE_EXCL | LK_WANT_EXCL | LK_WANT_UPGRADE | LK_SHARE_NONZERO))) {
-			error = EBUSY;
-			break;
+
+	
+		if (lkp->lk_exclusivecount != 0 || lkp->lk_sharecount != 0) {
+
+
+			/*
+			 * If we are just polling, check to see if we will sleep.
+			 */
+			if (extflags & LK_NOWAIT) {
+				error = EBUSY;
+				break;
+			}
+
+			lkp->lk_exclusivewait++;
+
+			while(lkp->lk_exclusivecount != 0 || lkp->lk_sharecount != 0) {
+				error = msleep(&lkp->lk_exclusivewait, lkp->lk_interlock,
+				    lkp->lk_prio,lkp->lk_wmesg, 
+				    ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
+			
+				if (error)
+					break;
+				if (extflags & LK_SLEEPFAIL) {
+					error = ENOLCK;
+					break;
+				}
+
+			}
+			lkp->lk_exclusivewait--;
+		
+			if(error) {
+				if (lkp->lk_exclusivewait != 0)
+					wakeup(&lkp->lk_exclusivewait);
+				else if  (lkp->lk_sharewait != 0)
+					wakeup(&lkp->lk_sharewait);
+	
+				break;
+			}
 		}
-		/*
-		 * Try to acquire the want_exclusive flag.
-		 */
-		error = acquire(&lkp, extflags, (LK_HAVE_EXCL | LK_WANT_EXCL), &contested, &waitstart);
-		if (error)
-			break;
-		lkp->lk_flags |= LK_WANT_EXCL;
-		/*
-		 * Wait for shared locks and upgrades to finish.
-		 */
-		error = acquire(&lkp, extflags, LK_HAVE_EXCL | LK_WANT_UPGRADE | LK_SHARE_NONZERO, &contested, &waitstart);
-		lkp->lk_flags &= ~LK_WANT_EXCL;
-		if (error) {
-			if (lkp->lk_flags & LK_WAIT_NONZERO)		
-			         wakeup((void *)lkp);
-			break;
-		}	
-		lkp->lk_flags |= LK_HAVE_EXCL;
+
+
 		lkp->lk_lockholder = thr;
 		if (lkp->lk_exclusivecount != 0)
 			panic("lockmgr: non-zero exclusive count");
 		lkp->lk_exclusivecount = 1;
 		COUNT(td, 1);
-		lock_profile_obtain_lock_success(&lkp->lk_object, contested, waitstart, file, line);
 #if defined(DEBUG_LOCKS)
 		stack_save(&lkp->lk_stack);
 #endif
@@ -427,23 +414,21 @@
 			if (lkp->lk_lockholder != LK_KERNPROC)
 				COUNT(td, -1);
 			if (lkp->lk_exclusivecount == 1) {
-				lkp->lk_flags &= ~LK_HAVE_EXCL;
 				lkp->lk_lockholder = LK_NOPROC;
 				lkp->lk_exclusivecount = 0;
-				lock_profile_release_lock(&lkp->lk_object);
+				if (lkp->lk_sharewait)
+					wakeup(&lkp->lk_sharewait);
+				else if (lkp->lk_exclusivewait)
+					wakeup_one(&lkp->lk_exclusivewait);
 			} else {
 				lkp->lk_exclusivecount--;
 			}
-		} else if (lkp->lk_flags & LK_SHARE_NONZERO)
+		} else if (lkp->lk_sharecount != 0)
 			shareunlock(td, lkp, 1);
-		else  {
-			printf("lockmgr: thread %p unlocking unheld lock\n",
-			    thr);
-			kdb_backtrace();
-		}
-
-		if (lkp->lk_flags & LK_WAIT_NONZERO)
-			wakeup((void *)lkp);
+		else 
+			panic("lockmgr: thread %p, not holding a lock",
+				    thr);	
+	
 		break;
 
 	case LK_DRAIN:
@@ -459,7 +444,7 @@
 		error = acquiredrain(lkp, extflags);
 		if (error)
 			break;
-		lkp->lk_flags |= LK_DRAINING | LK_HAVE_EXCL;
+		lkp->lk_flags |= LK_DRAINING;
 		lkp->lk_lockholder = thr;
 		lkp->lk_exclusivecount = 1;
 		COUNT(td, 1);
@@ -475,8 +460,10 @@
 		/* NOTREACHED */
 	}
 	if ((lkp->lk_flags & LK_WAITDRAIN) &&
-	    (lkp->lk_flags & (LK_HAVE_EXCL | LK_WANT_EXCL | LK_WANT_UPGRADE |
-		LK_SHARE_NONZERO | LK_WAIT_NONZERO)) == 0) {
+	    (lkp->lk_sharewait == 0) &&
+	    (lkp->lk_exclusivewait == 0) &&
+	    (lkp->lk_sharecount== 0) &&
+	    (lkp->lk_exclusivecount== 0)) {
 		lkp->lk_flags &= ~LK_WAITDRAIN;
 		wakeup((void *)&lkp->lk_flags);
 	}
@@ -488,10 +475,14 @@
 acquiredrain(struct lock *lkp, int extflags) {
 	int error;
 
-	if ((extflags & LK_NOWAIT) && (lkp->lk_flags & LK_ALL)) {
-		return EBUSY;
-	}
-	while (lkp->lk_flags & LK_ALL) {
+
+	while ((lkp->lk_sharecount != 0) ||
+	    (lkp->lk_sharewait != 0) ||
+	    (lkp->lk_exclusivecount != 0) ||
+	    (lkp->lk_exclusivewait != 0)) {
+			
+		if (extflags & LK_NOWAIT) return EBUSY;
+
 		lkp->lk_flags |= LK_WAITDRAIN;
 		error = msleep(&lkp->lk_flags, lkp->lk_interlock, lkp->lk_prio,
 			lkp->lk_wmesg, 
@@ -505,34 +496,7 @@
 	return 0;
 }
 
-/*
- * Transfer any waiting processes from one lock to another.
- */
-void
-transferlockers(from, to)
-	struct lock *from;
-	struct lock *to;
-{
 
-	KASSERT(from != to, ("lock transfer to self"));
-	KASSERT((from->lk_flags&LK_WAITDRAIN) == 0, ("transfer draining lock"));
-
-	mtx_lock(from->lk_interlock);
-	if (from->lk_waitcount == 0) {
-		mtx_unlock(from->lk_interlock);
-		return;
-	}
-	from->lk_newlock = to;
-	wakeup((void *)from);
-	msleep(&from->lk_newlock, from->lk_interlock, from->lk_prio,
-	    "lkxfer", 0);
-	from->lk_newlock = NULL;
-	from->lk_flags &= ~(LK_WANT_EXCL | LK_WANT_UPGRADE);
-	KASSERT(from->lk_waitcount == 0, ("active lock"));
-	mtx_unlock(from->lk_interlock);
-}
-
-
 /*
  * Initialize a lock; required before use.
  */
@@ -550,12 +514,13 @@
 	lkp->lk_interlock = mtx_pool_alloc(mtxpool_lockbuilder);
 	lkp->lk_flags = (flags & LK_EXTFLG_MASK);
 	lkp->lk_sharecount = 0;
-	lkp->lk_waitcount = 0;
+	lkp->lk_sharewait = 0;
 	lkp->lk_exclusivecount = 0;
+	lkp->lk_exclusivewait = 0;
 	lkp->lk_prio = prio;
 	lkp->lk_timo = timo;
+	lkp->lk_wmesg = wmesg;
 	lkp->lk_lockholder = LK_NOPROC;
-	lkp->lk_newlock = NULL;
 #ifdef DEBUG_LOCKS
 	stack_zero(&lkp->lk_stack);
 #endif
@@ -614,7 +579,8 @@
 	int count;
 
 	mtx_lock(lkp->lk_interlock);
-	count = lkp->lk_exclusivecount + lkp->lk_sharecount;
+	count = lkp->lk_exclusivecount + 
+		lkp->lk_sharecount;
 	mtx_unlock(lkp->lk_interlock);
 	return (count);
 }
@@ -629,7 +595,9 @@
 	int count;
 
 	mtx_lock(lkp->lk_interlock);
-	count = lkp->lk_waitcount;
+	count = lkp->lk_exclusivewait + 
+		lkp->lk_sharewait + 
+		(lkp->lk_flags & LK_WANT_UPGRADE) ? 1 : 0;
 	mtx_unlock(lkp->lk_interlock);
 	return (count);
 }
@@ -646,12 +614,14 @@
 	if (lkp->lk_sharecount)
 		printf(" lock type %s: SHARED (count %d)", lkp->lk_wmesg,
 		    lkp->lk_sharecount);
-	else if (lkp->lk_flags & LK_HAVE_EXCL)
+	else if (lkp->lk_exclusivecount)
 		printf(" lock type %s: EXCL (count %d) by thread %p (pid %d)",
 		    lkp->lk_wmesg, lkp->lk_exclusivecount,
 		    lkp->lk_lockholder, lkp->lk_lockholder->td_proc->p_pid);
-	if (lkp->lk_waitcount > 0)
-		printf(" with %d pending", lkp->lk_waitcount);
+	if (lkp->lk_sharewait > 0)
+		printf(" with %d pending readers", lkp->lk_sharewait);
+	if (lkp->lk_exclusivewait > 0)
+		printf(" with %d pending writers", lkp->lk_exclusivewait);
 #ifdef DEBUG_LOCKS
 	stack_print(&lkp->lk_stack);
 #endif
@@ -671,24 +641,9 @@
 	lkp = td->td_wchan;
 
 	/* Simple test to see if wchan points to a lockmgr lock. */
-	if (LOCK_CLASS(&lkp->lk_object) == &lock_class_lockmgr &&
-	    lkp->lk_wmesg == td->td_wmesg)
-		goto ok;
+	if (lkp->lk_wmesg != td->td_wmesg)
+		return (0);
 
-	/*
-	 * If this thread is doing a DRAIN, then it would be asleep on
-	 * &lkp->lk_flags rather than lkp.
-	 */
-	lkp = (struct lock *)((char *)td->td_wchan -
-	    offsetof(struct lock, lk_flags));
-	if (LOCK_CLASS(&lkp->lk_object) == &lock_class_lockmgr &&
-	    lkp->lk_wmesg == td->td_wmesg && (lkp->lk_flags & LK_WAITDRAIN))
-		goto ok;
-
-	/* Doen't seem to be a lockmgr lock. */
-	return (0);
-
-ok:
 	/* Ok, we think we have a lockmgr lock, so output some details. */
 	db_printf("blocked on lk \"%s\" ", lkp->lk_wmesg);
 	if (lkp->lk_sharecount) {
@@ -701,7 +656,7 @@
 	return (1);
 }
 
-void
+static void
 db_show_lockmgr(struct lock_object *lock)
 {
 	struct thread *td;
@@ -709,18 +664,20 @@
 
 	lkp = (struct lock *)lock;
 
-	db_printf(" lock type: %s\n", lkp->lk_wmesg);
-	db_printf(" state: ");
+	db_printf("lock type: %s\n", lkp->lk_wmesg);
+	db_printf("state: ");
 	if (lkp->lk_sharecount)
 		db_printf("SHARED (count %d)\n", lkp->lk_sharecount);
-	else if (lkp->lk_flags & LK_HAVE_EXCL) {
+	else if (lkp->lk_exclusivecount != 0) {
 		td = lkp->lk_lockholder;
 		db_printf("EXCL (count %d) %p ", lkp->lk_exclusivecount, td);
 		db_printf("(tid %d, pid %d, \"%s\")\n", td->td_tid,
 		    td->td_proc->p_pid, td->td_proc->p_comm);
 	} else
 		db_printf("UNLOCKED\n");
-	if (lkp->lk_waitcount > 0)
-		db_printf(" waiters: %d\n", lkp->lk_waitcount);
+	if (lkp->lk_sharewait > 0)
+		db_printf("waiters shared: %d\n", lkp->lk_sharewait);
+	if (lkp->lk_exclusivewait > 0)
+		db_printf("waiters exclusive: %d\n", lkp->lk_exclusivewait);
 }
 #endif
==== //depot/user/kris/contention/sys/kern/subr_lock.c#14 - /zoo/kris/contention/kern/subr_lock.c ====
@@ -59,7 +59,6 @@
 	&lock_class_sx,
 	&lock_class_rm,
 	&lock_class_rw,
-	&lock_class_lockmgr,
 };
 
 #ifdef LOCK_PROFILING
==== //depot/user/kris/contention/sys/kern/vfs_default.c#6 - /zoo/kris/contention/kern/vfs_default.c ====
@@ -263,7 +263,7 @@
 {
 	struct vnode *vp = ap->a_vp;
 
-	return (_lockmgr(vp->v_vnlock, ap->a_flags, VI_MTX(vp), ap->a_td, ap->a_file, ap->a_line));
+	return (lockmgr(vp->v_vnlock, ap->a_flags, VI_MTX(vp), ap->a_td));
 }
 
 /* See above. */
==== //depot/user/kris/contention/sys/sys/lockmgr.h#6 - /zoo/kris/contention/sys/lockmgr.h ====
@@ -51,23 +51,23 @@
  * can be gained.
  */
 struct lock {
-	struct lock_object lk_object;   /* common lock properties */
+	struct lock_object lk_object;	/* common lock properties */
 	struct	mtx *lk_interlock;	/* lock on remaining fields */
 	u_int	lk_flags;		/* see below */
 	int	lk_sharecount;		/* # of accepted shared locks */
-	int	lk_waitcount;		/* # of processes sleeping for lock */
-	short	lk_exclusivecount;	/* # of recursive exclusive locks */
+	int	lk_sharewait;		/* # waiting for shared locks */
+	int	lk_exclusivecount;	/* # of recursive exclusive locks */
+	int	lk_exclusivewait;	/* # of recursive exclusive locks */
+
 	short	lk_prio;		/* priority at which to sleep */
+	const char *lk_wmesg;		/* resource sleeping (for tsleep) */
 	int	lk_timo;		/* maximum sleep time (for tsleep) */
 	struct thread *lk_lockholder;	/* thread of exclusive lock holder */
-	struct	lock *lk_newlock;	/* lock taking over this lock */
-
+	
 #ifdef	DEBUG_LOCKS
 	struct stack lk_stack;
 #endif
 };
-
-#define lk_wmesg lk_object.lo_name
 /*
  * Lock request types:
  *   LK_SHARED - get one of many possible shared locks. If a process
@@ -202,15 +202,13 @@
 			int timo, int flags);
 void	lockdestroy(struct lock *);
 
-int	_lockmgr(struct lock *, u_int flags,
-		 struct mtx *, struct thread *p, char *file, int line);
+int	lockmgr(struct lock *, u_int flags,
+			struct mtx *, struct thread *p);
 void	transferlockers(struct lock *, struct lock *);
 void	lockmgr_printinfo(struct lock *);
 int	lockstatus(struct lock *, struct thread *);
 int	lockcount(struct lock *);
 int	lockwaiters(struct lock *);
-
-#define lockmgr(lock, flags, mtx, td) _lockmgr((lock), (flags), (mtx), (td), __FILE__, __LINE__)
 #ifdef DDB
 int	lockmgr_chain(struct thread *td, struct thread **ownerp);
 #endif
==== //depot/user/kris/contention/sys/ufs/ffs/ffs_vnops.c#13 - /zoo/kris/contention/ufs/ffs/ffs_vnops.c ====
@@ -371,7 +371,7 @@
 				flags |= LK_INTERLOCK;
 			}
 			lkp = vp->v_vnlock;
-			result = _lockmgr(lkp, flags, VI_MTX(vp), ap->a_td, ap->a_file, ap->a_line);
+			result = lockmgr(lkp, flags, VI_MTX(vp), ap->a_td);
 			if (lkp == vp->v_vnlock || result != 0)
 				break;
 			/*
@@ -382,7 +382,7 @@
 			 * right lock.  Release it, and try to get the
 			 * new lock.
 			 */
-			(void) _lockmgr(lkp, LK_RELEASE, VI_MTX(vp), ap->a_td, ap->a_file, ap->a_line);
+			(void) lockmgr(lkp, LK_RELEASE, VI_MTX(vp), ap->a_td);
 			if ((flags & LK_TYPE_MASK) == LK_UPGRADE)
 				flags = (flags & ~LK_TYPE_MASK) | LK_EXCLUSIVE;
 			flags &= ~LK_INTERLOCK;

--------------090206040000020400040605--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4743629B.9090408>