From b99aa0fbb203fa85c8be47b883449d6516393c66 Mon Sep 17 00:00:00 2001 From: Matt Macy Date: Tue, 29 May 2018 18:03:48 +0000 Subject: [PATCH] hwpmc: don't enter epoch section across mmap hook --- sys/dev/hwpmc/hwpmc_mod.c | 3 ++- sys/kern/vfs_vnops.c | 2 +- sys/sys/pmckern.h | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c index ba9f0cff19b..dab8dfe789a 100644 --- a/sys/dev/hwpmc/hwpmc_mod.c +++ b/sys/dev/hwpmc/hwpmc_mod.c @@ -1717,7 +1717,7 @@ pmc_process_mmap(struct thread *td, struct pmckern_map_in *pkm) const struct pmc_process *pp; freepath = fullpath = NULL; - epoch_exit_preempt(global_epoch_preempt); + MPASS(!in_epoch()); pmc_getfilename((struct vnode *) pkm->pm_file, &fullpath, &freepath); pid = td->td_proc->p_pid; @@ -1743,6 +1743,7 @@ pmc_process_mmap(struct thread *td, struct pmckern_map_in *pkm) done: if (freepath) free(freepath, M_TEMP); + epoch_exit_preempt(global_epoch_preempt); } diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 5d3efc7a820..f8fb7ca4c12 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -2494,7 +2494,7 @@ vn_mmap(struct file *fp, vm_map_t map, vm_offset_t *addr, vm_size_t size, if ((prot & VM_PROT_EXECUTE) != 0 && error == 0) { pkm.pm_file = vp; pkm.pm_address = (uintptr_t) *addr; - PMC_CALL_HOOK(td, PMC_FN_MMAP, (void *) &pkm); + PMC_CALL_HOOK_UNLOCKED(td, PMC_FN_MMAP, (void *) &pkm); } } #endif diff --git a/sys/sys/pmckern.h b/sys/sys/pmckern.h index a0e59b99ed4..da2aae5fc84 100644 --- a/sys/sys/pmckern.h +++ b/sys/sys/pmckern.h @@ -217,7 +217,8 @@ do { \ */ #define PMC_CALL_HOOK_UNLOCKED(t, cmd, arg) \ do { \ - if (pmc_hook != NULL) \ + MPASS(!in_epoch()); \ + if (pmc_hook != NULL) \ (pmc_hook)((t), (cmd), (arg)); \ } while (0)