PERFORCE change 103741 for review
Chris Jones
cdjones at FreeBSD.org
Sun Aug 13 01:03:26 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=103741
Change 103741 by cdjones at cdjones-impulse on 2006/08/13 01:02:50
Integrate to keep things building properly. Whee.
Affected files ...
.. //depot/projects/soc2006/cdjones_jail/src/sys/conf/NOTES#3 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/conf/files#3 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/conf/options#3 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_mutex.c#6 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_sx.c#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_syscalls.c#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_sysctl.c#6 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/sched_hier.c#7 edit
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_autoconf.c#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_lock.c#3 branch
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_turnstile.c#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_witness.c#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/kernel.h#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/lock.h#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/mutex.h#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/param.h#6 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/serial.h#5 integrate
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/sysent.h#5 integrate
Differences ...
==== //depot/projects/soc2006/cdjones_jail/src/sys/conf/NOTES#3 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1325.2.14 2006/04/05 15:44:08 hrs Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1325.2.16 2006/08/10 10:40:45 glebius Exp $
#
# NOTES -- Lines that can be cut/pasted into kernel and hints configs.
#
@@ -557,6 +557,7 @@
options NETGRAPH_SOCKET
options NETGRAPH_SPLIT
options NETGRAPH_SPPP
+options NETGRAPH_TAG
options NETGRAPH_TCPMSS
options NETGRAPH_TEE
options NETGRAPH_TTY
@@ -1771,6 +1772,9 @@
# SMC91C90/92/94/95 chips.
# ste: Sundance Technologies ST201 PCI fast ethernet controller, includes
# the D-Link DFE-550TX.
+# stge: Support for gigabit ethernet adapters based on the Sundance/Tamarack
+# TC9021 family of controllers, including the Sundance ST2021/ST2023,
+# the Sundance/Tamarack TC9021, the D-Link DL-4000 and ASUS NX1101.
# ti: Support for PCI gigabit ethernet NICs based on the Alteon Networks
# Tigon 1 and Tigon 2 chipsets. This includes the Alteon AceNIC, the
# 3Com 3c985, the Netgear GA620 and various others. Note that you will
==== //depot/projects/soc2006/cdjones_jail/src/sys/conf/files#3 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1031.2.33 2006/07/24 23:20:58 thompsa Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1031.2.37 2006/08/10 10:40:45 glebius Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -681,8 +681,12 @@
dev/mii/e1000phy.c optional e1000phy
dev/mii/exphy.c optional miibus
dev/mii/exphy.c optional exphy
+dev/mii/gentbi.c optional miibus
+dev/mii/gentbi.c optional mii
dev/mii/inphy.c optional miibus
dev/mii/inphy.c optional inphy
+dev/mii/ip1000phy.c optional miibus
+dev/mii/ip1000phy.c optional ip1000phy
dev/mii/lxtphy.c optional miibus
dev/mii/lxtphy.c optional lxtphy
dev/mii/mii.c optional miibus
@@ -891,6 +895,7 @@
dev/stg/tmc18c30_pccard.c optional stg pccard
dev/stg/tmc18c30_pci.c optional stg pci
dev/stg/tmc18c30_subr.c optional stg
+dev/stge/if_stge.c optional stge
dev/streams/streams.c optional streams
dev/sx/sx.c optional sx
#dev/sx/sx_isa.c optional sx isa
@@ -1300,6 +1305,7 @@
kern/subr_hints.c standard
kern/subr_kdb.c standard
kern/subr_kobj.c standard
+kern/subr_lock.c standard
kern/subr_log.c standard
kern/subr_mbpool.c optional libmbpool
kern/subr_mchain.c optional libmchain
@@ -1623,6 +1629,7 @@
netgraph/ng_socket.c optional netgraph_socket
netgraph/ng_split.c optional netgraph_split
netgraph/ng_sppp.c optional netgraph_sppp
+netgraph/ng_tag.c optional netgraph_tag
netgraph/ng_tcpmss.c optional netgraph_tcpmss
netgraph/ng_tee.c optional netgraph_tee
netgraph/ng_tty.c optional netgraph_tty
==== //depot/projects/soc2006/cdjones_jail/src/sys/conf/options#3 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.510.2.13 2006/07/24 23:20:58 thompsa Exp $
+# $FreeBSD: src/sys/conf/options,v 1.510.2.14 2006/08/10 10:40:45 glebius Exp $
#
# On the handling of kernel options
#
@@ -440,6 +440,7 @@
NETGRAPH_SOCKET opt_netgraph.h
NETGRAPH_SPLIT opt_netgraph.h
NETGRAPH_SPPP opt_netgraph.h
+NETGRAPH_TAG opt_netgraph.h
NETGRAPH_TCPMSS opt_netgraph.h
NETGRAPH_TEE opt_netgraph.h
NETGRAPH_TTY opt_netgraph.h
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_mutex.c#6 (text+ko) ====
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_mutex.c,v 1.154.2.5 2005/12/20 19:28:23 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_mutex.c,v 1.154.2.9 2006/08/11 18:54:10 jhb Exp $");
#include "opt_adaptive_mutexes.h"
#include "opt_ddb.h"
@@ -278,7 +278,9 @@
{
MPASS(curthread != NULL);
- KASSERT(m->mtx_object.lo_class == &lock_class_mtx_sleep,
+ KASSERT(m->mtx_lock != MTX_DESTROYED,
+ ("mtx_lock() of destroyed mutex @ %s:%d", file, line));
+ KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_sleep,
("mtx_lock() of spin mutex %s @ %s:%d", m->mtx_object.lo_name,
file, line));
WITNESS_CHECKORDER(&m->mtx_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
@@ -287,6 +289,7 @@
LOCK_LOG_LOCK("LOCK", &m->mtx_object, opts, m->mtx_recurse, file,
line);
WITNESS_LOCK(&m->mtx_object, opts | LOP_EXCLUSIVE, file, line);
+ curthread->td_locks++;
#ifdef MUTEX_PROFILING
/* don't reset the timer when/if recursing */
if (m->mtx_acqtime == 0) {
@@ -303,9 +306,12 @@
{
MPASS(curthread != NULL);
- KASSERT(m->mtx_object.lo_class == &lock_class_mtx_sleep,
+ KASSERT(m->mtx_lock != MTX_DESTROYED,
+ ("mtx_unlock() of destroyed mutex @ %s:%d", file, line));
+ KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_sleep,
("mtx_unlock() of spin mutex %s @ %s:%d", m->mtx_object.lo_name,
file, line));
+ curthread->td_locks--;
WITNESS_UNLOCK(&m->mtx_object, opts | LOP_EXCLUSIVE, file, line);
LOCK_LOG_LOCK("UNLOCK", &m->mtx_object, opts, m->mtx_recurse, file,
line);
@@ -382,7 +388,9 @@
{
MPASS(curthread != NULL);
- KASSERT(m->mtx_object.lo_class == &lock_class_mtx_spin,
+ KASSERT(m->mtx_lock != MTX_DESTROYED,
+ ("mtx_lock_spin() of destroyed mutex @ %s:%d", file, line));
+ KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_spin,
("mtx_lock_spin() of sleep mutex %s @ %s:%d",
m->mtx_object.lo_name, file, line));
WITNESS_CHECKORDER(&m->mtx_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
@@ -398,7 +406,9 @@
{
MPASS(curthread != NULL);
- KASSERT(m->mtx_object.lo_class == &lock_class_mtx_spin,
+ KASSERT(m->mtx_lock != MTX_DESTROYED,
+ ("mtx_unlock_spin() of destroyed mutex @ %s:%d", file, line));
+ KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_spin,
("mtx_unlock_spin() of sleep mutex %s @ %s:%d",
m->mtx_object.lo_name, file, line));
WITNESS_UNLOCK(&m->mtx_object, opts | LOP_EXCLUSIVE, file, line);
@@ -419,7 +429,9 @@
int rval;
MPASS(curthread != NULL);
- KASSERT(m->mtx_object.lo_class == &lock_class_mtx_sleep,
+ KASSERT(m->mtx_lock != MTX_DESTROYED,
+ ("mtx_trylock() of destroyed mutex @ %s:%d", file, line));
+ KASSERT(LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_sleep,
("mtx_trylock() of spin mutex %s @ %s:%d", m->mtx_object.lo_name,
file, line));
@@ -431,9 +443,11 @@
rval = _obtain_lock(m, (uintptr_t)curthread);
LOCK_LOG_TRY("LOCK", &m->mtx_object, opts, rval, file, line);
- if (rval)
+ if (rval) {
WITNESS_LOCK(&m->mtx_object, opts | LOP_EXCLUSIVE | LOP_TRYLOCK,
file, line);
+ curthread->td_locks++;
+ }
return (rval);
}
@@ -449,7 +463,7 @@
int line)
{
#if defined(SMP) && !defined(NO_ADAPTIVE_MUTEXES)
- struct thread *owner;
+ volatile struct thread *owner;
#endif
uintptr_t v;
#ifdef KTR
@@ -830,7 +844,8 @@
void
mtx_init(struct mtx *m, const char *name, const char *type, int opts)
{
- struct lock_object *lock;
+ struct lock_class *class;
+ int flags;
MPASS((opts & ~(MTX_SPIN | MTX_QUIET | MTX_RECURSE |
MTX_NOWITNESS | MTX_DUPOK)) == 0);
@@ -840,30 +855,33 @@
mtx_validate(m);
#endif
- lock = &m->mtx_object;
- KASSERT((lock->lo_flags & LO_INITIALIZED) == 0,
- ("mutex \"%s\" %p already initialized", name, m));
- bzero(m, sizeof(*m));
+ /* Determine lock class and lock flags. */
if (opts & MTX_SPIN)
- lock->lo_class = &lock_class_mtx_spin;
+ class = &lock_class_mtx_spin;
else
- lock->lo_class = &lock_class_mtx_sleep;
- lock->lo_name = name;
- lock->lo_type = type != NULL ? type : name;
+ class = &lock_class_mtx_sleep;
+ flags = 0;
if (opts & MTX_QUIET)
- lock->lo_flags = LO_QUIET;
+ flags |= LO_QUIET;
if (opts & MTX_RECURSE)
- lock->lo_flags |= LO_RECURSABLE;
+ flags |= LO_RECURSABLE;
if ((opts & MTX_NOWITNESS) == 0)
- lock->lo_flags |= LO_WITNESS;
+ flags |= LO_WITNESS;
if (opts & MTX_DUPOK)
- lock->lo_flags |= LO_DUPOK;
+ flags |= LO_DUPOK;
+ /* Initialize mutex. */
m->mtx_lock = MTX_UNOWNED;
+ m->mtx_recurse = 0;
+#ifdef MUTEX_PROFILING
+ m->mtx_acqtime = 0;
+ m->mtx_filename = NULL;
+ m->mtx_lineno = 0;
+ m->mtx_contest_holding = 0;
+ m->mtx_contest_locking = 0;
+#endif
- LOCK_LOG_INIT(lock, opts);
-
- WITNESS_INIT(lock);
+ lock_init(&m->mtx_object, class, name, type, flags);
}
/*
@@ -876,19 +894,24 @@
mtx_destroy(struct mtx *m)
{
- LOCK_LOG_DESTROY(&m->mtx_object, 0);
-
if (!mtx_owned(m))
MPASS(mtx_unowned(m));
else {
MPASS((m->mtx_lock & (MTX_RECURSED|MTX_CONTESTED)) == 0);
+ /* Perform the non-mtx related part of mtx_unlock_spin(). */
+ if (LOCK_CLASS(&m->mtx_object) == &lock_class_mtx_spin)
+ spinlock_exit();
+ else
+ curthread->td_locks--;
+
/* Tell witness this isn't locked to make it happy. */
WITNESS_UNLOCK(&m->mtx_object, LOP_EXCLUSIVE, __FILE__,
__LINE__);
}
- WITNESS_DESTROY(&m->mtx_object);
+ m->mtx_lock = MTX_DESTROYED;
+ lock_destroy(&m->mtx_object);
}
/*
@@ -900,9 +923,6 @@
mutex_init(void)
{
- /* Setup thread0 so that mutexes work. */
- LIST_INIT(&thread0.td_contested);
-
/* Setup turnstiles so that sleep mutexes work. */
init_turnstiles();
@@ -917,27 +937,6 @@
}
#ifdef DDB
-/* XXX: This function is not mutex-specific. */
-DB_SHOW_COMMAND(lock, db_show_lock)
-{
- struct lock_object *lock;
-
- if (!have_addr)
- return;
- lock = (struct lock_object *)addr;
- if (lock->lo_class != &lock_class_mtx_sleep &&
- lock->lo_class != &lock_class_mtx_spin &&
- lock->lo_class != &lock_class_sx) {
- db_printf("Unknown lock class\n");
- return;
- }
- db_printf(" class: %s\n", lock->lo_class->lc_name);
- db_printf(" name: %s\n", lock->lo_name);
- if (lock->lo_type && lock->lo_type != lock->lo_name)
- db_printf(" type: %s\n", lock->lo_type);
- lock->lo_class->lc_ddb_show(lock);
-}
-
void
db_show_mtx(struct lock_object *lock)
{
@@ -947,7 +946,7 @@
m = (struct mtx *)lock;
db_printf(" flags: {");
- if (m->mtx_object.lo_class == &lock_class_mtx_spin)
+ if (LOCK_CLASS(lock) == &lock_class_mtx_spin)
db_printf("SPIN");
else
db_printf("DEF");
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_sx.c#5 (text+ko) ====
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_sx.c,v 1.25.2.1 2005/12/20 19:28:23 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_sx.c,v 1.25.2.3 2006/08/11 18:54:10 jhb Exp $");
#include "opt_ddb.h"
@@ -77,16 +77,7 @@
void
sx_init(struct sx *sx, const char *description)
{
- struct lock_object *lock;
- lock = &sx->sx_object;
- KASSERT((lock->lo_flags & LO_INITIALIZED) == 0,
- ("sx lock %s %p already initialized", description, sx));
- bzero(sx, sizeof(*sx));
- lock->lo_class = &lock_class_sx;
- lock->lo_type = lock->lo_name = description;
- lock->lo_flags = LO_WITNESS | LO_RECURSABLE | LO_SLEEPABLE |
- LO_UPGRADABLE;
sx->sx_lock = mtx_pool_find(mtxpool_lockbuilder, sx);
sx->sx_cnt = 0;
cv_init(&sx->sx_shrd_cv, description);
@@ -94,18 +85,14 @@
cv_init(&sx->sx_excl_cv, description);
sx->sx_excl_wcnt = 0;
sx->sx_xholder = NULL;
-
- LOCK_LOG_INIT(lock, 0);
-
- WITNESS_INIT(lock);
+ lock_init(&sx->sx_object, &lock_class_sx, description, NULL,
+ LO_WITNESS | LO_RECURSABLE | LO_SLEEPABLE | LO_UPGRADABLE);
}
void
sx_destroy(struct sx *sx)
{
- LOCK_LOG_DESTROY(&sx->sx_object, 0);
-
KASSERT((sx->sx_cnt == 0 && sx->sx_shrd_wcnt == 0 && sx->sx_excl_wcnt ==
0), ("%s (%s): holders or waiters\n", __func__,
sx->sx_object.lo_name));
@@ -114,7 +101,7 @@
cv_destroy(&sx->sx_shrd_cv);
cv_destroy(&sx->sx_excl_cv);
- WITNESS_DESTROY(&sx->sx_object);
+ lock_destroy(&sx->sx_object);
}
void
@@ -141,6 +128,7 @@
LOCK_LOG_LOCK("SLOCK", &sx->sx_object, 0, 0, file, line);
WITNESS_LOCK(&sx->sx_object, 0, file, line);
+ curthread->td_locks++;
mtx_unlock(sx->sx_lock);
}
@@ -154,6 +142,7 @@
sx->sx_cnt++;
LOCK_LOG_TRY("SLOCK", &sx->sx_object, 0, 1, file, line);
WITNESS_LOCK(&sx->sx_object, LOP_TRYLOCK, file, line);
+ curthread->td_locks++;
mtx_unlock(sx->sx_lock);
return (1);
} else {
@@ -197,6 +186,7 @@
LOCK_LOG_LOCK("XLOCK", &sx->sx_object, 0, 0, file, line);
WITNESS_LOCK(&sx->sx_object, LOP_EXCLUSIVE, file, line);
+ curthread->td_locks++;
mtx_unlock(sx->sx_lock);
}
@@ -212,6 +202,7 @@
LOCK_LOG_TRY("XLOCK", &sx->sx_object, 0, 1, file, line);
WITNESS_LOCK(&sx->sx_object, LOP_EXCLUSIVE | LOP_TRYLOCK, file,
line);
+ curthread->td_locks++;
mtx_unlock(sx->sx_lock);
return (1);
} else {
@@ -228,6 +219,7 @@
_sx_assert(sx, SX_SLOCKED, file, line);
mtx_lock(sx->sx_lock);
+ curthread->td_locks--;
WITNESS_UNLOCK(&sx->sx_object, 0, file, line);
/* Release. */
@@ -258,6 +250,7 @@
mtx_lock(sx->sx_lock);
MPASS(sx->sx_cnt == -1);
+ curthread->td_locks--;
WITNESS_UNLOCK(&sx->sx_object, LOP_EXCLUSIVE, file, line);
/* Release. */
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_syscalls.c#5 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_syscalls.c,v 1.11 2004/07/15 08:26:05 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_syscalls.c,v 1.11.8.1 2006/08/11 19:23:48 jhb Exp $");
#include <sys/param.h>
#include <sys/sysproto.h>
@@ -97,8 +97,11 @@
case MOD_LOAD :
error = syscall_register(data->offset, data->new_sysent,
&data->old_sysent);
- if (error)
+ if (error) {
+ /* Leave a mark so we know to safely unload below. */
+ data->offset = NULL;
return error;
+ }
ms.intval = *data->offset;
MOD_XLOCK;
module_setspecific(mod, &ms);
@@ -108,6 +111,13 @@
return error;
case MOD_UNLOAD :
+ /*
+ * MOD_LOAD failed, so just return without calling the
+ * chained handler since we didn't pass along the MOD_LOAD
+ * event.
+ */
+ if (data->offset == NULL)
+ return (0);
if (data->chainevh) {
error = data->chainevh(mod, what, data->chainarg);
if (error)
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_sysctl.c#6 (text+ko) ====
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_sysctl.c,v 1.165.2.3 2006/03/01 21:08:53 andre Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_sysctl.c,v 1.165.2.4 2006/08/07 10:12:56 yar Exp $");
#include "opt_compat.h"
#include "opt_mac.h"
@@ -1135,10 +1135,6 @@
/*
* Wire the user space destination buffer. If set to a value greater than
* zero, the len parameter limits the maximum amount of wired memory.
- *
- * XXX - The len parameter is currently ignored due to the lack of
- * a place to save it in the sysctl_req structure so that the matching
- * amount of memory can be unwired in the sysctl exit code.
*/
int
sysctl_wire_old_buffer(struct sysctl_req *req, size_t len)
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/sched_hier.c#7 (text+ko) ====
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_autoconf.c#5 (text+ko) ====
@@ -35,10 +35,12 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_autoconf.c,v 1.22 2005/01/06 23:35:39 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_autoconf.c,v 1.22.2.1 2006/07/31 18:53:55 jhb Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
#include <sys/systm.h>
/*
@@ -50,26 +52,32 @@
*/
static TAILQ_HEAD(, intr_config_hook) intr_config_hook_list =
TAILQ_HEAD_INITIALIZER(intr_config_hook_list);
-
+static struct mtx intr_config_hook_lock;
+MTX_SYSINIT(intr_config_hook, &intr_config_hook_lock, "intr config", MTX_DEF);
/* ARGSUSED */
static void run_interrupt_driven_config_hooks(void *dummy);
+
static void
run_interrupt_driven_config_hooks(dummy)
void *dummy;
{
struct intr_config_hook *hook_entry, *next_entry;
- for (hook_entry = TAILQ_FIRST(&intr_config_hook_list);
- hook_entry != NULL;
- hook_entry = next_entry) {
+ mtx_lock(&intr_config_hook_lock);
+ TAILQ_FOREACH_SAFE(hook_entry, &intr_config_hook_list, ich_links,
+ next_entry) {
next_entry = TAILQ_NEXT(hook_entry, ich_links);
+ mtx_unlock(&intr_config_hook_lock);
(*hook_entry->ich_func)(hook_entry->ich_arg);
+ mtx_lock(&intr_config_hook_lock);
}
while (!TAILQ_EMPTY(&intr_config_hook_list)) {
- tsleep(&intr_config_hook_list, PCONFIG, "conifhk", 0);
+ msleep(&intr_config_hook_list, &intr_config_hook_lock, PCONFIG,
+ "conifhk", 0);
}
+ mtx_unlock(&intr_config_hook_lock);
}
SYSINIT(intr_config_hooks, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_FIRST,
run_interrupt_driven_config_hooks, NULL)
@@ -85,17 +93,18 @@
{
struct intr_config_hook *hook_entry;
- for (hook_entry = TAILQ_FIRST(&intr_config_hook_list);
- hook_entry != NULL;
- hook_entry = TAILQ_NEXT(hook_entry, ich_links))
+ mtx_lock(&intr_config_hook_lock);
+ TAILQ_FOREACH(hook_entry, &intr_config_hook_list, ich_links)
if (hook_entry == hook)
break;
if (hook_entry != NULL) {
+ mtx_unlock(&intr_config_hook_lock);
printf("config_intrhook_establish: establishing an "
"already established hook.\n");
return (1);
}
TAILQ_INSERT_TAIL(&intr_config_hook_list, hook, ich_links);
+ mtx_unlock(&intr_config_hook_lock);
if (cold == 0)
/* XXX Sufficient for modules loaded after initial config??? */
run_interrupt_driven_config_hooks(NULL);
@@ -108,9 +117,8 @@
{
struct intr_config_hook *hook_entry;
- for (hook_entry = TAILQ_FIRST(&intr_config_hook_list);
- hook_entry != NULL;
- hook_entry = TAILQ_NEXT(hook_entry, ich_links))
+ mtx_lock(&intr_config_hook_lock);
+ TAILQ_FOREACH(hook_entry, &intr_config_hook_list, ich_links)
if (hook_entry == hook)
break;
if (hook_entry == NULL)
@@ -118,6 +126,8 @@
"unestablished hook");
TAILQ_REMOVE(&intr_config_hook_list, hook, ich_links);
+
/* Wakeup anyone watching the list */
wakeup(&intr_config_hook_list);
+ mtx_unlock(&intr_config_hook_lock);
}
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_turnstile.c#5 (text+ko) ====
@@ -59,7 +59,7 @@
#include "opt_turnstile_profiling.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_turnstile.c,v 1.152.2.2 2006/04/05 21:15:19 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_turnstile.c,v 1.152.2.3 2006/08/01 17:40:13 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -334,6 +334,7 @@
NULL, MTX_SPIN);
}
mtx_init(&td_contested_lock, "td_contested", NULL, MTX_SPIN);
+ LIST_INIT(&thread0.td_contested);
thread0.td_turnstile = NULL;
}
==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/subr_witness.c#5 (text+ko) ====
@@ -82,7 +82,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_witness.c,v 1.195.2.9 2006/04/19 15:45:29 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_witness.c,v 1.195.2.10 2006/08/01 17:40:13 jhb Exp $");
#include "opt_ddb.h"
#include "opt_witness.h"
@@ -511,7 +511,7 @@
TAILQ_FOREACH(lock, &all_locks, lo_list) {
if (lock->lo_flags & LO_WITNESS)
lock->lo_witness = enroll(lock->lo_type,
- lock->lo_class);
+ LOCK_CLASS(lock));
else
lock->lo_witness = NULL;
}
@@ -549,10 +549,7 @@
{
struct lock_class *class;
- class = lock->lo_class;
- if (lock->lo_flags & LO_INITIALIZED)
- panic("%s: lock (%s) %s is already initialized", __func__,
- class->lc_name, lock->lo_name);
+ class = LOCK_CLASS(lock);
if ((lock->lo_flags & LO_RECURSABLE) != 0 &&
(class->lc_flags & LC_RECURSABLE) == 0)
panic("%s: lock (%s) %s can not be recursable", __func__,
@@ -568,7 +565,6 @@
mtx_lock(&all_mtx);
TAILQ_INSERT_TAIL(&all_locks, lock, lo_list);
- lock->lo_flags |= LO_INITIALIZED;
lock_cur_cnt++;
if (lock_cur_cnt > lock_max_cnt)
lock_max_cnt = lock_cur_cnt;
@@ -583,14 +579,13 @@
void
witness_destroy(struct lock_object *lock)
{
+ struct lock_class *class;
struct witness *w;
+ class = LOCK_CLASS(lock);
if (witness_cold)
panic("lock (%s) %s destroyed while witness_cold",
- lock->lo_class->lc_name, lock->lo_name);
- if ((lock->lo_flags & LO_INITIALIZED) == 0)
- panic("%s: lock (%s) %s is not initialized", __func__,
- lock->lo_class->lc_name, lock->lo_name);
+ class->lc_name, lock->lo_name);
/* XXX: need to verify that no one holds the lock */
w = lock->lo_witness;
@@ -610,7 +605,6 @@
mtx_lock(&all_mtx);
lock_cur_cnt--;
TAILQ_REMOVE(&all_locks, lock, lo_list);
- lock->lo_flags &= ~LO_INITIALIZED;
mtx_unlock(&all_mtx);
}
@@ -822,7 +816,7 @@
__func__);
w = lock->lo_witness;
- class = lock->lo_class;
+ class = LOCK_CLASS(lock);
td = curthread;
file = fixup_filename(file);
@@ -1102,7 +1096,7 @@
file = fixup_filename(file);
/* Determine lock list for this lock. */
- if (lock->lo_class->lc_flags & LC_SLEEPLOCK)
+ if (LOCK_CLASS(lock)->lc_flags & LC_SLEEPLOCK)
lock_list = &td->td_sleeplocks;
else
lock_list = PCPU_PTR(spinlocks);
@@ -1155,7 +1149,7 @@
KASSERT(!witness_cold, ("%s: witness_cold", __func__));
if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL)
return;
- class = lock->lo_class;
+ class = LOCK_CLASS(lock);
file = fixup_filename(file);
if ((lock->lo_flags & LO_UPGRADABLE) == 0)
panic("upgrade of non-upgradable lock (%s) %s @ %s:%d",
@@ -1163,7 +1157,7 @@
if ((flags & LOP_TRYLOCK) == 0)
panic("non-try upgrade of lock (%s) %s @ %s:%d", class->lc_name,
lock->lo_name, file, line);
- if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) == 0)
+ if ((class->lc_flags & LC_SLEEPLOCK) == 0)
panic("upgrade of non-sleep lock (%s) %s @ %s:%d",
class->lc_name, lock->lo_name, file, line);
instance = find_instance(curthread->td_sleeplocks, lock);
@@ -1190,12 +1184,12 @@
KASSERT(!witness_cold, ("%s: witness_cold", __func__));
if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL)
return;
- class = lock->lo_class;
+ class = LOCK_CLASS(lock);
file = fixup_filename(file);
if ((lock->lo_flags & LO_UPGRADABLE) == 0)
panic("downgrade of non-upgradable lock (%s) %s @ %s:%d",
class->lc_name, lock->lo_name, file, line);
- if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) == 0)
+ if ((class->lc_flags & LC_SLEEPLOCK) == 0)
panic("downgrade of non-sleep lock (%s) %s @ %s:%d",
class->lc_name, lock->lo_name, file, line);
instance = find_instance(curthread->td_sleeplocks, lock);
@@ -1226,7 +1220,7 @@
panicstr != NULL)
return;
td = curthread;
- class = lock->lo_class;
+ class = LOCK_CLASS(lock);
file = fixup_filename(file);
/* Find lock instance associated with this lock. */
@@ -1737,7 +1731,7 @@
lock = instance->li_lock;
printf("%s %s %s", (instance->li_flags & LI_EXCLUSIVE) != 0 ?
- "exclusive" : "shared", lock->lo_class->lc_name, lock->lo_name);
+ "exclusive" : "shared", LOCK_CLASS(lock)->lc_name, lock->lo_name);
if (lock->lo_type != lock->lo_name)
printf(" (%s)", lock->lo_type);
printf(" r = %d (%p) locked @ %s:%d\n",
@@ -1805,18 +1799,25 @@
void
witness_save(struct lock_object *lock, const char **filep, int *linep)
{
+ struct lock_list_entry *lock_list;
struct lock_instance *instance;
+ struct lock_class *class;
KASSERT(!witness_cold, ("%s: witness_cold", __func__));
if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL)
return;
- if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) == 0)
- panic("%s: lock (%s) %s is not a sleep lock", __func__,
- lock->lo_class->lc_name, lock->lo_name);
- instance = find_instance(curthread->td_sleeplocks, lock);
+ class = LOCK_CLASS(lock);
+ if (class->lc_flags & LC_SLEEPLOCK)
+ lock_list = curthread->td_sleeplocks;
+ else {
+ if (witness_skipspin)
+ return;
+ lock_list = PCPU_GET(spinlocks);
+ }
+ instance = find_instance(lock_list, lock);
if (instance == NULL)
panic("%s: lock (%s) %s not locked", __func__,
- lock->lo_class->lc_name, lock->lo_name);
+ class->lc_name, lock->lo_name);
*filep = instance->li_file;
*linep = instance->li_line;
}
@@ -1824,18 +1825,25 @@
void
witness_restore(struct lock_object *lock, const char *file, int line)
{
+ struct lock_list_entry *lock_list;
struct lock_instance *instance;
+ struct lock_class *class;
KASSERT(!witness_cold, ("%s: witness_cold", __func__));
if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL)
return;
- if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) == 0)
- panic("%s: lock (%s) %s is not a sleep lock", __func__,
- lock->lo_class->lc_name, lock->lo_name);
- instance = find_instance(curthread->td_sleeplocks, lock);
+ class = LOCK_CLASS(lock);
+ if (class->lc_flags & LC_SLEEPLOCK)
+ lock_list = curthread->td_sleeplocks;
+ else {
+ if (witness_skipspin)
+ return;
+ lock_list = PCPU_GET(spinlocks);
+ }
+ instance = find_instance(lock_list, lock);
if (instance == NULL)
panic("%s: lock (%s) %s not locked", __func__,
- lock->lo_class->lc_name, lock->lo_name);
+ class->lc_name, lock->lo_name);
lock->lo_witness->w_file = file;
lock->lo_witness->w_line = line;
instance->li_file = file;
@@ -1847,23 +1855,25 @@
{
#ifdef INVARIANT_SUPPORT
struct lock_instance *instance;
+ struct lock_class *class;
if (lock->lo_witness == NULL || witness_watch == 0 || panicstr != NULL)
return;
- if ((lock->lo_class->lc_flags & LC_SLEEPLOCK) != 0)
+ class = LOCK_CLASS(lock);
+ if ((class->lc_flags & LC_SLEEPLOCK) != 0)
instance = find_instance(curthread->td_sleeplocks, lock);
- else if ((lock->lo_class->lc_flags & LC_SPINLOCK) != 0)
+ else if ((class->lc_flags & LC_SPINLOCK) != 0)
instance = find_instance(PCPU_GET(spinlocks), lock);
else {
panic("Lock (%s) %s is not sleep or spin!",
- lock->lo_class->lc_name, lock->lo_name);
+ class->lc_name, lock->lo_name);
}
file = fixup_filename(file);
switch (flags) {
case LA_UNLOCKED:
if (instance != NULL)
panic("Lock (%s) %s locked @ %s:%d.",
- lock->lo_class->lc_name, lock->lo_name, file, line);
+ class->lc_name, lock->lo_name, file, line);
break;
case LA_LOCKED:
case LA_LOCKED | LA_RECURSED:
@@ -1876,25 +1886,25 @@
case LA_XLOCKED | LA_NOTRECURSED:
if (instance == NULL) {
panic("Lock (%s) %s not locked @ %s:%d.",
- lock->lo_class->lc_name, lock->lo_name, file, line);
+ class->lc_name, lock->lo_name, file, line);
break;
}
if ((flags & LA_XLOCKED) != 0 &&
(instance->li_flags & LI_EXCLUSIVE) == 0)
panic("Lock (%s) %s not exclusively locked @ %s:%d.",
- lock->lo_class->lc_name, lock->lo_name, file, line);
+ class->lc_name, lock->lo_name, file, line);
if ((flags & LA_SLOCKED) != 0 &&
(instance->li_flags & LI_EXCLUSIVE) != 0)
panic("Lock (%s) %s exclusively locked @ %s:%d.",
- lock->lo_class->lc_name, lock->lo_name, file, line);
+ class->lc_name, lock->lo_name, file, line);
if ((flags & LA_RECURSED) != 0 &&
(instance->li_flags & LI_RECURSEMASK) == 0)
panic("Lock (%s) %s not recursed @ %s:%d.",
- lock->lo_class->lc_name, lock->lo_name, file, line);
+ class->lc_name, lock->lo_name, file, line);
if ((flags & LA_NOTRECURSED) != 0 &&
(instance->li_flags & LI_RECURSEMASK) != 0)
panic("Lock (%s) %s recursed @ %s:%d.",
- lock->lo_class->lc_name, lock->lo_name, file, line);
+ class->lc_name, lock->lo_name, file, line);
break;
default:
panic("Invalid lock assertion at %s:%d.", file, line);
==== //depot/projects/soc2006/cdjones_jail/src/sys/sys/kernel.h#5 (text+ko) ====
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* @(#)kernel.h 8.3 (Berkeley) 1/21/94
- * $FreeBSD: src/sys/sys/kernel.h,v 1.126.2.1 2005/11/12 20:55:59 csjp Exp $
+ * $FreeBSD: src/sys/sys/kernel.h,v 1.126.2.2 2006/08/11 19:23:49 jhb Exp $
*/
#ifndef _SYS_KERNEL_H_
@@ -160,6 +160,7 @@
SI_SUB_MOUNT_ROOT = 0xb400000, /* root mount*/
SI_SUB_SWAP = 0xc000000, /* swap */
SI_SUB_INTRINSIC_POST = 0xd000000, /* proc 0 cleanup*/
+ SI_SUB_SYSCALLS = 0xd800000, /* register system calls */
SI_SUB_KTHREAD_INIT = 0xe000000, /* init process*/
SI_SUB_KTHREAD_PAGE = 0xe400000, /* pageout daemon*/
SI_SUB_KTHREAD_VM = 0xe800000, /* vm daemon*/
==== //depot/projects/soc2006/cdjones_jail/src/sys/sys/lock.h#5 (text+ko) ====
@@ -26,7 +26,7 @@
* SUCH DAMAGE.
*
* from BSDI $Id: mutex.h,v 2.7.2.35 2000/04/27 03:10:26 cp Exp $
- * $FreeBSD: src/sys/sys/lock.h,v 1.52.2.1 2005/12/20 19:28:24 jhb Exp $
+ * $FreeBSD: src/sys/sys/lock.h,v 1.52.2.2 2006/08/01 17:40:13 jhb Exp $
*/
#ifndef _SYS_LOCK_H_
@@ -68,6 +68,8 @@
#define LO_UPGRADABLE 0x00200000 /* Lock may be upgraded/downgraded. */
#define LO_DUPOK 0x00400000 /* Don't check for duplicate acquires */
+#define LOCK_CLASS(lock) ((lock)->lo_class)
+
#define LI_RECURSEMASK 0x0000ffff /* Recursion depth of lock instance. */
#define LI_EXCLUSIVE 0x00010000 /* Exclusive lock instance. */
@@ -165,25 +167,27 @@
#define LOCK_LOG_LOCK(opname, lo, flags, recurse, file, line) do { \
if (LOCK_LOG_TEST((lo), (flags))) \
CTR5(KTR_LOCK, opname " (%s) %s r = %d at %s:%d", \
- (lo)->lo_class->lc_name, (lo)->lo_name, \
+ LOCK_CLASS(lo)->lc_name, (lo)->lo_name, \
(u_int)(recurse), (file), (line)); \
} while (0)
#define LOCK_LOG_TRY(opname, lo, flags, result, file, line) do { \
if (LOCK_LOG_TEST((lo), (flags))) \
CTR5(KTR_LOCK, "TRY_" opname " (%s) %s result=%d at %s:%d",\
- (lo)->lo_class->lc_name, (lo)->lo_name, \
+ LOCK_CLASS(lo)->lc_name, (lo)->lo_name, \
(u_int)(result), (file), (line)); \
} while (0)
#define LOCK_LOG_INIT(lo, flags) do { \
if (LOCK_LOG_TEST((lo), (flags))) \
CTR4(KTR_LOCK, "%s: %p (%s) %s", __func__, (lo), \
- (lo)->lo_class->lc_name, (lo)->lo_name); \
+ LOCK_CLASS(lo)->lc_name, (lo)->lo_name); \
} while (0)
#define LOCK_LOG_DESTROY(lo, flags) LOCK_LOG_INIT(lo, flags)
+#define lock_initalized(lo) ((lo)->lo_flags & LO_INITIALIZED)
+
/*
* Helpful macros for quickly coming up with assertions with informative
* panic messages.
@@ -198,6 +202,9 @@
extern struct lock_class lock_class_mtx_spin;
extern struct lock_class lock_class_sx;
+void lock_init(struct lock_object *lock, struct lock_class *class,
+ const char *name, const char *type, int flags);
+void lock_destroy(struct lock_object *lock);
void spinlock_enter(void);
void spinlock_exit(void);
void witness_init(struct lock_object *);
@@ -269,8 +276,8 @@
witness_line(lock)
#else /* WITNESS */
-#define WITNESS_INIT(lock) ((lock)->lo_flags |= LO_INITIALIZED)
-#define WITNESS_DESTROY(lock) ((lock)->lo_flags &= ~LO_INITIALIZED)
+#define WITNESS_INIT(lock)
+#define WITNESS_DESTROY(lock)
#define WITNESS_DEFINEORDER(lock1, lock2) 0
#define WITNESS_CHECKORDER(lock, flags, file, line)
#define WITNESS_LOCK(lock, flags, file, line)
==== //depot/projects/soc2006/cdjones_jail/src/sys/sys/mutex.h#5 (text+ko) ====
@@ -26,7 +26,7 @@
* SUCH DAMAGE.
*
* from BSDI $Id: mutex.h,v 2.7.2.35 2000/04/27 03:10:26 cp Exp $
- * $FreeBSD: src/sys/sys/mutex.h,v 1.79.2.2 2005/08/05 20:21:46 jhb Exp $
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list