Date: Wed, 10 Nov 1999 00:30:12 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: Assar Westerlund <assar@sics.se> Cc: current@FreeBSD.ORG Subject: Re: inconsistent and wrong locking in asleep() Message-ID: <Pine.BSF.4.10.9911092359380.10910-100000@alphplex.bde.org> In-Reply-To: <5l4sevrhxk.fsf@assaris.sics.se>
next in thread | previous in thread | raw e-mail | index | archive | help
> Why trying to debug some locking code of my own I enabled > SIMPLELOCK_DEBUG, only to find out that I was getting lots of > `simple_unlock: lock not held' in lockmgr -> acquire -> apause. > > Looking closer at `apause' it seems rather clear that it can cause > this. I proposed simple change is below. That's a really old bug. I fixed it a year or two ago in my version, and optimised the !SMP case following a suggestion of tegge (waiting for the lock is useless in the !SMP case). Bruce diff -c2 kern_lock.c~ kern_lock.c *** kern_lock.c~ Tue Sep 28 06:06:16 1999 --- kern_lock.c Tue Sep 28 06:07:59 1999 *************** *** 104,125 **** */ static int ! apause(struct lock *lkp, int flags) { ! int lock_wait; ! lock_wait = LOCK_WAIT_TIME; ! for (; lock_wait > 0; lock_wait--) { ! int i; ! if ((lkp->lk_flags & flags) == 0) ! return 0; simple_unlock(&lkp->lk_interlock); ! for (i = LOCK_SAMPLE_WAIT; i > 0; i--) { ! if ((lkp->lk_flags & flags) == 0) { ! simple_lock(&lkp->lk_interlock); ! if ((lkp->lk_flags & flags) == 0) ! return 0; break; ! } ! } } ! return 1; } --- 103,126 ---- */ static int ! apause(struct lock *lkp, int flags) ! { ! #ifdef SMP ! int i, lock_wait; ! #endif ! ! if ((lkp->lk_flags & flags) == 0) ! return (0); ! #ifdef SMP ! for (lock_wait = LOCK_WAIT_TIME; lock_wait > 0; lock_wait--) { simple_unlock(&lkp->lk_interlock); ! for (i = LOCK_SAMPLE_WAIT; i > 0; i--) ! if ((lkp->lk_flags & flags) == 0) break; ! simple_lock(&lkp->lk_interlock); ! if ((lkp->lk_flags & flags) == 0) ! return (0); } ! #endif ! return (1); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.10.9911092359380.10910-100000>