All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matti Vaittinen <mazziesaccount@gmail.com>
To: Jonathan Cameron <jic23@kernel.org>
Cc: Stepan Ionichev <sozdayvek@gmail.com>,
	dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org,
	linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
	stable@vger.kernel.org
Subject: Re: [PATCH v2] iio: pressure: rohm-bm1390: notify trigger on all error paths
Date: Fri, 29 May 2026 11:21:40 +0300	[thread overview]
Message-ID: <aa2c2f98-454d-489c-a652-b8023b0773bf@gmail.com> (raw)
In-Reply-To: <0d58842a-aa5c-4d12-9435-3264070038cc@gmail.com>

On 22/05/2026 15:38, Matti Vaittinen wrote:
> On 20/05/2026 14:08, Jonathan Cameron wrote:
>> On Tue, 19 May 2026 08:48:13 +0300
>> Matti Vaittinen <mazziesaccount@gmail.com> wrote:
>>
>>> Thanks Jonathan,
>>>
>>> Your post give me something to think about ;)
>>
>> This is a can of worms.  More below.
>>
>> I'm unconcerned as long as (and ideally someone should check it)
>> we can get of being stuck by unbind/rebind of driver.  Anything
>> else is best effort.
>>
>>
>>>
>>> On 18/05/2026 18:15, Jonathan Cameron wrote:
>>>> On Mon, 18 May 2026 14:42:38 +0500
>>>> Stepan Ionichev <sozdayvek@gmail.com> wrote:
>>>>> bm1390_trigger_handler() returns from three error paths without
>>>>> calling iio_trigger_notify_done(). The success path at the end
>>>>> does, so on a single transient regmap or read failure the trigger
>>>>> use_count is never decremented, and the !atomic_read(&trig->use_count)
>>>>> guard in iio_trigger_poll_chained() drops every subsequent dispatch.
>>>>> The buffered-data flow stays wedged until the trigger is detached.
>>>>>
>>>>> Funnel all returns through a single done label that calls
>>>>> iio_trigger_notify_done() and reports the outcome via IRQ_RETVAL().
>>>>>
>>>>> Fixes: 81ca5979b6ed ("iio: pressure: Support ROHM BU1390")
>>>>> Cc: stable@vger.kernel.org
>>>>> Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>
>>>>
>>>> These error path 'fixes' are fixes for hardware failure - so if 
>>>> anything
>>>> they are hardending  against a possible error condition. I don't mind
>>>> that bit it's not a bug to not do this so fixes tag an stable are not
>>>> appropriate for any of these.
>>>>
>>>> Note however that hardening against these conditions is not this 
>>>> simple.
>>>> It takes careful analysis of exactly how the hardware behaves and what
>>>> each error condition 'might' mean.  Whilst they are probably harmless
>>>> I'm also very dubious about taking them without comprehensive testing
>>>> on the particular device.
>>>>> ---
> 
> //snip
> 
>>>>> @@ -639,7 +642,8 @@ static irqreturn_t bm1390_trigger_handler(int 
>>>>> irq, void *p)
>>>>>            ret = bm1390_pressure_read(data, &data->buf.pressure);
>>>>>            if (ret) {
>>>>>                dev_warn(data->dev, "sample read failed %d\n", ret);
>>>>> -            return IRQ_NONE;
>>>>> +            handled = false;
>>>>> +            goto done;
>>>>
>>>> Hopefully all this stuff is unrelated to the trigger.  For these it 
>>>> is fair to
>>>> ack the trigger and the interrupt.  Curiously the driver does it 
>>>> partly for the
>>>> next one (IRQ_HANDLED).
>>>
>>> I would keep the IRQ_NONE here because, if we keep constantly failing
>>> the reads, then the bus is likely to be unerliable - and disabling the
>>> useless IRQ is probably very sane thing to do. It should help debugging.
>>> What comes to acking the trigger - I am starting to agree with Stepan,
>>> we should probably ack the trigger in any case. If we don't ack the
>>> trigger, then the IRQ_NONE does not serve the purpose it is intended 
>>> for.
>>
>> The interrupt that we'd get spurious detection on here would not be 
>> the device
>> one it would be the software emulated one deep in the iio trigger stuff.
>>
>> Might still be useful for debug. Anyone fancy hacking an error in and 
>> reporting
>> back what we actually get from the debug hardware?  (with that trigger 
>> acked
>> as you suggest?)
> 
> No promises but I'll see if I can try out something next week...

The week has been horrible... I only had around half an hour for this 
(just now). Quick:

+++ b/drivers/iio/pressure/rohm-bm1390.c
@@ -621,6 +621,16 @@ static const struct iio_buffer_setup_ops 
bm1390_buffer_ops = {
         .predisable = bm1390_buffer_predisable,
  };

+/*
+ * Test case where IRQ status is nopt read (acked). Useful for 
evaluating the
+ * impact of returning the IRQ_NONE from the trigger handler. define 
also the
+ * TEST_FORCE_IRQ_NOTIFY if you wish to cause the trigger to be notified.
+ *
+ * Note, in case it is not obvious, this will cause IRQ storm.
+ */
+#define TEST_FORCE_IRQ_NONE
+#define TEST_FORCE_IRQ_NOTIFY
+
  static irqreturn_t bm1390_trigger_handler(int irq, void *p)
  {
         struct iio_poll_func *pf = p;
@@ -628,12 +638,27 @@ static irqreturn_t bm1390_trigger_handler(int irq, 
void *p)
         struct bm1390_data *data = iio_priv(idev);
         int ret, status;

+#ifdef TEST_FORCE_IRQ_NONE
+       static unsigned long int first = 1, first2 = 0;
+       ret = 0;
+
+       if (first) {
+               pr_info("Skip read\n");
+               first = 0;
+       }
+       #ifdef TEST_FORCE_IRQ_NOTIFY
+       status = BIT(BM1390_CHAN_PRESSURE);
+       #else
+       status = 0;
+       #endif
+#else
         /* DRDY is acked by reading status reg */
         ret = regmap_read(data->regmap, BM1390_REG_STATUS, &status);
         if (ret || !status)
                 return IRQ_NONE;
+#endif

-       dev_dbg(data->dev, "DRDY trig status 0x%x\n", status);
+//     dev_dbg(data->dev, "DRDY trig status 0x%x\n", status);

         if (test_bit(BM1390_CHAN_PRESSURE, idev->active_scan_mask)) {
                 ret = bm1390_pressure_read(data, &data->buf.pressure);
@@ -656,7 +681,17 @@ static irqreturn_t bm1390_trigger_handler(int irq, 
void *p)
                                     data->timestamp);
         iio_trigger_notify_done(idev->trig);

+#ifdef TEST_FORCE_IRQ_NONE
+       /* HACK, return IRQ_NONE and see if IRQ gets disabled */
+       if (!(first2 % 1000))
+               pr_info("Hack, return IRQ_NONE (%lu th)\n", first2);
+
+       first2++;
+
+       return IRQ_NONE;
+#else
         return IRQ_HANDLED;
+#endif
  }

  /* Get timestamps and wake the thread if we need to read data */



resulted:
root@arm:/home/debian# /iio_generic_buffer -a -c1000000 --device-name 
bm1390 -T0 > /dev/null
Enabling all channels
[  115.098819] Skip read
[  115.102442] Hack, return IRQ_NONE (0 th)
[  116.459049] Hack, return IRQ_NONE (1000 th)
[  117.851037] Hack, return IRQ_NONE (2000 th)
[  119.214843] Hack, return IRQ_NONE (3000 th)
[  120.598114] Hack, return IRQ_NONE (4000 th)
[  121.960255] Hack, return IRQ_NONE (5000 th)
[  123.322424] Hack, return IRQ_NONE (6000 th)

//snip

[  237.726666] Hack, return IRQ_NONE (90000 th)
[  239.095910] Hack, return IRQ_NONE (91000 th)
[  240.481233] Hack, return IRQ_NONE (92000 th)
[  241.846072] Hack, return IRQ_NONE (93000 th)
[  243.206432] Hack, return IRQ_NONE (94000 th)
[  244.570636] Hack, return IRQ_NONE (95000 th)
[  245.928964] Hack, return IRQ_NONE (96000 th)
[  247.286839] Hack, return IRQ_NONE (97000 th)
[  248.647986] Hack, return IRQ_NONE (98000 th)
[  250.011214] Hack, return IRQ_NONE (99000 th)
[  251.368583] irq 64: nobody cared (try booting with the "irqpoll" option)
[  251.375463] CPU: 0 UID: 0 PID: 835 Comm: irq/63-2-005d-b Tainted: G 
         O        7.1.0-rc1-00002-g3b459deb7222-dirty #249 VOLUNTARY
[  251.375501] Tainted: [O]=OOT_MODULE
[  251.375511] Hardware name: Generic AM33XX (Flattened Device Tree)
[  251.375525] Call trace:
[  251.375545]  unwind_backtrace from show_stack+0x10/0x14
[  251.375607]  show_stack from dump_stack_lvl+0x50/0x64
[  251.375646]  dump_stack_lvl from __report_bad_irq+0x30/0xbc
[  251.375680]  __report_bad_irq from note_interrupt+0x2b4/0x32c
[  251.375722]  note_interrupt from handle_nested_irq+0x13c/0x14c
[  251.375758]  handle_nested_irq from iio_trigger_poll_nested+0x4c/0x68 
[industrialio]
[  251.375917]  iio_trigger_poll_nested [industrialio] from 
bm1390_irq_thread_handler+0x54/0x7c [rohm_bm1390]
[  251.375994]  bm1390_irq_thread_handler [rohm_bm1390] from 
irq_thread_fn+0x1c/0x78
[  251.376028]  irq_thread_fn from irq_thread+0x18c/0x324
[  251.376057]  irq_thread from kthread+0xf8/0x130
[  251.376091]  kthread from ret_from_fork+0x14/0x20
[  251.376114] Exception stack(0xe0355fb0 to 0xe0355ff8)
[  251.376136] 5fa0:                                     00000000 
00000000 00000000 00000000
[  251.376156] 5fc0: 00000000 00000000 00000000 00000000 00000000 
00000000 00000000 00000000
[  251.376175] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[  251.376189] handlers:
[  251.498714] [<2ec7a5d9>] iio_pollfunc_store_time [industrialio] 
threaded [<7f4268a2>] bm1390_trigger_handler [rohm_bm1390]
[  251.509974] Disabling IRQ #64

Message from syslogd@arm at Jan  1 01:17:33 ...
  kernel:[  251.509974] Disabling IRQ #64
[  252.822500] sched: RT throttling activated


Things I very hastly picked up:

1. The throttling mechanism works even though the handling is invoked 
via iio_trigger_poll_nested(), Probably because this propagates the call 
to the handle_nested_irq() - which does bookkeeping.

2. For some reason (which I didn't have time to check yet), the 
beaglebone black which I used to run this, was not completely blocked by 
the IRQ. We can see the "Hack, return IRQ_NONE (xxx th)" -prints 
emerging just fine.

And now I must run. I hope to be able to dig some more details next week.

Yours,
	-- Matti


-- 
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland

~~ When things go utterly wrong vim users can always type :help! ~~

  reply	other threads:[~2026-05-29  8:21 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-17 16:08 [PATCH] iio: pressure: rohm-bm1390: notify trigger on all error paths Stepan Ionichev
2026-05-17 17:12 ` David Lechner
2026-05-17 17:18   ` Stepan Ionichev
2026-05-18  5:21   ` Matti Vaittinen
2026-05-18  6:59     ` Andy Shevchenko
2026-05-18  7:35       ` Matti Vaittinen
2026-05-18 14:55       ` Jonathan Cameron
2026-05-18 18:31         ` Andy Shevchenko
2026-05-20 10:39           ` Jonathan Cameron
2026-05-18 14:50     ` Jonathan Cameron
2026-05-18  6:54 ` Andy Shevchenko
2026-05-18  9:42 ` [PATCH v2] " Stepan Ionichev
2026-05-18 10:42   ` Andy Shevchenko
2026-05-18 13:06   ` Matti Vaittinen
2026-05-18 15:15   ` Jonathan Cameron
2026-05-19  5:48     ` Matti Vaittinen
2026-05-20 11:08       ` Jonathan Cameron
2026-05-22 12:38         ` Matti Vaittinen
2026-05-29  8:21           ` Matti Vaittinen [this message]
2026-06-01 18:36             ` Andy Shevchenko
2026-06-04  6:10               ` Matti Vaittinen
2026-06-03 17:26             ` Jonathan Cameron
2026-06-04  6:05               ` Matti Vaittinen

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=aa2c2f98-454d-489c-a652-b8023b0773bf@gmail.com \
    --to=mazziesaccount@gmail.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=nuno.sa@analog.com \
    --cc=sozdayvek@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.