patch 'net/tap: support Rx queue interrupt enable/disable' has been queued to stable release 24.11.9
luca.boccassi at gmail.com
luca.boccassi at gmail.com
Tue Oct 27 12:48:25 CET 2026
Hi,
FYI, your patch has been queued to stable release 24.11.9
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 10/29/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/bluca/dpdk-stable
This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/478c0dd5412eca07e2f1487d8ceebb6016a0bb6c
Thanks.
Luca Boccassi
---
>From 478c0dd5412eca07e2f1487d8ceebb6016a0bb6c Mon Sep 17 00:00:00 2001
From: Maxime Leroy <maxime at leroys.fr>
Date: Mon, 27 Jul 2026 15:54:08 +0200
Subject: [PATCH] net/tap: support Rx queue interrupt enable/disable
[ upstream commit a164249bbeba3c1d6258601bd8838f5d6ccb2842 ]
The driver registers each queue file descriptor for Rx interrupts but
never provided the rx_queue_intr_enable/disable ops, so
rte_eth_dev_rx_intr_enable() returned -ENOTSUP. Applications that arm
queues before sleeping (l3fwd-power and similar) treat that as "no
interrupt support" and fall back to polling, even though the epoll wait
on the queue fd works. The advertised Rx interrupt feature is therefore
unusable through the generic API.
The queue fd is kept readable by the kernel whenever data is available
and is drained by the Rx burst itself, so there is no interrupt source to
arm or mask. Record whether the port was configured for Rx interrupts and
implement both ops to succeed in that mode and return -ENOTSUP otherwise,
so the generic Rx interrupt API works and applications can block on the
queue fd.
Fixes: 4870a8cdd968 ("net/tap: support Rx interrupt")
Signed-off-by: Maxime Leroy <maxime at leroys.fr>
---
drivers/net/tap/rte_eth_tap.c | 5 ++++
drivers/net/tap/rte_eth_tap.h | 4 ++++
drivers/net/tap/tap_intr.c | 44 +++++++++++++++++++++++++++++++++++
3 files changed, 53 insertions(+)
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index f184999d231..aa567366b14 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -948,6 +948,7 @@ static int
tap_dev_configure(struct rte_eth_dev *dev)
{
struct pmd_internals *pmd = dev->data->dev_private;
+ bool intr_mode = dev->data->dev_conf.intr_conf.rxq;
if (dev->data->nb_rx_queues != dev->data->nb_tx_queues) {
TAP_LOG(ERR,
@@ -958,6 +959,8 @@ tap_dev_configure(struct rte_eth_dev *dev)
return -1;
}
+ pmd->intr_mode = intr_mode;
+
TAP_LOG(INFO, "%s: %s: TX configured queues number: %u",
dev->device->name, pmd->name, dev->data->nb_tx_queues);
@@ -1881,6 +1884,8 @@ static const struct eth_dev_ops ops = {
.tx_queue_stop = tap_tx_queue_stop,
.rx_queue_release = tap_rx_queue_release,
.tx_queue_release = tap_tx_queue_release,
+ .rx_queue_intr_enable = tap_rx_queue_intr_enable,
+ .rx_queue_intr_disable = tap_rx_queue_intr_disable,
.flow_ctrl_get = tap_flow_ctrl_get,
.flow_ctrl_set = tap_flow_ctrl_set,
.link_update = tap_link_update,
diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h
index e29f2b04dfb..d706cd7f9a7 100644
--- a/drivers/net/tap/rte_eth_tap.h
+++ b/drivers/net/tap/rte_eth_tap.h
@@ -10,6 +10,7 @@
#include <sys/uio.h>
#include <inttypes.h>
#include <net/if.h>
+#include <stdbool.h>
#include <linux/if_tun.h>
@@ -92,6 +93,7 @@ struct pmd_internals {
struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
struct rte_intr_handle *intr_handle; /* LSC interrupt handle. */
+ bool intr_mode; /* Rx queue interrupt mode */
int ka_fd; /* keep-alive file descriptor */
struct rte_mempool *gso_ctx_mp; /* Mempool for GSO packets */
};
@@ -103,5 +105,7 @@ struct pmd_process_private {
/* tap_intr.c */
int tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set);
+int tap_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id);
+int tap_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id);
#endif /* _RTE_ETH_TAP_H_ */
diff --git a/drivers/net/tap/tap_intr.c b/drivers/net/tap/tap_intr.c
index 1908f71f97e..7db22b69f5e 100644
--- a/drivers/net/tap/tap_intr.c
+++ b/drivers/net/tap/tap_intr.c
@@ -112,3 +112,47 @@ tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set)
return tap_rx_intr_vec_install(dev);
return 0;
}
+
+/**
+ * Arm a queue for Rx interrupts.
+ *
+ * @param dev
+ * Pointer to the tap rte_eth_dev device structure.
+ * @param queue_id
+ * Rx queue index.
+ *
+ * @return
+ * 0 on success, -ENOTSUP if the port was not configured for Rx interrupts.
+ */
+int
+tap_rx_queue_intr_enable(struct rte_eth_dev *dev,
+ uint16_t queue_id __rte_unused)
+{
+ struct pmd_internals *pmd = dev->data->dev_private;
+
+ if (!pmd->intr_mode)
+ return -ENOTSUP;
+ return 0;
+}
+
+/**
+ * Disarm a queue from Rx interrupts.
+ *
+ * @param dev
+ * Pointer to the tap rte_eth_dev device structure.
+ * @param queue_id
+ * Rx queue index.
+ *
+ * @return
+ * 0 on success, -ENOTSUP if the port was not configured for Rx interrupts.
+ */
+int
+tap_rx_queue_intr_disable(struct rte_eth_dev *dev,
+ uint16_t queue_id __rte_unused)
+{
+ struct pmd_internals *pmd = dev->data->dev_private;
+
+ if (!pmd->intr_mode)
+ return -ENOTSUP;
+ return 0;
+}
--
2.47.3
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-10-27 11:43:54.204305517 +0000
+++ 0011-net-tap-support-Rx-queue-interrupt-enable-disable.patch 2026-10-27 11:43:53.502059077 +0000
@@ -1 +1 @@
-From a164249bbeba3c1d6258601bd8838f5d6ccb2842 Mon Sep 17 00:00:00 2001
+From 478c0dd5412eca07e2f1487d8ceebb6016a0bb6c Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit a164249bbeba3c1d6258601bd8838f5d6ccb2842 ]
+
@@ -22 +23,0 @@
-Cc: stable at dpdk.org
@@ -32 +33 @@
-index eec18a7c97..770d75f0c7 100644
+index f184999d231..aa567366b14 100644
@@ -35 +36 @@
-@@ -935,6 +935,7 @@ static int
+@@ -948,6 +948,7 @@ static int
@@ -43 +44 @@
-@@ -945,6 +946,8 @@ tap_dev_configure(struct rte_eth_dev *dev)
+@@ -958,6 +959,8 @@ tap_dev_configure(struct rte_eth_dev *dev)
@@ -52 +53 @@
-@@ -2098,6 +2101,8 @@ static const struct eth_dev_ops ops = {
+@@ -1881,6 +1884,8 @@ static const struct eth_dev_ops ops = {
@@ -62 +63 @@
-index f53a5ad077..df9a8f8a7a 100644
+index e29f2b04dfb..d706cd7f9a7 100644
@@ -65 +66,2 @@
-@@ -11,6 +11,7 @@
+@@ -10,6 +10,7 @@
+ #include <sys/uio.h>
@@ -67 +68,0 @@
- #include <limits.h>
@@ -73,3 +74,3 @@
-@@ -93,6 +94,7 @@ struct pmd_internals {
-
-
+@@ -92,6 +93,7 @@ struct pmd_internals {
+ struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
+ struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
@@ -81 +82 @@
-@@ -104,5 +106,7 @@ struct pmd_process_private {
+@@ -103,5 +105,7 @@ struct pmd_process_private {
@@ -90 +91 @@
-index 1908f71f97..7db22b69f5 100644
+index 1908f71f97e..7db22b69f5e 100644
More information about the stable
mailing list