Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi-mux: Fix false-positive lockdep splats

io_mutex is taken by spi_setup() and spi-mux's .setup() callback calls
spi_setup() which results in a nested lock of io_mutex.

add_lock is taken by spi_add_device(). The device_add() call in there
can result in calling spi-mux's .probe() callback which registers its
own spi controller which in turn results in spi_add_device() being
called again.

To fix this initialize the controller's locks already in
spi_alloc_controller() to give spi_mux_probe() a chance to set the
lockdep subclass.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20211013133710.2679703-2-u.kleine-koenig@pengutronix.de
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Uwe Kleine-König and committed by
Mark Brown
16a8e2fb 6098475d

+13 -6
+7
drivers/spi/spi-mux.c
··· 137 137 priv = spi_controller_get_devdata(ctlr); 138 138 priv->spi = spi; 139 139 140 + /* 141 + * Increase lockdep class as these lock are taken while the parent bus 142 + * already holds their instance's lock. 143 + */ 144 + lockdep_set_subclass(&ctlr->io_mutex, 1); 145 + lockdep_set_subclass(&ctlr->add_lock, 1); 146 + 140 147 priv->mux = devm_mux_control_get(&spi->dev, NULL); 141 148 if (IS_ERR(priv->mux)) { 142 149 ret = dev_err_probe(&spi->dev, PTR_ERR(priv->mux),
+6 -6
drivers/spi/spi.c
··· 2547 2547 return NULL; 2548 2548 2549 2549 device_initialize(&ctlr->dev); 2550 + INIT_LIST_HEAD(&ctlr->queue); 2551 + spin_lock_init(&ctlr->queue_lock); 2552 + spin_lock_init(&ctlr->bus_lock_spinlock); 2553 + mutex_init(&ctlr->bus_lock_mutex); 2554 + mutex_init(&ctlr->io_mutex); 2555 + mutex_init(&ctlr->add_lock); 2550 2556 ctlr->bus_num = -1; 2551 2557 ctlr->num_chipselect = 1; 2552 2558 ctlr->slave = slave; ··· 2825 2819 return id; 2826 2820 ctlr->bus_num = id; 2827 2821 } 2828 - INIT_LIST_HEAD(&ctlr->queue); 2829 - spin_lock_init(&ctlr->queue_lock); 2830 - spin_lock_init(&ctlr->bus_lock_spinlock); 2831 - mutex_init(&ctlr->bus_lock_mutex); 2832 - mutex_init(&ctlr->io_mutex); 2833 - mutex_init(&ctlr->add_lock); 2834 2822 ctlr->bus_lock_flag = 0; 2835 2823 init_completion(&ctlr->xfer_completion); 2836 2824 if (!ctlr->max_dma_len)