PERFORCE change 100179 for review
Kip Macy
kmacy at FreeBSD.org
Wed Jun 28 00:44:47 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=100179
Change 100179 by kmacy at kmacy_storage:sun4v_work_sleepq on 2006/06/28 00:44:36
my token of defiance against the most foul, kludgeish artifact
in the entire kernel, the lockmgr
- remove the LK_INTERNAL flag as the serialization provided by the interlock is not
meaningful for those already holding the lock
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_lock.c#4 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/buf.h#4 edit
.. //depot/projects/kmacy_sun4v/src/sys/sys/lockmgr.h#4 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_lock.c#4 (text+ko) ====
@@ -174,11 +174,6 @@
}
#endif
- if (flags & LK_INTERLOCK) {
- mtx_assert(interlkp, MA_OWNED | MA_NOTRECURSED);
- mtx_unlock(interlkp);
- }
-
if ((flags & (LK_NOWAIT|LK_RELEASE)) == 0)
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK,
&lkp->lk_interlock->mtx_object,
@@ -468,33 +463,6 @@
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.
==== //depot/projects/kmacy_sun4v/src/sys/sys/buf.h#4 (text+ko) ====
@@ -273,8 +273,10 @@
int s, ret;
s = splbio();
- mtx_lock(bp->b_lock.lk_interlock);
- locktype |= LK_INTERNAL;
+ /* XXX having the mutex didn't really remove the race for wmesg change
+ * as there may still be other sleeping on the lock even when the interlock
+ * mutex is held
+ */
bp->b_lock.lk_wmesg = buf_wmesg;
bp->b_lock.lk_prio = PRIBIO + 4;
ret = lockmgr(&(bp)->b_lock, locktype, interlock, curthread);
@@ -293,8 +295,11 @@
int s, ret;
s = splbio();
- mtx_lock(bp->b_lock.lk_interlock);
- locktype |= LK_INTERNAL | LK_TIMELOCK;
+ /* XXX having the mutex didn't really remove the race for wmesg change
+ * as there may still be other sleeping on the lock even when the interlock
+ * mutex is held
+ */
+ locktype |= LK_TIMELOCK;
bp->b_lock.lk_wmesg = wmesg;
bp->b_lock.lk_prio = (PRIBIO + 4) | catch;
bp->b_lock.lk_timo = timo;
==== //depot/projects/kmacy_sun4v/src/sys/sys/lockmgr.h#4 (text+ko) ====
@@ -141,7 +141,7 @@
#define LK_HAVE_EXCL 0x00040000 /* exclusive lock obtained */
#define LK_WAITDRAIN 0x00080000 /* process waiting for lock to drain */
#define LK_DRAINING 0x00100000 /* lock is being drained */
-#define LK_INTERNAL 0x00200000/* The internal lock is already held */
+/*#define LK_INTERNAL 0x00200000 The internal lock is already held */
/*
* Internal state flags corresponding to lk_sharecount, and lk_waitcount
*/
More information about the p4-projects
mailing list