PERFORCE change 149717 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Sep 13 17:17:04 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=149717
Change 149717 by hselasky at hselasky_laptop001 on 2008/09/13 17:16:08
Integrate some files because the problems I've tried to fix
have been fixed. And the fixes are not inter compatible.
That means you will get a panic with the P4 USB kernel
unless you have this change included, after my last IFC.
Affected files ...
.. //depot/projects/usb/src/sys/kern/kern_condvar.c#9 integrate
.. //depot/projects/usb/src/sys/kern/kern_synch.c#12 integrate
.. //depot/projects/usb/src/sys/kern/subr_bus.c#12 integrate
.. //depot/projects/usb/src/sys/sys/mutex.h#9 integrate
Differences ...
==== //depot/projects/usb/src/sys/kern/kern_condvar.c#9 (text+ko) ====
@@ -124,7 +124,7 @@
sleepq_lock(cvp);
cvp->cv_waiters++;
- DROP_GIANT(lock);
+ DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0);
if (lock != &Giant.lock_object) {
@@ -183,7 +183,7 @@
sleepq_lock(cvp);
cvp->cv_waiters++;
- DROP_GIANT(lock);
+ DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0);
if (class->lc_flags & LC_SLEEPABLE)
@@ -241,7 +241,7 @@
sleepq_lock(cvp);
cvp->cv_waiters++;
- DROP_GIANT(lock);
+ DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR |
SLEEPQ_INTERRUPTIBLE, 0);
@@ -306,7 +306,7 @@
sleepq_lock(cvp);
cvp->cv_waiters++;
- DROP_GIANT(lock);
+ DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0);
sleepq_set_timeout(cvp, timo);
@@ -374,7 +374,7 @@
sleepq_lock(cvp);
cvp->cv_waiters++;
- DROP_GIANT(lock);
+ DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR |
SLEEPQ_INTERRUPTIBLE, 0);
==== //depot/projects/usb/src/sys/kern/kern_synch.c#12 (text+ko) ====
@@ -181,7 +181,7 @@
CTR5(KTR_PROC, "sleep: thread %ld (pid %ld, %s) on %s (%p)",
td->td_tid, p->p_pid, td->td_name, wmesg, ident);
- DROP_GIANT(lock);
+ DROP_GIANT();
if (lock != NULL && lock != &Giant.lock_object &&
!(class->lc_flags & LC_SLEEPABLE)) {
WITNESS_SAVE(lock, lock_witness);
==== //depot/projects/usb/src/sys/kern/subr_bus.c#12 (text+ko) ====
==== //depot/projects/usb/src/sys/sys/mutex.h#9 (text+ko) ====
@@ -366,44 +366,17 @@
*
* Note that DROP_GIANT*() needs to be paired with PICKUP_GIANT()
* The #ifndef is to allow lint-like tools to redefine DROP_GIANT.
- *
- * Note that by default DROP_GIANT takes no argument. Optionally you
- * can specify an argument which explicitly has the name "lock" and
- * type "struct lock_object *". If this "lock" pointer is equal to
- * "&Giant", the DROP_GIANT macro will not do the final drop on the
- * Giant mutex, but expects the calling code to do so. This feature is
- * used by condition variables to allow sleeping on Giant. The
- * condition variable code will then do the final drop!
*/
#ifndef DROP_GIANT
-#define DROP_GIANT(arg) DROP_GIANT_SUB_##arg(arg)
-#define DROP_GIANT_SUB_lock(arg) DROP_GIANT_SUB(arg) /* "lock" argument */
-#define DROP_GIANT_SUB_(arg) DROP_GIANT_SUB(NULL) /* no argument */
-#define DROP_GIANT_SUB(lock) \
+#define DROP_GIANT() \
do { \
- unsigned int _giantcnt; \
+ int _giantcnt = 0; \
WITNESS_SAVE_DECL(Giant); \
\
if (mtx_owned(&Giant)) { \
- unsigned int _giantn; \
- if (((void *)(lock)) == ((void *)&Giant)) { \
- /* special case */ \
- _giantn = Giant.mtx_recurse; \
- } else { \
- /* default case */ \
- _giantn = Giant.mtx_recurse + 1; \
- } \
- if (_giantn != 0) { \
- WITNESS_SAVE(&Giant.lock_object, Giant); \
- _giantcnt = _giantn; \
- do { \
- mtx_unlock(&Giant); \
- } while (--_giantn); \
- } else { \
- _giantcnt = 0; \
- } \
- } else { \
- _giantcnt = 0; \
+ WITNESS_SAVE(&Giant.lock_object, Giant); \
+ for (_giantcnt = 0; mtx_owned(&Giant); _giantcnt++) \
+ mtx_unlock(&Giant); \
}
#define PICKUP_GIANT() \
More information about the p4-projects
mailing list