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: sta...@dpdk.org
Signed-off-by: Shai Brandes <shaib...@amazon.com>
Reviewed-by: Amit Bernstein <amitb...@amazon.com>
Reviewed-by: Yosef Raisman <yrais...@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 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

Reply via email to