diff -ur src.o/sys/kern/kern_linker.c src/sys/kern/kern_linker.c --- src.o/sys/kern/kern_linker.c Sun Mar 25 01:26:06 2007 +++ src/sys/kern/kern_linker.c Fri Apr 6 16:45:38 2007 @@ -869,7 +869,9 @@ kldname = NULL; modname = file; } - +#ifdef HWPMC_HOOKS + sx_slock(&pmc_sx); +#endif KLD_LOCK(); error = linker_load_module(kldname, modname, NULL, NULL, &lf); if (error) @@ -877,12 +879,15 @@ #ifdef HWPMC_HOOKS pkm.pm_file = lf->filename; pkm.pm_address = (uintptr_t) lf->address; - PMC_CALL_HOOK(td, PMC_FN_KLD_LOAD, (void *) &pkm); + PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_KLD_LOAD, (void *) &pkm); #endif lf->userrefs++; if (fileid != NULL) *fileid = lf->id; unlock: +#ifdef HWPMC_HOOKS + sx_sunlock(&pmc_sx); +#endif KLD_UNLOCK(); return (error); } @@ -921,6 +926,9 @@ if ((error = priv_check(td, PRIV_KLD_UNLOAD)) != 0) return (error); +#ifdef HWPMC_HOOKS + sx_slock(&pmc_sx); +#endif KLD_LOCK(); lf = linker_find_file_by_id(fileid); if (lf) { @@ -948,9 +956,12 @@ #ifdef HWPMC_HOOKS if (error == 0) - PMC_CALL_HOOK(td, PMC_FN_KLD_UNLOAD, (void *) &pkm); + PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_KLD_UNLOAD, (void *) &pkm); #endif KLD_UNLOCK(); +#ifdef HWPMC_HOOKS + sx_sunlock(&pmc_sx); +#endif return (error); } diff -ur src.o/sys/kern/subr_witness.c src/sys/kern/subr_witness.c --- src.o/sys/kern/subr_witness.c Fri Apr 6 13:02:24 2007 +++ src/sys/kern/subr_witness.c Fri Apr 6 19:08:20 2007 @@ -274,6 +274,7 @@ /* * sx locks */ + { "pmc_sx", &lock_class_sx }, { "proctree", &lock_class_sx }, { "allproc", &lock_class_sx }, { "user map", &lock_class_sx }, @@ -397,6 +398,7 @@ { "zstty", &lock_class_mtx_spin }, { "fast_taskqueue", &lock_class_mtx_spin }, { "intr table", &lock_class_mtx_spin }, + { "pmc-owner-mtx", &lock_class_mtx_spin }, { "sleepq chain", &lock_class_mtx_spin }, { "sched lock", &lock_class_mtx_spin }, { "turnstile chain", &lock_class_mtx_spin }, @@ -435,6 +437,11 @@ { "tw_cl_io_lock", &lock_class_mtx_spin }, { "tw_cl_intr_lock", &lock_class_mtx_spin }, { "tw_cl_gen_lock", &lock_class_mtx_spin }, + /* hwpmc(8) */ + { "pmc-buffer-list", &lock_class_mtx_spin }, + { "pmc-process-hash", &lock_class_mtx_spin }, + { "pmc-mtxpool", &lock_class_mtx_spin }, + { "p4-pcpu", &lock_class_mtx_spin }, { NULL, NULL }, { NULL, NULL } }; diff -ur src.o/sys/vm/vm_mmap.c src/sys/vm/vm_mmap.c --- src.o/sys/vm/vm_mmap.c Mon Nov 6 13:42:10 2006 +++ src/sys/vm/vm_mmap.c Fri Apr 6 16:40:51 2007 @@ -375,6 +375,7 @@ error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, flags, handle_type, handle, pos); #ifdef HWPMC_HOOKS + sx_assert(&pmc_sx, SX_UNLOCKED); /* inform hwpmc(4) if an executable is being mapped */ if (error == 0 && handle_type == OBJT_VNODE && (prot & PROT_EXEC)) { @@ -521,6 +522,7 @@ vm_offset_t addr; vm_size_t size, pageoff; vm_map_t map; + int error = 0; addr = (vm_offset_t) uap->addr; size = uap->len; @@ -540,13 +542,16 @@ map = &td->td_proc->p_vmspace->vm_map; if (addr < vm_map_min(map) || addr + size > vm_map_max(map)) return (EINVAL); +#ifdef HWPMC_HOOKS + sx_slock(&pmc_sx); +#endif vm_map_lock(map); /* * Make sure entire range is allocated. */ if (!vm_map_check_protection(map, addr, addr + size, VM_PROT_NONE)) { - vm_map_unlock(map); - return (EINVAL); + error = EINVAL; + goto done; } #ifdef HWPMC_HOOKS /* @@ -561,7 +566,7 @@ entry->end, VM_PROT_EXECUTE) == TRUE) { pkm.pm_address = (uintptr_t) addr; pkm.pm_size = (size_t) size; - PMC_CALL_HOOK(td, PMC_FN_MUNMAP, + PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_MUNMAP, (void *) &pkm); break; } @@ -570,8 +575,12 @@ #endif /* returns nothing but KERN_SUCCESS anyway */ vm_map_delete(map, addr, addr + size); +done: vm_map_unlock(map); - return (0); +#ifdef HWPMC_HOOKS + sx_sunlock(&pmc_sx); +#endif + return (error); } #ifndef _SYS_SYSPROTO_H_ diff -ur src.o/sys/dev/hwpmc/hwpmc_logging.c src/sys/dev/hwpmc/hwpmc_logging.c --- src.o/sys/dev/hwpmc/hwpmc_logging.c Sun Mar 26 12:20:53 2006 +++ src/sys/dev/hwpmc/hwpmc_logging.c Fri Apr 6 16:47:53 2007 @@ -973,8 +973,8 @@ 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", NULL, MTX_SPIN); + mtx_init(&pmc_kthread_mtx, "pmc-kthread", NULL, MTX_DEF); } /* diff -ur src.o/sys/dev/hwpmc/hwpmc_mod.c src/sys/dev/hwpmc/hwpmc_mod.c --- src.o/sys/dev/hwpmc/hwpmc_mod.c Sun Mar 25 01:25:33 2007 +++ src/sys/dev/hwpmc/hwpmc_mod.c Fri Apr 6 16:49:04 2007 @@ -1756,7 +1756,7 @@ 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", NULL, 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 +4184,14 @@ 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", NULL, 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-mtxpool", 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 -ur src.o/sys/dev/hwpmc/hwpmc_piv.c src/sys/dev/hwpmc/hwpmc_piv.c --- src.o/sys/dev/hwpmc/hwpmc_piv.c Tue Mar 28 14:09:21 2006 +++ src/sys/dev/hwpmc/hwpmc_piv.c Fri Apr 6 16:48:38 2007 @@ -662,7 +662,7 @@ *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", NULL, MTX_SPIN); return 0; } Only in src/sys/dev/hwpmc: s