Re: Regression in 6.8 from "ACPI: OSL: Use a threaded interrupt handler for SCI"

From: Rafael J. Wysocki
Date: Wed Jul 10 2024 - 09:13:36 EST


On Mon, Jul 8, 2024 at 3:51 PM Wysocki, Rafael J
<rafael.j.wysocki@xxxxxxxxx> wrote:
>
> Hi,
>
> On 7/8/2024 10:07 AM, Stefan Seyfried wrote:
> > Hi all,
> >
> > any kernels after 6.7 break my trusty old Toughbook CF-51 by rendering
> > many PCI devices unusable.
> >
> > I did first notice that i915 did no longer work and filed
> > https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11437, there I
> > was pointed to commit
> >
> > commit 7a36b901a6eb0e9945341db71ed3c45c7721cfa9
> > Author: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
> > Date: Mon Nov 27 20:57:43 2023 +0100
> >
> > ACPI: OSL: Use a threaded interrupt handler for SCI
> >
> > which I verified with a week-long bisecting from 6.7 to 6.8 (just for
> > fun :-)
> >
> Thanks for reporting this, although it would be nice to put linux-acpi
> on the CC.
>
>
> > Just reverting this commit top of 6.10-rc5 (sorry, this machine is not
> > very powerful so I did not try the latest git master) makes everything
> > work fine again.
> >
> > I get these messages in dmesg when running the broken kernels:
> >
> > [ T308] genirq: Flags mismatch irq 9. 00000080 (yenta) vs. 00002080
> > (acpi)
> > [ T305] genirq: Flags mismatch irq 9. 00000080 (uhci_hcd:usb1) vs.
> > 00002080 (acpi)
> > [ T305] genirq: Flags mismatch irq 9. 00000080 (uhci_hcd:usb1) vs.
> > 00002080 (acpi)
> > [ T46] genirq: Flags mismatch irq 9. 00000080 (ehci_hcd:usb1) vs.
> > 00002080 (acpi)
> > [ T312] genirq: Flags mismatch irq 9. 00000080 (firewire_ohci) vs.
> > 00002080 (acpi)
> > [ T305] genirq: Flags mismatch irq 9. 00000080 (uhci_hcd:usb1) vs.
> > 00002080 (acpi)
> > [ T308] genirq: Flags mismatch irq 9. 00000080 (yenta) vs. 00002080
> > (acpi)
> > [ T592] genirq: Flags mismatch irq 9. 00000080 (snd_intel8x0) vs.
> > 00002080 (acpi)
> > [ T581] genirq: Flags mismatch irq 9. 00000080 (i915) vs. 00002080
> > (acpi)
> > [ T874] genirq: Flags mismatch irq 9. 00000080 (enp2s1) vs. 00002080
> > (acpi)
> >
> > These are not present with that commit reverted.
> >
> So all of the drivers above attempt to share the IRQ with the SCI and
> they don't use IRQF_ONESHOT and because they all are threaded, there is
> a flags conflict.
>
> They all need to be made pass IRQF_COND_ONESHOT when requesting
> interrupts and it will all work again.
>
> I'll send you a patch for this (hopefully later today), but I guess it
> will take a while until it gets absorbed.
>
> Thanks!

So can you please check if the attached patch helps?
---
include/linux/interrupt.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

Index: linux-pm/include/linux/interrupt.h
===================================================================
--- linux-pm.orig/include/linux/interrupt.h
+++ linux-pm/include/linux/interrupt.h
@@ -168,7 +168,8 @@ static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
{
- return request_threaded_irq(irq, handler, NULL, flags, name, dev);
+ return request_threaded_irq(irq, handler, NULL,
+ flags | IRQF_COND_ONESHOT, name, dev);
}

extern int __must_check