Subject: [PATCH 01/23] kernel: irq: irqdescs: warn on spurious IRQ

Add a warning on spurious IRQs to __handle_domain_irq(), also telling the
linux IRQ number (if any), the hw IRQ number and the max nr of IRQs.

That's far more informative than the warnings in (some of) the individual
arch's ack_bad_irq()'s. These aren't really helpful since either the
other callers already had printed more detailed information or (when called
by __handle_domain_irq()) the printout just doesn't tell anything useful.

Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]>
---
kernel/irq/irqdesc.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
index e810eb9906ea..62a381351775 100644
--- a/kernel/irq/irqdesc.c
+++ b/kernel/irq/irqdesc.c
@@ -681,6 +681,9 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
* than crashing, do something sensible.
*/
if (unlikely(!irq || irq >= nr_irqs)) {
+ if (printk_ratelimit())
+ pr_warn("spurious IRQ: irq=%d hwirq=%d nr_irqs=%d\n",
+ irq, hwirq, nr_irqs);
ack_bad_irq(irq);
ret = -EINVAL;
} else {
--
2.11.0


2020-12-18 15:59:12

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH 01/23] kernel: irq: irqdescs: warn on spurious IRQ

On Fri, Dec 18, 2020 at 4:37 PM Enrico Weigelt, metux IT consult
<[email protected]> wrote:

> + if (printk_ratelimit())
> + pr_warn("spurious IRQ: irq=%d hwirq=%d nr_irqs=%d\n",
> + irq, hwirq, nr_irqs);

Perhaps you missed pr_warn_ratelimit() macro which is already in the
kernel for a long time.

--
With Best Regards,
Andy Shevchenko

2020-12-21 05:46:44

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH 01/23] kernel: irq: irqdescs: warn on spurious IRQ

Andy Shevchenko <[email protected]> writes:
> On Fri, Dec 18, 2020 at 4:37 PM Enrico Weigelt, metux IT consult
> <[email protected]> wrote:
>
>> + if (printk_ratelimit())
>> + pr_warn("spurious IRQ: irq=%d hwirq=%d nr_irqs=%d\n",
>> + irq, hwirq, nr_irqs);
>
> Perhaps you missed pr_warn_ratelimit() macro which is already in the
> kernel for a long time.

pr_warn_ratelimited() which calls printk_ratelimited().

And see the comment above printk_ratelimit():

/*
* Please don't use printk_ratelimit(), because it shares ratelimiting state
* with all other unrelated printk_ratelimit() callsites. Instead use
* printk_ratelimited() or plain old __ratelimit().
*/


cheers

2020-12-21 10:11:03

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH 01/23] kernel: irq: irqdescs: warn on spurious IRQ

On Mon, Dec 21, 2020 at 7:44 AM Michael Ellerman <[email protected]> wrote:
> Andy Shevchenko <[email protected]> writes:
> > On Fri, Dec 18, 2020 at 4:37 PM Enrico Weigelt, metux IT consult
> > <[email protected]> wrote:
> >
> >> + if (printk_ratelimit())
> >> + pr_warn("spurious IRQ: irq=%d hwirq=%d nr_irqs=%d\n",
> >> + irq, hwirq, nr_irqs);
> >
> > Perhaps you missed pr_warn_ratelimit() macro which is already in the
> > kernel for a long time.
>
> pr_warn_ratelimited() which calls printk_ratelimited().

I stand corrected.
Right, that's what I had in mind (actually didn't know that there are variants).

Thanks!

> And see the comment above printk_ratelimit():
>
> /*
> * Please don't use printk_ratelimit(), because it shares ratelimiting state
> * with all other unrelated printk_ratelimit() callsites. Instead use
> * printk_ratelimited() or plain old __ratelimit().
> */


--
With Best Regards,
Andy Shevchenko