drivers/cxl/pci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
CXL event interrupts may share an MSI/MSI-X vector with other event
logs or device features. Consequently, cxl_event_thread() is registered
with IRQF_SHARED and must determine whether the event-log facility
claimed the interrupt.
The handler masks the Device Event Status register to the event logs
supported by the driver. However, when no supported status bit is set,
it exits the processing loop and still returns IRQ_HANDLED. This
incorrectly reports that the interrupt was claimed and prevents the
generic spurious-interrupt detector from accounting it as unhandled.
Track whether the CXL event handler claimed the interrupt and return
IRQ_NONE when no supported event is detected. If no handler sharing the
vector claims a sustained interrupt storm, the generic spurious-
interrupt detector can eventually identify and disable the affected
IRQ.
Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@gmail.com>
---
Changes in V2:
- Emphasize that returning IRQ_NONE enables generic spurious-interrupt
detection and drop the Fixes tag. (Jonathan Cameron)
- Check whether the event interrupt is already disabled by Anisa Su's
patch; no code changes were needed. (Ben Cheatham)
- Rebase onto v7.3-rc2; no code changes.
drivers/cxl/pci.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index c7c91e8dc51d..8b560cae91f2 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -515,6 +515,7 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
struct cxl_dev_id *dev_id = id;
struct cxl_dev_state *cxlds = dev_id->cxlds;
struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
+ bool handled = false;
u32 status;
do {
@@ -527,11 +528,13 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
status &= CXLDEV_EVENT_STATUS_ALL;
if (!status)
break;
+
+ handled = true;
cxl_mem_get_event_records(mds, status);
cond_resched();
} while (status);
- return IRQ_HANDLED;
+ return handled ? IRQ_HANDLED : IRQ_NONE;
}
static int cxl_event_req_irq(struct cxl_dev_state *cxlds, u8 setting)
base-commit: df2908090cda368b01ff43709f51890076c56157
--
2.43.0
On 9/12/26 2:38 AM, Shaikh Kamaluddin wrote:
> CXL event interrupts may share an MSI/MSI-X vector with other event
> logs or device features. Consequently, cxl_event_thread() is registered
> with IRQF_SHARED and must determine whether the event-log facility
> claimed the interrupt.
>
> The handler masks the Device Event Status register to the event logs
> supported by the driver. However, when no supported status bit is set,
> it exits the processing loop and still returns IRQ_HANDLED. This
> incorrectly reports that the interrupt was claimed and prevents the
> generic spurious-interrupt detector from accounting it as unhandled.
>
> Track whether the CXL event handler claimed the interrupt and return
> IRQ_NONE when no supported event is detected. If no handler sharing the
> vector claims a sustained interrupt storm, the generic spurious-
> interrupt detector can eventually identify and disable the affected
> IRQ.
>
> Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@gmail.com>
Applied to cxl/next:
a8c458611a7d
> ---
> Changes in V2:
> - Emphasize that returning IRQ_NONE enables generic spurious-interrupt
> detection and drop the Fixes tag. (Jonathan Cameron)
> - Check whether the event interrupt is already disabled by Anisa Su's
> patch; no code changes were needed. (Ben Cheatham)
> - Rebase onto v7.3-rc2; no code changes.
>
> drivers/cxl/pci.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
> index c7c91e8dc51d..8b560cae91f2 100644
> --- a/drivers/cxl/pci.c
> +++ b/drivers/cxl/pci.c
> @@ -515,6 +515,7 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> struct cxl_dev_id *dev_id = id;
> struct cxl_dev_state *cxlds = dev_id->cxlds;
> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
> + bool handled = false;
> u32 status;
>
> do {
> @@ -527,11 +528,13 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> status &= CXLDEV_EVENT_STATUS_ALL;
> if (!status)
> break;
> +
> + handled = true;
> cxl_mem_get_event_records(mds, status);
> cond_resched();
> } while (status);
>
> - return IRQ_HANDLED;
> + return handled ? IRQ_HANDLED : IRQ_NONE;
> }
>
> static int cxl_event_req_irq(struct cxl_dev_state *cxlds, u8 setting)
>
> base-commit: df2908090cda368b01ff43709f51890076c56157
On Sat, Sep 12, 2026 at 03:08:15PM +0530, Shaikh Kamaluddin wrote: > CXL event interrupts may share an MSI/MSI-X vector with other event > logs or device features. Consequently, cxl_event_thread() is registered > with IRQF_SHARED and must determine whether the event-log facility > claimed the interrupt. > > The handler masks the Device Event Status register to the event logs > supported by the driver. However, when no supported status bit is set, > it exits the processing loop and still returns IRQ_HANDLED. This > incorrectly reports that the interrupt was claimed and prevents the > generic spurious-interrupt detector from accounting it as unhandled. > > Track whether the CXL event handler claimed the interrupt and return > IRQ_NONE when no supported event is detected. If no handler sharing the > vector claims a sustained interrupt storm, the generic spurious- > interrupt detector can eventually identify and disable the affected > IRQ. Reviewed-by: Alison Schofield <alison.schofield@intel.com>
On 9/12/2026 5:38 PM, Shaikh Kamaluddin wrote:
> CXL event interrupts may share an MSI/MSI-X vector with other event
> logs or device features. Consequently, cxl_event_thread() is registered
> with IRQF_SHARED and must determine whether the event-log facility
> claimed the interrupt.
>
> The handler masks the Device Event Status register to the event logs
> supported by the driver. However, when no supported status bit is set,
> it exits the processing loop and still returns IRQ_HANDLED. This
> incorrectly reports that the interrupt was claimed and prevents the
> generic spurious-interrupt detector from accounting it as unhandled.
>
> Track whether the CXL event handler claimed the interrupt and return
> IRQ_NONE when no supported event is detected. If no handler sharing the
> vector claims a sustained interrupt storm, the generic spurious-
> interrupt detector can eventually identify and disable the affected
> IRQ.
>
> Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@gmail.com>
Reviewed-by: Li Ming <ming.li@zohomail.com>
> ---
> Changes in V2:
> - Emphasize that returning IRQ_NONE enables generic spurious-interrupt
> detection and drop the Fixes tag. (Jonathan Cameron)
> - Check whether the event interrupt is already disabled by Anisa Su's
> patch; no code changes were needed. (Ben Cheatham)
> - Rebase onto v7.3-rc2; no code changes.
>
> drivers/cxl/pci.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
> index c7c91e8dc51d..8b560cae91f2 100644
> --- a/drivers/cxl/pci.c
> +++ b/drivers/cxl/pci.c
> @@ -515,6 +515,7 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> struct cxl_dev_id *dev_id = id;
> struct cxl_dev_state *cxlds = dev_id->cxlds;
> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
> + bool handled = false;
> u32 status;
>
> do {
> @@ -527,11 +528,13 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> status &= CXLDEV_EVENT_STATUS_ALL;
> if (!status)
> break;
> +
> + handled = true;
> cxl_mem_get_event_records(mds, status);
> cond_resched();
> } while (status);
>
> - return IRQ_HANDLED;
> + return handled ? IRQ_HANDLED : IRQ_NONE;
> }
>
> static int cxl_event_req_irq(struct cxl_dev_state *cxlds, u8 setting)
>
> base-commit: df2908090cda368b01ff43709f51890076c56157
On Sat, Sep 12, 2026 at 03:08:15PM +0530, Shaikh Kamaluddin wrote:
> CXL event interrupts may share an MSI/MSI-X vector with other event
> logs or device features. Consequently, cxl_event_thread() is registered
> with IRQF_SHARED and must determine whether the event-log facility
> claimed the interrupt.
>
> The handler masks the Device Event Status register to the event logs
> supported by the driver. However, when no supported status bit is set,
> it exits the processing loop and still returns IRQ_HANDLED. This
> incorrectly reports that the interrupt was claimed and prevents the
> generic spurious-interrupt detector from accounting it as unhandled.
>
> Track whether the CXL event handler claimed the interrupt and return
> IRQ_NONE when no supported event is detected. If no handler sharing the
> vector claims a sustained interrupt storm, the generic spurious-
> interrupt detector can eventually identify and disable the affected
> IRQ.
>
> Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@gmail.com>
Reviewed-by: Anisa Su <anisa.su@samsung.com>
> ---
> Changes in V2:
> - Emphasize that returning IRQ_NONE enables generic spurious-interrupt
> detection and drop the Fixes tag. (Jonathan Cameron)
> - Check whether the event interrupt is already disabled by Anisa Su's
> patch; no code changes were needed. (Ben Cheatham)
One thing I want to correct: The change requested was to say a
spurious IRQ will eventually be disabled in the commit message, not
check whether the event interrupts is already disabled...
See https://lore.kernel.org/linux-cxl/aqLZP3ORYzCLfSgR@acer-nitro-anv15-41/T/#m32c74ebf05eee9a3ee49c57dd24848db29919031
I do see that it's been added to the commit message though, so no need
to do anything.
Thanks,
Anisa
> - Rebase onto v7.3-rc2; no code changes.
>
> drivers/cxl/pci.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
> index c7c91e8dc51d..8b560cae91f2 100644
> --- a/drivers/cxl/pci.c
> +++ b/drivers/cxl/pci.c
> @@ -515,6 +515,7 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> struct cxl_dev_id *dev_id = id;
> struct cxl_dev_state *cxlds = dev_id->cxlds;
> struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
> + bool handled = false;
> u32 status;
>
> do {
> @@ -527,11 +528,13 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> status &= CXLDEV_EVENT_STATUS_ALL;
> if (!status)
> break;
> +
> + handled = true;
> cxl_mem_get_event_records(mds, status);
> cond_resched();
> } while (status);
>
> - return IRQ_HANDLED;
> + return handled ? IRQ_HANDLED : IRQ_NONE;
> }
>
> static int cxl_event_req_irq(struct cxl_dev_state *cxlds, u8 setting)
>
> base-commit: df2908090cda368b01ff43709f51890076c56157
> --
> 2.43.0
>
On Wed, Sep 16, 2026 at 09:38:37AM +0900, Anisa Su wrote:
> On Sat, Sep 12, 2026 at 03:08:15PM +0530, Shaikh Kamaluddin wrote:
> > CXL event interrupts may share an MSI/MSI-X vector with other event
> > logs or device features. Consequently, cxl_event_thread() is registered
> > with IRQF_SHARED and must determine whether the event-log facility
> > claimed the interrupt.
> >
> > The handler masks the Device Event Status register to the event logs
> > supported by the driver. However, when no supported status bit is set,
> > it exits the processing loop and still returns IRQ_HANDLED. This
> > incorrectly reports that the interrupt was claimed and prevents the
> > generic spurious-interrupt detector from accounting it as unhandled.
> >
> > Track whether the CXL event handler claimed the interrupt and return
> > IRQ_NONE when no supported event is detected. If no handler sharing the
> > vector claims a sustained interrupt storm, the generic spurious-
> > interrupt detector can eventually identify and disable the affected
> > IRQ.
> >
> > Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@gmail.com>
> Reviewed-by: Anisa Su <anisa.su@samsung.com>
> > ---
> > Changes in V2:
> > - Emphasize that returning IRQ_NONE enables generic spurious-interrupt
> > detection and drop the Fixes tag. (Jonathan Cameron)
> > - Check whether the event interrupt is already disabled by Anisa Su's
> > patch; no code changes were needed. (Ben Cheatham)
>
> One thing I want to correct: The change requested was to say a
> spurious IRQ will eventually be disabled in the commit message, not
> check whether the event interrupts is already disabled...
> See https://lore.kernel.org/linux-cxl/aqLZP3ORYzCLfSgR@acer-nitro-anv15-41/T/#m32c74ebf05eee9a3ee49c57dd24848db29919031
> I do see that it's been added to the commit message though, so no need
> to do anything.
>
Hi Anisa,
I got your point, yes commit message already covered this.
Thanks,
Shaikh
> Thanks,
> Anisa
> > - Rebase onto v7.3-rc2; no code changes.
> >
> > drivers/cxl/pci.c | 5 ++++-
> > 1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
> > index c7c91e8dc51d..8b560cae91f2 100644
> > --- a/drivers/cxl/pci.c
> > +++ b/drivers/cxl/pci.c
> > @@ -515,6 +515,7 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> > struct cxl_dev_id *dev_id = id;
> > struct cxl_dev_state *cxlds = dev_id->cxlds;
> > struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlds);
> > + bool handled = false;
> > u32 status;
> >
> > do {
> > @@ -527,11 +528,13 @@ static irqreturn_t cxl_event_thread(int irq, void *id)
> > status &= CXLDEV_EVENT_STATUS_ALL;
> > if (!status)
> > break;
> > +
> > + handled = true;
> > cxl_mem_get_event_records(mds, status);
> > cond_resched();
> > } while (status);
> >
> > - return IRQ_HANDLED;
> > + return handled ? IRQ_HANDLED : IRQ_NONE;
> > }
> >
> > static int cxl_event_req_irq(struct cxl_dev_state *cxlds, u8 setting)
> >
> > base-commit: df2908090cda368b01ff43709f51890076c56157
> > --
> > 2.43.0
> >
On Sat, 12 Sep 2026 15:08:15 +0530 Shaikh Kamaluddin <shaikhkamal2012@gmail.com> wrote: > CXL event interrupts may share an MSI/MSI-X vector with other event > logs or device features. Consequently, cxl_event_thread() is registered > with IRQF_SHARED and must determine whether the event-log facility > claimed the interrupt. > > The handler masks the Device Event Status register to the event logs > supported by the driver. However, when no supported status bit is set, > it exits the processing loop and still returns IRQ_HANDLED. This > incorrectly reports that the interrupt was claimed and prevents the > generic spurious-interrupt detector from accounting it as unhandled. > > Track whether the CXL event handler claimed the interrupt and return > IRQ_NONE when no supported event is detected. If no handler sharing the > vector claims a sustained interrupt storm, the generic spurious- > interrupt detector can eventually identify and disable the affected > IRQ. > > Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@gmail.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
© 2016 - 2026 Red Hat, Inc.