lkml.org 
[lkml]   [2021]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 64/74] iio: dln2-adc: Fix lockdep complaint
    Date
    From: Noralf Trønnes <noralf@tronnes.org>

    commit 59f92868176f191eefde70d284bdfc1ed76a84bc upstream.

    When reading the voltage:

    $ cat /sys/bus/iio/devices/iio\:device0/in_voltage0_raw

    Lockdep complains:

    [ 153.910616] ======================================================
    [ 153.916918] WARNING: possible circular locking dependency detected
    [ 153.923221] 5.14.0+ #5 Not tainted
    [ 153.926692] ------------------------------------------------------
    [ 153.932992] cat/717 is trying to acquire lock:
    [ 153.937525] c2585358 (&indio_dev->mlock){+.+.}-{3:3}, at: iio_device_claim_direct_mode+0x28/0x44
    [ 153.946541]
    but task is already holding lock:
    [ 153.952487] c2585860 (&dln2->mutex){+.+.}-{3:3}, at: dln2_adc_read_raw+0x94/0x2bc [dln2_adc]
    [ 153.961152]
    which lock already depends on the new lock.

    Fix this by not calling into the iio core underneath the dln2->mutex lock.

    Fixes: 7c0299e879dd ("iio: adc: Add support for DLN2 ADC")
    Cc: Jack Andersen <jackoalan@gmail.com>
    Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
    Link: https://lore.kernel.org/r/20211018113731.25723-1-noralf@tronnes.org
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/iio/adc/dln2-adc.c | 15 +++++++--------
    1 file changed, 7 insertions(+), 8 deletions(-)

    --- a/drivers/iio/adc/dln2-adc.c
    +++ b/drivers/iio/adc/dln2-adc.c
    @@ -251,7 +251,6 @@ static int dln2_adc_set_chan_period(stru
    static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)
    {
    int ret, i;
    - struct iio_dev *indio_dev = platform_get_drvdata(dln2->pdev);
    u16 conflict;
    __le16 value;
    int olen = sizeof(value);
    @@ -260,13 +259,9 @@ static int dln2_adc_read(struct dln2_adc
    .chan = channel,
    };

    - ret = iio_device_claim_direct_mode(indio_dev);
    - if (ret < 0)
    - return ret;
    -
    ret = dln2_adc_set_chan_enabled(dln2, channel, true);
    if (ret < 0)
    - goto release_direct;
    + return ret;

    ret = dln2_adc_set_port_enabled(dln2, true, &conflict);
    if (ret < 0) {
    @@ -303,8 +298,6 @@ disable_port:
    dln2_adc_set_port_enabled(dln2, false, NULL);
    disable_chan:
    dln2_adc_set_chan_enabled(dln2, channel, false);
    -release_direct:
    - iio_device_release_direct_mode(indio_dev);

    return ret;
    }
    @@ -340,10 +333,16 @@ static int dln2_adc_read_raw(struct iio_

    switch (mask) {
    case IIO_CHAN_INFO_RAW:
    + ret = iio_device_claim_direct_mode(indio_dev);
    + if (ret < 0)
    + return ret;
    +
    mutex_lock(&dln2->mutex);
    ret = dln2_adc_read(dln2, chan->channel);
    mutex_unlock(&dln2->mutex);

    + iio_device_release_direct_mode(indio_dev);
    +
    if (ret < 0)
    return ret;


    \
     
     \ /
      Last update: 2021-12-13 11:10    [W:4.117 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site