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: [email protected]
Signed-off-by: Shai Brandes <[email protected]>
Reviewed-by: Amit Bernstein <[email protected]>
Reviewed-by: Yosef Raisman <[email protected]>
---
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 27749f232b..8c245d6805 100644
--- a/doc/guides/rel_notes/release_25_07.rst
+++ b/doc/guides/rel_notes/release_25_07.rst
@@ -67,6 +67,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.
* **Updated virtio driver.**
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index 18aa25f6c7..8ba4f3a9cf 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