lkml.org 
[lkml]   [2021]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 143/169] spi-mux: Fix false-positive lockdep splats
    Date
    From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

    [ Upstream commit 16a8e2fbb2d49111004efc1c7342e083eafabeb0 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi-mux.c | 7 +++++++
    drivers/spi/spi.c | 12 ++++++------
    2 files changed, 13 insertions(+), 6 deletions(-)

    diff --git a/drivers/spi/spi-mux.c b/drivers/spi/spi-mux.c
    index 9708b7827ff7..f5d32ec4634e 100644
    --- a/drivers/spi/spi-mux.c
    +++ b/drivers/spi/spi-mux.c
    @@ -137,6 +137,13 @@ static int spi_mux_probe(struct spi_device *spi)
    priv = spi_controller_get_devdata(ctlr);
    priv->spi = spi;

    + /*
    + * Increase lockdep class as these lock are taken while the parent bus
    + * already holds their instance's lock.
    + */
    + lockdep_set_subclass(&ctlr->io_mutex, 1);
    + lockdep_set_subclass(&ctlr->add_lock, 1);
    +
    priv->mux = devm_mux_control_get(&spi->dev, NULL);
    if (IS_ERR(priv->mux)) {
    ret = dev_err_probe(&spi->dev, PTR_ERR(priv->mux),
    diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
    index 2c342bded058..3093e0041158 100644
    --- a/drivers/spi/spi.c
    +++ b/drivers/spi/spi.c
    @@ -2549,6 +2549,12 @@ struct spi_controller *__spi_alloc_controller(struct device *dev,
    return NULL;

    device_initialize(&ctlr->dev);
    + INIT_LIST_HEAD(&ctlr->queue);
    + spin_lock_init(&ctlr->queue_lock);
    + spin_lock_init(&ctlr->bus_lock_spinlock);
    + mutex_init(&ctlr->bus_lock_mutex);
    + mutex_init(&ctlr->io_mutex);
    + mutex_init(&ctlr->add_lock);
    ctlr->bus_num = -1;
    ctlr->num_chipselect = 1;
    ctlr->slave = slave;
    @@ -2821,12 +2827,6 @@ int spi_register_controller(struct spi_controller *ctlr)
    return id;
    ctlr->bus_num = id;
    }
    - INIT_LIST_HEAD(&ctlr->queue);
    - spin_lock_init(&ctlr->queue_lock);
    - spin_lock_init(&ctlr->bus_lock_spinlock);
    - mutex_init(&ctlr->bus_lock_mutex);
    - mutex_init(&ctlr->io_mutex);
    - mutex_init(&ctlr->add_lock);
    ctlr->bus_lock_flag = 0;
    init_completion(&ctlr->xfer_completion);
    if (!ctlr->max_dma_len)
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-10-25 22:10    [W:4.655 / U:0.232 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site