Skip to content

Commit f028748

Browse files
lucaceresoliUlrich Hecht
authored andcommitted
iio: light: opt3001: fix deadlock due to concurrent flag access
[ Upstream commit f063a28002e3350088b4577c5640882bf4ea17ea ] The threaded IRQ function in this driver is reading the flag twice: once to lock a mutex and once to unlock it. Even though the code setting the flag is designed to prevent it, there are subtle cases where the flag could be true at the mutex_lock stage and false at the mutex_unlock stage. This results in the mutex not being unlocked, resulting in a deadlock. Fix it by making the opt3001_irq() code generally more robust, reading the flag into a variable and using the variable value at both stages. Fixes: 94a9b7b ("iio: light: add support for TI's opt3001 light sensor") Cc: stable@vger.kernel.org Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Link: https://patch.msgid.link/20250321-opt3001-irq-fix-v1-1-6c520d851562@bootlin.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> [ Adjust context ] Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Ulrich Hecht <uli@kernel.org>
1 parent ae9d3e7 commit f028748

1 file changed

Lines changed: 3 additions & 2 deletions

File tree

drivers/iio/light/opt3001.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -699,8 +699,9 @@ static irqreturn_t opt3001_irq(int irq, void *_iio)
699699
struct opt3001 *opt = iio_priv(iio);
700700
int ret;
701701
bool wake_result_ready_queue = false;
702+
bool ok_to_ignore_lock = opt->ok_to_ignore_lock;
702703

703-
if (!opt->ok_to_ignore_lock)
704+
if (!ok_to_ignore_lock)
704705
mutex_lock(&opt->lock);
705706

706707
ret = i2c_smbus_read_word_swapped(opt->client, OPT3001_CONFIGURATION);
@@ -737,7 +738,7 @@ static irqreturn_t opt3001_irq(int irq, void *_iio)
737738
}
738739

739740
out:
740-
if (!opt->ok_to_ignore_lock)
741+
if (!ok_to_ignore_lock)
741742
mutex_unlock(&opt->lock);
742743

743744
if (wake_result_ready_queue)

0 commit comments

Comments
 (0)