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