summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2013-10-08 12:56:46 +0000
committermarkj <markj@FreeBSD.org>2013-10-08 12:56:46 +0000
commit4e3872abc7d06e32c81c7d991a15245489dfa749 (patch)
tree0ac019beee24414f3072bb5d72839a91ed0b4571 /sys/cddl
parent66c01d36f385e2199625a2464868668ab1a69ba8 (diff)
downloadFreeBSD-src-4e3872abc7d06e32c81c7d991a15245489dfa749.zip
FreeBSD-src-4e3872abc7d06e32c81c7d991a15245489dfa749.tar.gz
Initialize and free the DTrace taskqueue in the dtrace module load/unload
handlers rather than in the dtrace device open/close methods. The current approach can cause a panic if the device is closed which the taskqueue thread is active, or if a kernel module containing a provider is unloaded while retained enablings are present and the dtrace device isn't opened. Submitted by: gibbs (original version) Reviewed by: gibbs Approved by: re (glebius) MFC after: 2 weeks
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c9
-rw-r--r--sys/cddl/dev/dtrace/dtrace_load.c2
-rw-r--r--sys/cddl/dev/dtrace/dtrace_unload.c2
3 files changed, 4 insertions, 9 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index babc42c..dae6dba 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -15751,10 +15751,6 @@ dtrace_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
#else
devfs_set_cdevpriv(state, dtrace_dtr);
#endif
- /* This code actually belongs in dtrace_attach() */
- if (dtrace_opens == 1)
- dtrace_taskq = taskq_create("dtrace_taskq", 1, maxclsyspri,
- 1, INT_MAX, 0);
#endif
mutex_exit(&cpu_lock);
@@ -15842,11 +15838,6 @@ dtrace_dtr(void *data)
(void) kdi_dtrace_set(KDI_DTSET_DTRACE_DEACTIVATE);
#else
--dtrace_opens;
- /* This code actually belongs in dtrace_detach() */
- if ((dtrace_opens == 0) && (dtrace_taskq != NULL)) {
- taskq_destroy(dtrace_taskq);
- dtrace_taskq = NULL;
- }
#endif
mutex_exit(&dtrace_lock);
diff --git a/sys/cddl/dev/dtrace/dtrace_load.c b/sys/cddl/dev/dtrace/dtrace_load.c
index 05436fe..5d59a04 100644
--- a/sys/cddl/dev/dtrace/dtrace_load.c
+++ b/sys/cddl/dev/dtrace/dtrace_load.c
@@ -56,6 +56,8 @@ dtrace_load(void *dummy)
/* Hang our hook for exceptions. */
dtrace_invop_init();
+ dtrace_taskq = taskq_create("dtrace_taskq", 1, maxclsyspri, 0, 0, 0);
+
/* Register callbacks for linker file load and unload events. */
dtrace_kld_load_tag = EVENTHANDLER_REGISTER(kld_load,
dtrace_kld_load, NULL, EVENTHANDLER_PRI_ANY);
diff --git a/sys/cddl/dev/dtrace/dtrace_unload.c b/sys/cddl/dev/dtrace/dtrace_unload.c
index e9bd53c..41b7538 100644
--- a/sys/cddl/dev/dtrace/dtrace_unload.c
+++ b/sys/cddl/dev/dtrace/dtrace_unload.c
@@ -127,6 +127,8 @@ dtrace_unload()
mutex_destroy(&dtrace_errlock);
#endif
+ taskq_destroy(dtrace_taskq);
+
/* Reset our hook for exceptions. */
dtrace_invop_uninit();
OpenPOWER on IntegriCloud