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



The following reply was made to PR kern/56438; it has been noted by GNATS.

From: Brad Spencer <brad%anduin.eldar.org@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Subject: Re: kern/56438: panic when trying to use gpioiic in -current 9.99.90
Date: Fri, 08 Oct 2021 05:51:48 -0400

 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 17:20:02 -0000 (UTC)
 >
 >  brad%anduin.eldar.org@localhost (Brad Spencer) writes:
 >  
 >  >mlelstv%serpens.de@localhost (Michael van Elst) writes:
 >  
 >  >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,
 >  
 >  Yes, but there are a few more cases. And the compat50 code misses any kind
 >  of locking.
 >  
 
 After a bit of back and forth email with Michael van Elst who provided
 more explanation... included is a more complete patch.  I tested
 attaching and detaching on real hardware with real devices.  I can't
 test the 5.0 path as I don't have anything that old and I am not sure
 rescan at the gpio device level will do much as the busses lower down,
 in particular, gpioiic and gpioow do not support the concept of rescan
 and I think that they would have to.  In any case, the rescan case
 doesn't panic either.  This probably should be commited as it improves
 the situation with -current.
 
 --- src/sys/dev/gpio/gpio.c.ORIG	2021-09-26 13:41:58.259633657 -0400
 +++ src/sys/dev/gpio/gpio.c	2021-10-05 07:01:37.664529748 -0400
 @@ -172,12 +172,14 @@
  	if (error)
  		return;
  
 +	KERNEL_LOCK(1, NULL);
  	LIST_FOREACH(gdev, &sc->sc_devs, sc_next)
  		if (gdev->sc_dev == child) {
  			LIST_REMOVE(gdev, sc_next);
  			kmem_free(gdev, sizeof(struct gpio_dev));
  			break;
  		}
 +	KERNEL_UNLOCK_ONE(NULL);
  
  	mutex_enter(&sc->sc_mtx);
  	sc->sc_attach_busy = 0;
 @@ -190,8 +192,10 @@
  gpio_rescan(device_t self, const char *ifattr, const int *locators)
  {
  
 +	KERNEL_LOCK(1, NULL);
  	config_search(self, NULL,
  	    CFARGS(.search = gpio_search));
 +	KERNEL_UNLOCK_ONE(NULL);
  
  	return 0;
  }
 @@ -849,6 +853,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 +874,8 @@
  #endif
  		} else
  			error = EINVAL;
 +		KERNEL_UNLOCK_ONE(NULL);
 +
  		mutex_enter(&sc->sc_mtx);
  		sc->sc_attach_busy = 0;
  		cv_signal(&sc->sc_attach);
 @@ -1106,6 +1113,7 @@
  		if (error)
  			return EBUSY;
  
 +		KERNEL_LOCK(1, NULL);
  		attach = data;
  		LIST_FOREACH(gdev, &sc->sc_devs, sc_next) {
  			if (strcmp(device_xname(gdev->sc_dev),
 @@ -1115,11 +1123,15 @@
  				cv_signal(&sc->sc_attach);
  				mutex_exit(&sc->sc_mtx);
  
 -				if (config_detach(gdev->sc_dev, 0) == 0)
 +				if (config_detach(gdev->sc_dev, 0) == 0) {
 +					KERNEL_UNLOCK_ONE(NULL);
  					return 0;
 +				}
  				break;
  			}
  		}
 +		KERNEL_UNLOCK_ONE(NULL);
 +
  		if (gdev == NULL) {
  			mutex_enter(&sc->sc_mtx);
  			sc->sc_attach_busy = 0;
 
 
 
 -- 
 Brad Spencer - brad%anduin.eldar.org@localhost - KC8VKS - http://anduin.eldar.org
 


Home | Main Index | Thread Index | Old Index