On Thu, Oct 07, 2021 at 06:05:24PM +0200, Uwe Kleine-König wrote: > On an ARM board with an spi-mux I observe a deadlock during boot. This > happens because spi_add_device() (in drivers/spi/spi.c) for the spi-mux > device calls device_add() while holding &spi_add_lock. The spi-mux > driver's probe routine than creates another controller and for the > devices on that bus spi_add_device() is called again, trying to grab > &spi_add_lock again. > > The easy workaround would be to replace &spi_add_lock with a > per-controller lock, Either that or register the controller from spi-mux asynchronously by way of a work item. > There is also a check: > > if (IS_ENABLED(CONFIG_SPI_DYNAMIC) && > !device_is_registered(&ctlr->dev)) { > return -NODEV; > } > > which catches the race that the controller (which is also the device's > parent) is about to go while we try to add a new device to it. Is this a > real problem? (The spi_unregister_controller() function unregisters all > children which might race with adding a new child without locking. This > check was implemented by Lukas Wunner (on Cc:) in commit ddf75be47ca7.) > Doesn't all children of a given device are unregistered automatically by > the device core somehow when said device is unregistered? (I checked, > but didn't find anything.) No, the device core makes no such guarantee. Thanks, Lukas