NetBSD-Bugs archive

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

Re: kern/56438: panic when trying to use gpioiic in -current 9.99.90



mlelstv%serpens.de@localhost (Michael van Elst) writes:

> The following reply was made to PR kern/56438; it has been noted by GNATS.
>
> From: mlelstv%serpens.de@localhost (Michael van Elst)
> To: gnats-bugs%netbsd.org@localhost
> Cc: 
> Subject: Re: kern/56438: panic when trying to use gpioiic in -current 9.99.90
> Date: Mon, 4 Oct 2021 05:42:14 -0000 (UTC)
>
>  brad%anduin.eldar.org@localhost writes:
>  
>  >[  13.2358565] panic: kernel diagnostic assertion "KERNEL_LOCKED_P()" failed: file "../../../../kern/subr_autoconf.c", line 1053
>  >[  13.2487462] cpu0: Begin traceback...
>  >[  13.2487462] 0xd1cf1b5c: netbsd:db_panic+0x14
>  >[  13.2562360] 0xd1cf1b74: netbsd:vpanic+0x148
>  >[  13.2562360] 0xd1cf1b8c: netbsd:__aeabi_uldivmod
>  >[  13.2562360] 0xd1cf1bc4: netbsd:config_match+0x88
>  >[  13.2680444] 0xd1cf1be4: netbsd:mapply+0x4c
>  >[  13.2680444] 0xd1cf1c34: netbsd:config_search_internal+0x1a8
>  >[  13.2771142] 0xd1cf1c5c: netbsd:config_search+0x90
>  >[  13.2771142] 0xd1cf1cf4: netbsd:gpioioctl+0x3b0
>  
>  The attachment framework nowadays enforces that it is called with
>  the kernel lock held. Since gpio(4) is tagged as 'mpsafe' it has
>  to care itself about taking the kernel lock.
>  


So, something like the following..  I made this change and tested it and
the panic appears to be gone and devices attach as expected again, but
as I mentioned I am not that familar with the autoconfig framework.  I
can commit this if there isn't any objections.

--- gpio.c.ORIG 2021-09-26 13:41:58.259633657 -0400
+++ gpio.c      2021-10-04 08:02:22.584845545 -0400
@@ -849,6 +849,7 @@
                locs[GPIOCF_MASK] = ga.ga_mask;
                locs[GPIOCF_FLAG] = ga.ga_flags;
 
+               KERNEL_LOCK(1, NULL);
                cf = config_search(sc->sc_dev, &ga,
                    CFARGS(.locators = locs));
                if (cf != NULL) {
@@ -869,6 +870,7 @@
 #endif
                } else
                        error = EINVAL;
+               KERNEL_UNLOCK_ONE(NULL);
                mutex_enter(&sc->sc_mtx);
                sc->sc_attach_busy = 0;
                cv_signal(&sc->sc_attach);





-- 
Brad Spencer - brad%anduin.eldar.org@localhost - KC8VKS - http://anduin.eldar.org


Home | Main Index | Thread Index | Old Index