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:
(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.