NetBSD Problem Report #49695

From www@NetBSD.org  Wed Feb 25 08:16:36 2015
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [149.20.53.66])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.netbsd.org", Issuer "Postmaster NetBSD.org" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 48D8FA654B
	for <gnats-bugs@gnats.NetBSD.org>; Wed, 25 Feb 2015 08:16:36 +0000 (UTC)
Message-Id: <20150225081634.F0C62A65B6@mollari.NetBSD.org>
Date: Wed, 25 Feb 2015 08:16:34 +0000 (UTC)
From: ozaki-r@netbsd.org
Reply-To: ozaki-r@netbsd.org
To: gnats-bugs@NetBSD.org
Subject: Panic on modunload dtrace during running dtrace command
X-Send-Pr-Version: www-1.0

>Number:         49695
>Category:       kern
>Synopsis:       Panic on modunload dtrace during running dtrace command
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pgoyette
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Feb 25 08:20:00 +0000 2015
>Closed-Date:    Sat Nov 28 09:32:24 +0000 2015
>Last-Modified:  Sat Nov 28 09:32:24 +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);

>Release-Note:

>Audit-Trail:
From: Ryota Ozaki <ozaki-r@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: kern/49695: Panic on modunload dtrace during running dtrace command
Date: Wed, 25 Feb 2015 17:48:30 +0900

 On Wed, Feb 25, 2015 at 5:20 PM,  <ozaki-r@netbsd.org> wrote:
 >>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;
 >         }

 A similar handling should be required by sdt.kmod and fbt.kmod.

   ozaki-r

 > 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);
 >

From: "Ryota Ozaki" <ozaki-r@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/49695 CVS commit: src/external/cddl/osnet/dev
Date: Thu, 26 Feb 2015 09:10:53 +0000

 Module Name:	src
 Committed By:	ozaki-r
 Date:		Thu Feb 26 09:10:53 UTC 2015

 Modified Files:
 	src/external/cddl/osnet/dev/dtrace: dtrace_modevent.c dtrace_unload.c
 	src/external/cddl/osnet/dev/fbt: fbt.c
 	src/external/cddl/osnet/dev/sdt: sdt.c

 Log Message:
 Fix module unload of dtrace, sdt and fbt

 - Don't unload when there are users of dtrace
 - Forbid auto unloading (not supported for now)

 PR 49695


 To generate a diff of this commit:
 cvs rdiff -u -r1.3 -r1.4 src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c
 cvs rdiff -u -r1.5 -r1.6 src/external/cddl/osnet/dev/dtrace/dtrace_unload.c
 cvs rdiff -u -r1.16 -r1.17 src/external/cddl/osnet/dev/fbt/fbt.c
 cvs rdiff -u -r1.9 -r1.10 src/external/cddl/osnet/dev/sdt/sdt.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

Responsible-Changed-From-To: kern-bug-people->pgoyette
Responsible-Changed-By: pgoyette@NetBSD.org
Responsible-Changed-When: Sat, 28 Nov 2015 03:12:52 +0000
Responsible-Changed-Why:
A fix was committed, but no-one took responsibility. I might as well grab it.


State-Changed-From-To: open->feedback
State-Changed-By: pgoyette@NetBSD.org
State-Changed-When: Sat, 28 Nov 2015 03:12:52 +0000
State-Changed-Why:
A fix was committed.  Move to feedback to hopefully originator will confirm
that the problem is fixed.


State-Changed-From-To: feedback->closed
State-Changed-By: ozaki-r@NetBSD.org
State-Changed-When: Sat, 28 Nov 2015 09:32:24 +0000
State-Changed-Why:
I forgot to close the PR, sorry. I confirmed again with a latest kernel.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2014 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.