Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Jul 2007 01:33:47 GMT
From:      Cristian KLEIN <cristi@net.utcluj.ro>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/114649: [patch][acpi] panic: recursed on non-recursive mutex
Message-ID:  <200707170133.l6H1Xlv8015631@www.freebsd.org>
Resent-Message-ID: <200707170140.l6H1e3u3012498@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         114649
>Category:       kern
>Synopsis:       [patch][acpi] panic: recursed on non-recursive mutex
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jul 17 01:40:03 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Cristian KLEIN
>Release:        7.0-CURRENT
>Organization:
Technical University of Cluj-Napoca
>Environment:
FreeBSD hades.local 7.0-CURRENT FreeBSD 7.0-CURRENT #11: Tue Jul 17 04:08:17 EEST 2007     cristi@hades.local:/usr/obj/usr/src/sys/GENERIC  i386
(source updated immediately before compiling)

>Description:
When resuming (from S3) an IBM Thinkpad R51 laptop, KDB is entered with the following panic string (written by hand):

panic: _mtx_lock_sleep: recursed on non-recursive mutex acpi subsystem GPE lock
@ ......./OsdSynch.c:377
>How-To-Repeat:
Suspend (S3) / resume a laptop. Panic will always occur after the first resume.

>Fix:
It seems to me that ACPI vendor code was not designed to use non-recursive mutexes. For example:

* AcpiEvGpeDetect() calls AcpiOsAcquireLock(AcpiGbl_GpeLock) in contrib/dev/acpica/evgpe.c:511, then calls AcpiEvGpeDispatch()
* AcpiEvGpeDispatch() calls AcpiHwDisableAllGpes() in evgpe.c:762
* AcpiHwDisableAllGpes() calls AcpiEvWalkGpeList in hwgpe.c:487
* AcpiEvWalkGpeList() calls AcpiOsAcquireLock(AcpiGbl_GpeLock) *again* in evgpeblk.c:237

Rather that correcting contributed code (in who knows how many places) and then have problems in the future (when the ACPI vendor code is upgraded), I suggest making the ACPI GPE lock recursable. The patch below does this.

After applying this patch, I've been able to suspend / resume 20+ times.

Patch attached with submission follows:

--- sys/dev/acpica/Osd/OsdSynch.c.orig	2007-03-27 02:04:02.000000000 +0300
+++ sys/dev/acpica/Osd/OsdSynch.c	2007-07-17 04:17:37.073597342 +0300
@@ -346,7 +346,7 @@
 	snprintf(h->name, sizeof(h->name), "acpi subsystem HW lock");
     else
 	snprintf(h->name, sizeof(h->name), "acpi subsys %p", OutHandle);
-    mtx_init(&h->lock, h->name, NULL, MTX_DEF);
+    mtx_init(&h->lock, h->name, NULL, MTX_DEF | MTX_RECURSE);
     *OutHandle = (ACPI_SPINLOCK)h;
     return (AE_OK);
 }


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707170133.l6H1Xlv8015631>