From 382d30cdd8ca9f1790931298be2226f4b8b18ca7 Mon Sep 17 00:00:00 2001 From: Joseph Koshy Date: Thu, 19 Apr 2007 08:02:51 +0000 Subject: Fix witness(4) warnings about mutex use. Group mutexes used in hwpmc(4) into 3 "types" in the sense of witness(4): - leaf spin mutexes---only one of these should be held at a time, so these mutexes are specified as belonging to a single witness type "pmc-leaf". - `struct pmc_owner' descriptors are protected by a spin mutex of witness type "pmc-owner-proc". Since we call wakeup_one() while holding these mutexes, the witness type of these mutexes needs to dominate that of "sleepq chain" mutexes. - logger threads use a sleep mutex, of type "pmc-sleep". Submitted by: wkoszek (earlier patch) --- sys/dev/hwpmc/hwpmc_logging.c | 5 +++-- sys/dev/hwpmc/hwpmc_mod.c | 43 ++++++++++++++++++++++++++----------------- sys/dev/hwpmc/hwpmc_piv.c | 2 +- 3 files changed, 30 insertions(+), 20 deletions(-) (limited to 'sys/dev/hwpmc') diff --git a/sys/dev/hwpmc/hwpmc_logging.c b/sys/dev/hwpmc/hwpmc_logging.c index efa0c527e87b..5af555c46df8 100644 --- a/sys/dev/hwpmc/hwpmc_logging.c +++ b/sys/dev/hwpmc/hwpmc_logging.c @@ -973,8 +973,9 @@ pmclog_initialize() PMCLOG_INIT_BUFFER_DESCRIPTOR(plb); TAILQ_INSERT_HEAD(&pmc_bufferlist, plb, plb_next); } - mtx_init(&pmc_bufferlist_mtx, "pmc-buffer-list", "pmc", MTX_SPIN); - mtx_init(&pmc_kthread_mtx, "pmc-kthread", "pmc", MTX_DEF); + mtx_init(&pmc_bufferlist_mtx, "pmc-buffer-list", "pmc-leaf", + MTX_SPIN); + mtx_init(&pmc_kthread_mtx, "pmc-kthread", "pmc-sleep", MTX_DEF); } /* diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c index 626e1ee7969a..71b8e6e0df8c 100644 --- a/sys/dev/hwpmc/hwpmc_mod.c +++ b/sys/dev/hwpmc/hwpmc_mod.c @@ -495,33 +495,32 @@ pmc_debugflags_sysctl_handler(SYSCTL_HANDLER_ARGS) * * The driver uses four locking strategies for its operation: * - * - There is a 'global' SX lock "pmc_sx" that is used to protect - * the its 'meta-data'. + * - The global SX lock "pmc_sx" is used to protect internal + * data structures. * - * Calls into the module (via syscall() or by the kernel) start with - * this lock being held in exclusive mode. Depending on the requested - * operation, the lock may be downgraded to 'shared' mode to allow - * more concurrent readers into the module. + * Calls into the module by syscall() start with this lock being + * held in exclusive mode. Depending on the requested operation, + * the lock may be downgraded to 'shared' mode to allow more + * concurrent readers into the module. Calls into the module from + * other parts of the kernel acquire the lock in shared mode. * * This SX lock is held in exclusive mode for any operations that * modify the linkages between the driver's internal data structures. * * The 'pmc_hook' function pointer is also protected by this lock. * It is only examined with the sx lock held in exclusive mode. The - * kernel module is allowed to be unloaded only with the sx lock - * held in exclusive mode. In normal syscall handling, after - * acquiring the pmc_sx lock we first check that 'pmc_hook' is - * non-null before proceeding. This prevents races between the - * thread unloading the module and other threads seeking to use the - * module. + * kernel module is allowed to be unloaded only with the sx lock held + * in exclusive mode. In normal syscall handling, after acquiring the + * pmc_sx lock we first check that 'pmc_hook' is non-null before + * proceeding. This prevents races between the thread unloading the module + * and other threads seeking to use the module. * * - Lookups of target process structures and owner process structures * cannot use the global "pmc_sx" SX lock because these lookups need * to happen during context switches and in other critical sections * where sleeping is not allowed. We protect these lookup tables * with their own private spin-mutexes, "pmc_processhash_mtx" and - * "pmc_ownerhash_mtx". These are 'leaf' mutexes, in that no other - * lock is acquired with these locks held. + * "pmc_ownerhash_mtx". * * - Interrupt handlers work in a lock free manner. At interrupt * time, handlers look at the PMC pointer (phw->phw_pmc) configured @@ -574,6 +573,14 @@ pmc_debugflags_sysctl_handler(SYSCTL_HANDLER_ARGS) * doing the PMCRELEASE operation waits by repeatedly doing a * pause() till the runcount comes to zero. * + * The contents of a PMC descriptor (struct pmc) are protected using + * a spin-mutex. In order to save space, we use a mutex pool. + * + * In terms of lock types used by witness(4), we use: + * - Type "pmc-sx", used by the global SX lock. + * - Type "pmc-sleep", for sleep mutexes used by logger threads. + * - Type "pmc-per-proc", for protecting PMC owner descriptors. + * - Type "pmc-leaf", used for all other spin mutexes. */ /* @@ -1756,7 +1763,7 @@ pmc_allocate_owner_descriptor(struct proc *p) LIST_INSERT_HEAD(poh, po, po_next); /* insert into hash table */ TAILQ_INIT(&po->po_logbuffers); - mtx_init(&po->po_mtx, "pmc-owner-mtx", "pmc", MTX_SPIN); + mtx_init(&po->po_mtx, "pmc-owner-mtx", "pmc-per-proc", MTX_SPIN); PMCDBG(OWN,ALL,1, "allocate-owner proc=%p (%d, %s) pmc-owner=%p", p, p->p_pid, p->p_comm, po); @@ -4184,13 +4191,15 @@ pmc_initialize(void) pmc_processhash = hashinit(pmc_hashsize, M_PMC, &pmc_processhashmask); - mtx_init(&pmc_processhash_mtx, "pmc-process-hash", "pmc", MTX_SPIN); + mtx_init(&pmc_processhash_mtx, "pmc-process-hash", "pmc-leaf", + MTX_SPIN); LIST_INIT(&pmc_ss_owners); pmc_ss_count = 0; /* allocate a pool of spin mutexes */ - pmc_mtxpool = mtx_pool_create("pmc", pmc_mtxpool_size, MTX_SPIN); + pmc_mtxpool = mtx_pool_create("pmc-leaf", pmc_mtxpool_size, + MTX_SPIN); PMCDBG(MOD,INI,1, "pmc_ownerhash=%p, mask=0x%lx " "targethash=%p mask=0x%lx", pmc_ownerhash, pmc_ownerhashmask, diff --git a/sys/dev/hwpmc/hwpmc_piv.c b/sys/dev/hwpmc/hwpmc_piv.c index 1a98a3d338b0..a6cd3fe6fe22 100644 --- a/sys/dev/hwpmc/hwpmc_piv.c +++ b/sys/dev/hwpmc/hwpmc_piv.c @@ -662,7 +662,7 @@ p4_init(int cpu) *pescr++ = P4_INVALID_PMC_INDEX; pmc_pcpu[cpu] = (struct pmc_cpu *) pcs; - mtx_init(&pcs->pc_mtx, "p4-pcpu", "pmc", MTX_SPIN); + mtx_init(&pcs->pc_mtx, "p4-pcpu", "pmc-leaf", MTX_SPIN); return 0; } -- cgit v1.2.3