From: Andy Shevchenko <andriy.shevchenko@intel.com>
To: Jonathan Cameron <jic23@kernel.org>
Cc: "Melbin K Mathew" <mlbnkm1@gmail.com>,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
stable@vger.kernel.org
Subject: Re: [PATCH] iio: accel: bmc150: free irq before teardown
Date: Mon, 6 Jul 2026 09:11:33 +0300 [thread overview]
Message-ID: <aktHFWgrl76gi-oX@ashevche-desk.local> (raw)
In-Reply-To: <20260706000233.3104e0d3@jic23-huawei>
On Mon, Jul 06, 2026 at 12:02:33AM +0100, Jonathan Cameron wrote:
> On Sun, 5 Jul 2026 06:27:31 +0200
> Melbin K Mathew <mlbnkm1@gmail.com> wrote:
> > bmc150_accel_core_probe() requests the interrupt with
> > devm_request_threaded_irq(). The managed IRQ is released only after the
> > driver remove callback has returned unless it is freed explicitly.
> >
> > bmc150_accel_core_remove() currently unregisters the IIO device and
> > triggers, cleans up the triggered buffer, suspends the chip and disables
> > the regulators while the IRQ action is still registered. A late
> > interrupt can therefore run the hard or threaded handler while the IIO
> > trigger state is being torn down or after the device has been put into
> > deep suspend.
>
> For me this raises a load of questions.
Oh, I was too quick with my glance on this.
> In particular having the interrupt
> torn down before we remove userspace interfaces (as occurs after this change)
> is itself a big source of race conditions as we have to cope with userspace
> being able to poke every interface with the interrupts missing. So it is
> a design pattern I'm very resistant to!
>
> Anyhow, is this theoretical or have you seen it in practice? i.e. can we test
> fixes? Are we talking spurious or shared interrupts, or is there a path in
> which a race generates a real interrupt? My guess would be the thread
> running a while after the interrupt but please confirm. What is the effect
> of talking to the device when powered down? Bus errors, stalls? A quick
> glance at the datasheet suggests some registers are fine, so this description
> would need to say which ones that are accessed are not. I think it's only
> the fifo_data but I haven't checked the code or datasheet closely. What
> actually happens if we access that register? An error or garbage data?
>
> Maybe we just turn the power on again in the thread handler? Vast majority of the
> time that will just be a ref count increment and decrement, but in the race
> here it will turn the power on again so no problem accessing the device.
> Or a local flag to say if accessing that fifo register is fine - if it's
> not just erroring out on trying.
>
> We do have internal infrastructure to close down races around
> teardown (see the exist_lock and how iio_dev->info is set to NULL
> which acts as a marker of a device going away - maybe we need to make
> that available to drivers (though I'd rather not as it's easy to use
> wrong!) I'm not aware of any core interfaces such as accessing the
> buffers or open chardevs etc that are not appropriately guarded so
> hopefully the races you are seeing are just at the driver
> level. The usual route to handling this stuff is to make the interrupt
> handling safe to the transitions that occur on tear down, not reorder
> things to stop the handler running. Note that making it safe
> can absolutely include simply returning errors from accesses that don't
> work due to power conditions.
>
> > Free the IRQ at the start of remove so that no handler is running while
> > the rest of the driver state and hardware resources are dismantled.
> > + if (data->irq > 0)
> > + devm_free_irq(dev, data->irq, indio_dev);
>
> If (and it is a very big if) this is the right thing to do then it must
> be accompanied by documentation of why we need the remove to not be in
> the reverse order of probe. Also, rip out devm registration and
> move to none devm for everything after the request of the irq.
>
> Note that because userspace interfaces are still up at this point
> we may well get normal operations generating unhandled interrupts, potentially
> resulting in the interrupt core taking that interrupt offline.
>
> It is for this reason that we generally disable userspace interfaces
> first and then remove the interrupts.
Indeed, the current logic seems correct.
> > iio_device_unregister(indio_dev);
> >
> > pm_runtime_disable(dev);
--
With Best Regards,
Andy Shevchenko
prev parent reply other threads:[~2026-07-06 6:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-05 4:27 [PATCH] iio: accel: bmc150: free irq before teardown Melbin K Mathew
2026-07-05 6:53 ` Andy Shevchenko
2026-07-05 7:33 ` Melbin K Mathew
2026-07-05 23:02 ` Jonathan Cameron
2026-07-06 6:11 ` Andy Shevchenko [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aktHFWgrl76gi-oX@ashevche-desk.local \
--to=andriy.shevchenko@intel.com \
--cc=andy@kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mlbnkm1@gmail.com \
--cc=nuno.sa@analog.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox