NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/49695: Panic on modunload dtrace during running dtrace command



>Number:         49695
>Category:       kern
>Synopsis:       Panic on modunload dtrace during running dtrace command
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Feb 25 08:20:00 +0000 2015
>Originator:     Ryota Ozaki
>Release:        current (7.99.5)
>Organization:
>Environment:
NetBSD kvm 7.99.5 NetBSD 7.99.5 (KVM) #122: Wed Feb 25 11:52:26 JST 2015  ozaki-r@(hidden)
>Description:
dtrace.kmod doesn't take care of its module unloading. It tries to unload itself regardless of dtrace users and easily causes a panic. Additionally dtrace.kmod has to handle auto-unloading.

This problem is reported by B Harder.
>How-To-Repeat:
modload dtrace
dtrace -n BEGIN &
modunload dtrace
>Fix:
This patch includes two fixes. One is to abandon unloading by checking if there are users of dtrace (/dev/dtrace/dtrace). The other is to forbid auto-unloading that isn't supported for now.

diff --git a/external/cddl/osnet/dev/dtrace/dtrace_modevent.c b/external/cddl/osnet/dev/dtrace/dtrace_modevent.c
index 9df0cd1..30e6b0c 100644
--- a/external/cddl/osnet/dev/dtrace/dtrace_modevent.c
+++ b/external/cddl/osnet/dev/dtrace/dtrace_modevent.c
@@ -29,6 +29,7 @@ static int
 dtrace_modcmd(modcmd_t cmd, void *data)
 {
 	int bmajor = -1, cmajor = -1;
+	int error;
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
@@ -36,8 +37,12 @@ dtrace_modcmd(modcmd_t cmd, void *data)
 		return devsw_attach("dtrace", NULL, &bmajor,
 		    &dtrace_cdevsw, &cmajor);
 	case MODULE_CMD_FINI:
-		dtrace_unload();
+		error = dtrace_unload();
+		if (error != 0)
+			return error;
 		return devsw_detach(NULL, &dtrace_cdevsw);
+	case MODULE_CMD_AUTOUNLOAD:
+		return EBUSY;
 	default:
 		return ENOTTY;
 	}
diff --git a/external/cddl/osnet/dev/dtrace/dtrace_unload.c b/external/cddl/osnet/dev/dtrace/dtrace_unload.c
index 0d9f9fa..87b7a8e 100644
--- a/external/cddl/osnet/dev/dtrace/dtrace_unload.c
+++ b/external/cddl/osnet/dev/dtrace/dtrace_unload.c
@@ -37,9 +37,7 @@ dtrace_unload()
 	mutex_enter(&dtrace_lock);
 	mutex_enter(&cpu_lock);
 
-	ASSERT(dtrace_opens == 0);
-
-	if (dtrace_helpers > 0) {
+	if (dtrace_opens > 0 || dtrace_helpers > 0) {
 		mutex_exit(&cpu_lock);
 		mutex_exit(&dtrace_lock);
 		mutex_exit(&dtrace_provider_lock);



Home | Main Index | Thread Index | Old Index