Commit 41db6f99 authored by David Arinzon's avatar David Arinzon Committed by Jakub Kicinski

net: ena: Destroy correct number of xdp queues upon failure

The ena_setup_and_create_all_xdp_queues() function freed all the
resources upon failure, after creating only xdp_num_queues queues,
instead of freeing just the created ones.

In this patch, the only resources that are freed, are the ones
allocated right before the failure occurs.

Fixes: 548c4940 ("net: ena: Implement XDP_TX action")
Signed-off-by: default avatarShahar Itzko <itzko@amazon.com>
Signed-off-by: default avatarDavid Arinzon <darinzon@amazon.com>
Link: https://lore.kernel.org/r/20231211062801.27891-2-darinzon@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f99cd562
...@@ -74,6 +74,8 @@ static void ena_unmap_tx_buff(struct ena_ring *tx_ring, ...@@ -74,6 +74,8 @@ static void ena_unmap_tx_buff(struct ena_ring *tx_ring,
struct ena_tx_buffer *tx_info); struct ena_tx_buffer *tx_info);
static int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter, static int ena_create_io_tx_queues_in_range(struct ena_adapter *adapter,
int first_index, int count); int first_index, int count);
static void ena_free_all_io_tx_resources_in_range(struct ena_adapter *adapter,
int first_index, int count);
/* Increase a stat by cnt while holding syncp seqlock on 32bit machines */ /* Increase a stat by cnt while holding syncp seqlock on 32bit machines */
static void ena_increase_stat(u64 *statp, u64 cnt, static void ena_increase_stat(u64 *statp, u64 cnt,
...@@ -457,23 +459,22 @@ static void ena_init_all_xdp_queues(struct ena_adapter *adapter) ...@@ -457,23 +459,22 @@ static void ena_init_all_xdp_queues(struct ena_adapter *adapter)
static int ena_setup_and_create_all_xdp_queues(struct ena_adapter *adapter) static int ena_setup_and_create_all_xdp_queues(struct ena_adapter *adapter)
{ {
u32 xdp_first_ring = adapter->xdp_first_ring;
u32 xdp_num_queues = adapter->xdp_num_queues;
int rc = 0; int rc = 0;
rc = ena_setup_tx_resources_in_range(adapter, adapter->xdp_first_ring, rc = ena_setup_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues);
adapter->xdp_num_queues);
if (rc) if (rc)
goto setup_err; goto setup_err;
rc = ena_create_io_tx_queues_in_range(adapter, rc = ena_create_io_tx_queues_in_range(adapter, xdp_first_ring, xdp_num_queues);
adapter->xdp_first_ring,
adapter->xdp_num_queues);
if (rc) if (rc)
goto create_err; goto create_err;
return 0; return 0;
create_err: create_err:
ena_free_all_io_tx_resources(adapter); ena_free_all_io_tx_resources_in_range(adapter, xdp_first_ring, xdp_num_queues);
setup_err: setup_err:
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment