patch 'interrupts: add interrupt event info' has been queued to stable release 23.11.7
Shani Peretz
shperetz at nvidia.com
Wed Apr 15 11:59:07 CEST 2026
Hi,
FYI, your patch has been queued to stable release 23.11.7
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 04/19/26. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/shanipr/dpdk-stable
This queued commit can be viewed at:
https://github.com/shanipr/dpdk-stable/commit/7e1207f99aa8b35a1a459d82f988101db228ce63
Thanks.
Shani
---
>From 7e1207f99aa8b35a1a459d82f988101db228ce63 Mon Sep 17 00:00:00 2001
From: Kevin Traynor <ktraynor at redhat.com>
Date: Tue, 3 Mar 2026 18:58:17 +0000
Subject: [PATCH] interrupts: add interrupt event info
[ upstream commit 0b0c6f85bea1e9a595174ac39c1e7cb1c13c9e7b ]
Add RTE_INTR_EVENT_* defines and a new internal API
rte_intr_active_events_flags() in order to retrieve them.
As the events are in the context of the current interrupt,
rte_intr_active_events_flags() must be called from the context of
an interrupt callback.
Signed-off-by: Kevin Traynor <ktraynor at redhat.com>
Acked-by: Stephen Hemminger <stephen at networkplumber.org>
Acked-by: David Marchand <david.marchand at redhat.com>
---
lib/eal/freebsd/eal_interrupts.c | 6 ++++++
lib/eal/include/rte_interrupts.h | 21 +++++++++++++++++++++
lib/eal/linux/eal_interrupts.c | 30 +++++++++++++++++++++++++++++-
lib/eal/version.map | 1 +
lib/eal/windows/eal_interrupts.c | 6 ++++++
5 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/lib/eal/freebsd/eal_interrupts.c b/lib/eal/freebsd/eal_interrupts.c
index 2b31dfb099..4325ec5edc 100644
--- a/lib/eal/freebsd/eal_interrupts.c
+++ b/lib/eal/freebsd/eal_interrupts.c
@@ -748,3 +748,9 @@ int rte_thread_is_intr(void)
{
return rte_thread_equal(intr_thread, rte_thread_self());
}
+
+uint32_t
+rte_intr_active_events_flags(void)
+{
+ return 0;
+}
diff --git a/lib/eal/include/rte_interrupts.h b/lib/eal/include/rte_interrupts.h
index 1b9a0b2a78..0ae16bbe19 100644
--- a/lib/eal/include/rte_interrupts.h
+++ b/lib/eal/include/rte_interrupts.h
@@ -39,6 +39,12 @@ struct rte_intr_handle;
#define RTE_INTR_VEC_ZERO_OFFSET 0
#define RTE_INTR_VEC_RXTX_OFFSET 1
+/** Interrupt event flags returned by rte_intr_active_events_flags() */
+#define RTE_INTR_EVENT_IN RTE_BIT32(0) /**< Data available to read */
+#define RTE_INTR_EVENT_ERR RTE_BIT32(1) /**< Error condition on fd */
+#define RTE_INTR_EVENT_HUP RTE_BIT32(2) /**< Hang up / disconnect */
+#define RTE_INTR_EVENT_RDHUP RTE_BIT32(3) /**< Read hang up / disconnect */
+
/**
* The interrupt source type, e.g. UIO, VFIO, ALARM etc.
*/
@@ -196,6 +202,21 @@ int rte_intr_ack(const struct rte_intr_handle *intr_handle);
*/
int rte_thread_is_intr(void);
+/**
+ * @internal
+ * Return the event flags for the interrupt currently being processed.
+ *
+ * Must be called from an interrupt callback running on the EAL
+ * interrupt thread. The returned value is a bitmask of
+ * RTE_INTR_EVENT_* flags.
+ *
+ * @return
+ * Active event flags, or 0 if not in interrupt context or
+ * on platforms that do not support this feature.
+ */
+__rte_internal
+uint32_t rte_intr_active_events_flags(void);
+
/**
* It allocates memory for interrupt instance. API takes flag as an argument
* which define from where memory should be allocated i.e. using DPDK memory
diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c
index 4d0563fe2f..ef944ea767 100644
--- a/lib/eal/linux/eal_interrupts.c
+++ b/lib/eal/linux/eal_interrupts.c
@@ -36,6 +36,8 @@
static RTE_DEFINE_PER_LCORE(int, _epfd) = -1; /**< epoll fd per thread */
+static uint32_t active_events; /**< events for active interrupt */
+
/**
* union for pipe fds.
*/
@@ -894,6 +896,22 @@ out:
return rc;
}
+static uint32_t
+epoll_to_intr_events(uint32_t epoll_events)
+{
+ uint32_t ev = 0;
+
+ if (epoll_events & EPOLLIN)
+ ev |= RTE_INTR_EVENT_IN;
+ if (epoll_events & EPOLLERR)
+ ev |= RTE_INTR_EVENT_ERR;
+ if (epoll_events & EPOLLHUP)
+ ev |= RTE_INTR_EVENT_HUP;
+ if (epoll_events & EPOLLRDHUP)
+ ev |= RTE_INTR_EVENT_RDHUP;
+ return ev;
+}
+
static void
eal_intr_source_remove_and_free(struct rte_intr_source *src)
{
@@ -1025,7 +1043,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds)
rte_spinlock_lock(&intr_lock);
if (call) {
-
+ active_events = epoll_to_intr_events(events[n].events);
/* Finally, call all callbacks. */
TAILQ_FOREACH(cb, &src->callbacks, next) {
@@ -1039,6 +1057,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds)
/*get the lock back. */
rte_spinlock_lock(&intr_lock);
}
+ active_events = 0;
}
/* we done with that interrupt source, release it. */
src->active = 0;
@@ -1623,3 +1642,12 @@ int rte_thread_is_intr(void)
{
return rte_thread_equal(intr_thread, rte_thread_self());
}
+
+uint32_t
+rte_intr_active_events_flags(void)
+{
+ if (rte_thread_is_intr())
+ return active_events;
+
+ return 0;
+}
diff --git a/lib/eal/version.map b/lib/eal/version.map
index 5e0cd47c82..ad6246ad30 100644
--- a/lib/eal/version.map
+++ b/lib/eal/version.map
@@ -403,6 +403,7 @@ INTERNAL {
rte_eal_get_baseaddr;
rte_eal_parse_coremask;
rte_firmware_read;
+ rte_intr_active_events_flags;
rte_intr_allow_others;
rte_intr_cap_multiple;
rte_intr_dev_fd_get;
diff --git a/lib/eal/windows/eal_interrupts.c b/lib/eal/windows/eal_interrupts.c
index 49efdc098c..8ea137092c 100644
--- a/lib/eal/windows/eal_interrupts.c
+++ b/lib/eal/windows/eal_interrupts.c
@@ -114,6 +114,12 @@ rte_thread_is_intr(void)
return rte_thread_equal(intr_thread, rte_thread_self());
}
+uint32_t
+rte_intr_active_events_flags(void)
+{
+ return 0;
+}
+
int
rte_intr_rx_ctl(__rte_unused struct rte_intr_handle *intr_handle,
__rte_unused int epfd, __rte_unused int op,
--
2.43.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-04-14 14:44:29.479872552 +0300
+++ 0006-interrupts-add-interrupt-event-info.patch 2026-04-14 14:44:28.388470000 +0300
@@ -1 +1 @@
-From 0b0c6f85bea1e9a595174ac39c1e7cb1c13c9e7b Mon Sep 17 00:00:00 2001
+From 7e1207f99aa8b35a1a459d82f988101db228ce63 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 0b0c6f85bea1e9a595174ac39c1e7cb1c13c9e7b ]
+
@@ -13,2 +14,0 @@
-Cc: stable at dpdk.org
-
@@ -19 +19 @@
- lib/eal/freebsd/eal_interrupts.c | 7 +++++++
+ lib/eal/freebsd/eal_interrupts.c | 6 ++++++
@@ -21,3 +21,4 @@
- lib/eal/linux/eal_interrupts.c | 31 ++++++++++++++++++++++++++++++-
- lib/eal/windows/eal_interrupts.c | 7 +++++++
- 4 files changed, 65 insertions(+), 1 deletion(-)
+ lib/eal/linux/eal_interrupts.c | 30 +++++++++++++++++++++++++++++-
+ lib/eal/version.map | 1 +
+ lib/eal/windows/eal_interrupts.c | 6 ++++++
+ 5 files changed, 63 insertions(+), 1 deletion(-)
@@ -26 +27 @@
-index 5c3ab6699e..bb2bc529f2 100644
+index 2b31dfb099..4325ec5edc 100644
@@ -29 +30 @@
-@@ -768,3 +768,10 @@ int rte_thread_is_intr(void)
+@@ -748,3 +748,9 @@ int rte_thread_is_intr(void)
@@ -34 +34,0 @@
-+RTE_EXPORT_INTERNAL_SYMBOL(rte_intr_active_events_flags)
@@ -80 +80 @@
-index f3f6bdd01d..5d0607effe 100644
+index 4d0563fe2f..ef944ea767 100644
@@ -83 +83 @@
-@@ -40,6 +40,8 @@
+@@ -36,6 +36,8 @@
@@ -92 +92 @@
-@@ -886,6 +888,22 @@ out:
+@@ -894,6 +896,22 @@ out:
@@ -115 +115 @@
-@@ -1013,7 +1031,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds)
+@@ -1025,7 +1043,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds)
@@ -124 +124 @@
-@@ -1027,6 +1045,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds)
+@@ -1039,6 +1057,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds)
@@ -132 +132 @@
-@@ -1641,3 +1660,13 @@ int rte_thread_is_intr(void)
+@@ -1623,3 +1642,12 @@ int rte_thread_is_intr(void)
@@ -137 +136,0 @@
-+RTE_EXPORT_INTERNAL_SYMBOL(rte_intr_active_events_flags)
@@ -145,0 +145,12 @@
+diff --git a/lib/eal/version.map b/lib/eal/version.map
+index 5e0cd47c82..ad6246ad30 100644
+--- a/lib/eal/version.map
++++ b/lib/eal/version.map
+@@ -403,6 +403,7 @@ INTERNAL {
+ rte_eal_get_baseaddr;
+ rte_eal_parse_coremask;
+ rte_firmware_read;
++ rte_intr_active_events_flags;
+ rte_intr_allow_others;
+ rte_intr_cap_multiple;
+ rte_intr_dev_fd_get;
@@ -147 +158 @@
-index 5ff30c7631..5650b84d1f 100644
+index 49efdc098c..8ea137092c 100644
@@ -150 +161 @@
-@@ -116,6 +116,13 @@ rte_thread_is_intr(void)
+@@ -114,6 +114,12 @@ rte_thread_is_intr(void)
@@ -154 +164,0 @@
-+RTE_EXPORT_INTERNAL_SYMBOL(rte_intr_active_events_flags)
@@ -161 +170,0 @@
- RTE_EXPORT_INTERNAL_SYMBOL(rte_intr_rx_ctl)
@@ -163,0 +173 @@
+ __rte_unused int epfd, __rte_unused int op,
More information about the stable
mailing list