* [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure
[not found] <20250522130826.3246-1-shaibran@amazon.com>
@ 2025-05-22 13:08 ` Shai Brandes
2025-05-22 13:08 ` [PATCH v2 6/7] net/ena: fix aenq timeout with low poll interval Shai Brandes
1 sibling, 0 replies; 2+ messages in thread
From: Shai Brandes @ 2025-05-22 13:08 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes, stable
Fixed the device initialization routine to correctly handle
failure during the registration or enabling of interrupts
when operating in control path interrupt mode.
Fixes: ca1dfa85f0d3 ("net/ena: add control path pure polling mode")
Cc: stable@dpdk.org
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
Reviewed-by: Yosef Raisman <yraisman@amazon.com>
---
doc/guides/rel_notes/release_25_07.rst | 2 ++
drivers/net/ena/ena_ethdev.c | 20 ++++++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index 07b5feabc4..e7fecace4f 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -59,6 +59,8 @@ New Features
* Added support for enabling fragment bypass mode for egress packets.
This mode bypasses the PPS limit enforced by EC2 for fragmented egress packets on every ENI.
+ * Fixed the device initialization routine to correctly handle failure during the registration
+ or enabling of interrupts when operating in control path interrupt mode.
* **Added Mucse rnp net driver.**
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index 4caad9006e..f26f08ca85 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -2465,8 +2465,16 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
if (!adapter->control_path_poll_interval) {
/* Control path interrupt mode */
- rte_intr_callback_register(intr_handle, ena_control_path_handler, eth_dev);
- rte_intr_enable(intr_handle);
+ rc = rte_intr_callback_register(intr_handle, ena_control_path_handler, eth_dev);
+ if (unlikely(rc < 0)) {
+ PMD_DRV_LOG_LINE(ERR, "Failed to register control path interrupt");
+ goto err_stats_destroy;
+ }
+ rc = rte_intr_enable(intr_handle);
+ if (unlikely(rc < 0)) {
+ PMD_DRV_LOG_LINE(ERR, "Failed to enable control path interrupt");
+ goto err_control_path_destroy;
+ }
ena_com_set_admin_polling_mode(ena_dev, false);
} else {
/* Control path polling mode */
@@ -2485,6 +2493,14 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)
return 0;
err_control_path_destroy:
+ if (!adapter->control_path_poll_interval) {
+ rc = rte_intr_callback_unregister_sync(intr_handle,
+ ena_control_path_handler,
+ eth_dev);
+ if (unlikely(rc < 0))
+ PMD_INIT_LOG_LINE(ERR, "Failed to unregister interrupt handler");
+ }
+err_stats_destroy:
rte_free(adapter->drv_stats);
err_indirect_table_destroy:
ena_indirect_table_release(adapter);
--
2.17.1
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH v2 6/7] net/ena: fix aenq timeout with low poll interval
[not found] <20250522130826.3246-1-shaibran@amazon.com>
2025-05-22 13:08 ` [PATCH v2 5/7] net/ena: fix unhandled interrupt config failure Shai Brandes
@ 2025-05-22 13:08 ` Shai Brandes
1 sibling, 0 replies; 2+ messages in thread
From: Shai Brandes @ 2025-05-22 13:08 UTC (permalink / raw)
To: stephen; +Cc: dev, Shai Brandes, stable
The driver can work in polling-based functionality of the admin
queue, eliminating the need for interrupts in the control-path.
This mode is mandatory when using the uio_pci_generic driver,
which lacks interrupt support.
The control_path_poll_interval devarg is being set within the range
[1..1000]. A value of 0 disables the polling mechanism.
This value defines the interval in milliseconds at which the driver
checks for asynchronous notifications from the device.
Testing revealed that setting this interval below 500 milliseconds
might lead to false detection of device unresponsiveness.
This patch clamps the user-defined value to the updated valid range
[500..1000] that ensures reliable aenq monitoring.
Fixes: ca1dfa85f0d3 ("net/ena: add control path pure polling mode")
Cc: stable@dpdk.org
Signed-off-by: Shai Brandes <shaibran@amazon.com>
Reviewed-by: Amit Bernstein <amitbern@amazon.com>
Reviewed-by: Yosef Raisman <yraisman@amazon.com>
---
doc/guides/nics/ena.rst | 4 +++-
doc/guides/rel_notes/release_25_07.rst | 2 ++
drivers/net/ena/ena_ethdev.c | 24 ++++++++++--------------
drivers/net/ena/ena_ethdev.h | 3 ++-
4 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/doc/guides/nics/ena.rst b/doc/guides/nics/ena.rst
index a42deccd81..decb6be766 100644
--- a/doc/guides/nics/ena.rst
+++ b/doc/guides/nics/ena.rst
@@ -136,7 +136,9 @@ Runtime Configuration
0 - Disable (Admin queue will work in interrupt mode).
- [1..1000] - Number of milliseconds to wait between periodic inspection of the admin queues.
+ [500..1000] – Time in milliseconds to wait between periodic checks of the admin queues.
+ If a value outside this range is specified, the driver will automatically adjust it to
+ fit within the valid range.
**A non-zero value for this devarg is mandatory for control path functionality
when binding ports to uio_pci_generic kernel module which lacks interrupt support.**
diff --git a/doc/guides/rel_notes/release_25_07.rst b/doc/guides/rel_notes/release_25_07.rst
index e7fecace4f..662b0db49e 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -61,6 +61,8 @@ New Features
This mode bypasses the PPS limit enforced by EC2 for fragmented egress packets on every ENI.
* Fixed the device initialization routine to correctly handle failure during the registration
or enabling of interrupts when operating in control path interrupt mode.
+ * Fixed an issue where the device might be incorrectly reported as unresponsive when using
+ polling-based admin queue functionality with a poll interval of less than 500 milliseconds.
* **Added Mucse rnp net driver.**
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index f26f08ca85..182e063bf4 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -30,6 +30,8 @@
#define GET_L4_HDR_LEN(mbuf) \
((rte_pktmbuf_mtod_offset(mbuf, struct rte_tcp_hdr *, \
mbuf->l3_len + mbuf->l2_len)->data_off) >> 4)
+#define CLAMP_VAL(val, min, max) \
+ (RTE_MIN(RTE_MAX((val), (typeof(val))(min)), (typeof(val))(max)))
#define ETH_GSTRING_LEN 32
@@ -3756,25 +3758,19 @@ static int ena_process_uint_devarg(const char *key,
uint64_value * rte_get_timer_hz();
}
} else if (strcmp(key, ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL) == 0) {
- if (uint64_value > ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC) {
- PMD_INIT_LOG_LINE(ERR,
- "Control path polling interval is too long: %" PRIu64 " msecs. "
- "Maximum allowed: %d msecs.",
- uint64_value, ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC);
- return -EINVAL;
- } else if (uint64_value == 0) {
+ if (uint64_value == 0) {
PMD_INIT_LOG_LINE(INFO,
- "Control path polling interval is set to zero. Operating in "
- "interrupt mode.");
- adapter->control_path_poll_interval = 0;
+ "Control path polling is disabled - Operating in interrupt mode");
} else {
+ uint64_value = CLAMP_VAL(uint64_value,
+ ENA_MIN_CONTROL_PATH_POLL_INTERVAL_MSEC,
+ ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC);
PMD_INIT_LOG_LINE(INFO,
- "Control path polling interval is set to %" PRIu64 " msecs.",
+ "Control path polling interval is %" PRIu64 " msec",
uint64_value);
- adapter->control_path_poll_interval = uint64_value * USEC_PER_MSEC;
}
+ adapter->control_path_poll_interval = uint64_value * (USEC_PER_MSEC);
}
-
return 0;
}
@@ -4081,7 +4077,7 @@ RTE_PMD_REGISTER_KMOD_DEP(net_ena, "* igb_uio | uio_pci_generic | vfio-pci");
RTE_PMD_REGISTER_PARAM_STRING(net_ena,
ENA_DEVARG_LLQ_POLICY "=<0|1|2|3> "
ENA_DEVARG_MISS_TXC_TO "=<uint>"
- ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "=<0-1000>");
+ ENA_DEVARG_CONTROL_PATH_POLL_INTERVAL "= 0|<500-1000>"
ENA_DEVARG_ENABLE_FRAG_BYPASS "=<0|1> ");
RTE_LOG_REGISTER_SUFFIX(ena_logtype_init, init, NOTICE);
RTE_LOG_REGISTER_SUFFIX(ena_logtype_driver, driver, NOTICE);
diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h
index f4461733e9..e5d23e2e27 100644
--- a/drivers/net/ena/ena_ethdev.h
+++ b/drivers/net/ena/ena_ethdev.h
@@ -42,7 +42,8 @@
#define ENA_MONITORED_TX_QUEUES 3
#define ENA_DEFAULT_MISSING_COMP 256U
-#define ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC 1000
+#define ENA_MAX_CONTROL_PATH_POLL_INTERVAL_MSEC 1000U
+#define ENA_MIN_CONTROL_PATH_POLL_INTERVAL_MSEC 500U
/* While processing submitted and completed descriptors (rx and tx path
* respectively) in a loop it is desired to:
--
2.17.1
^ permalink raw reply [flat|nested] 2+ messages in thread