[PATCH v1 1/2] net/iavf: fix memory leaks around IRQ resources
Anatoly Burakov
anatoly.burakov at intel.com
Thu Oct 15 10:34:03 CEST 2026
`iavf_config_rx_queues_irqs()` allocates a queue-vector map and may
enable eventfds and allocate an interrupt vector list. If queue startup
then fails, those resources remain allocated. The queue-vector map is
also retained after a normal stop, leaking it across start/stop cycles.
Release the resources on failed startup and free the queue-vector map
on stop. Clean up eventfds when interrupt setup fails as well.
Fixes: f593944fc988 ("net/iavf: enable IRQ mapping configuration for large VF")
Cc: stable at dpdk.org
Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
drivers/net/intel/iavf/iavf_ethdev.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index 6cf12ec34f..c0c58af746 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -862,7 +862,7 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev,
if (rte_intr_cap_multiple(intr_handle) &&
dev->data->dev_conf.intr_conf.rxq) {
if (rte_intr_efd_enable(intr_handle, dev->data->nb_rx_queues))
- return -1;
+ goto efd_alloc_err;
}
if (rte_intr_dp_is_en(intr_handle)) {
@@ -870,7 +870,7 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev,
dev->data->nb_rx_queues)) {
PMD_DRV_LOG(ERR, "Failed to allocate %d rx intr_vec",
dev->data->nb_rx_queues);
- return -1;
+ goto qv_map_alloc_err;
}
}
@@ -984,6 +984,8 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev,
qv_map_alloc_err:
rte_intr_vec_list_free(intr_handle);
+efd_alloc_err:
+ rte_intr_efd_disable(intr_handle);
return -1;
}
@@ -1037,12 +1039,14 @@ iavf_dev_start(struct rte_eth_dev *dev)
struct rte_intr_handle *intr_handle = dev->intr_handle;
uint16_t num_queue_pairs;
uint16_t index = 0;
+ bool wb_on_itr;
PMD_INIT_FUNC_TRACE();
if (adapter->closed)
return -1;
+ wb_on_itr = (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) != 0;
adapter->stopped = 0;
vf->max_pkt_len = dev->data->mtu + IAVF_ETH_OVERHEAD;
@@ -1094,7 +1098,7 @@ iavf_dev_start(struct rte_eth_dev *dev)
}
/* re-enable intr again, because efd assign may change */
if (dev->data->dev_conf.intr_conf.rxq != 0) {
- if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR)
+ if (wb_on_itr)
rte_intr_disable(intr_handle);
rte_intr_enable(intr_handle);
}
@@ -1112,7 +1116,7 @@ iavf_dev_start(struct rte_eth_dev *dev)
if (iavf_start_queues(dev) != 0) {
PMD_DRV_LOG(ERR, "enable queues failed");
- goto error;
+ goto irq_error;
}
iavf_phc_sync_alarm_start(dev);
@@ -1122,6 +1126,13 @@ iavf_dev_start(struct rte_eth_dev *dev)
return 0;
+irq_error:
+ if (!wb_on_itr && dev->data->dev_conf.intr_conf.rxq != 0)
+ rte_intr_disable(intr_handle);
+ rte_intr_efd_disable(intr_handle);
+ rte_intr_vec_list_free(intr_handle);
+ rte_free(vf->qv_map);
+ vf->qv_map = NULL;
error:
return -1;
}
@@ -1154,6 +1165,8 @@ iavf_dev_stop(struct rte_eth_dev *dev)
rte_intr_vec_list_free(intr_handle);
iavf_stop_queues(dev);
+ rte_free(vf->qv_map);
+ vf->qv_map = NULL;
adapter->stopped = 1;
dev->data->dev_started = 0;
--
2.52.0
More information about the dev
mailing list