Re: [PATCH] cxl/events: Return IRQ_NONE when no event is pending
From: Li Ming
Date: Tue Sep 08 2026 - 22:09:10 EST
在 2026/9/8 02:48, Jonathan Cameron 写道:
On Sun, 6 Sep 2026 21:27:05 +0530
Shaikh Kamaluddin <shaikhkamal2012@xxxxxxxxx> wrote:
CXL event interrupts may share an MSI/MSI-X vector with other eventWhat is the practical result of this change?
logs or device features. Consequently, cxl_event_thread() is registered
with IRQF_SHARED and must determine whether an interrupt belongs to the
event-log facility.
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.
Track whether at least one supported event status bit was observed.
Return IRQ_NONE when there was no event to service, while continuing to
return IRQ_HANDLED after processing one or more event logs.
I think it will only affect the spurious interrupt detection so
to me it looks like a cleanup rather than a fix. Is there
any path by which we actually lose interrupts as a result of this?
Fixes: a49aa8141b65 ("cxl/mem: Wire up event interrupts")No blank lines in tag blocks. There are a number of tools that rely
on there not being any and as such there are also scripts that run
on various upstream trees that will send us annoying emails if this
blank line is still here! I'm not sure why this mistake in patch
formatting is so common as there are plenty of docs without the
blank lines!
Signed-off-by: Shaikh Kamaluddin <shaikhkamal2012@xxxxxxxxx>A suggestion for an alternative implementation below.
---return IRQ_NONE;
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)
And don't need the other changes.
Hi Jonathan,
I think we should not return IRQ_NONE here, because the loop could run multiple times untill no event record, so we always get a status with 0x0 value in the last loop. In that case, we still need to return IRQ_HANDLED.
Ming
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: 7098e9cd98a05c0c5de2fae0c2465f9d966fdd07
prerequisite-patch-id: 92e40cd60a697020faac475dcc77ba63b33434ea
prerequisite-patch-id: 10027ad5d9aed85806047f807b3a76273b6c4a77