Do a systematic cleanup if any part of the interrupt handle setup fails. Fixes: d61138d4f0e2 ("drivers: remove direct access to interrupt handle") Cc: sta...@dpdk.org
Signed-off-by: David Marchand <david.march...@redhat.com> --- drivers/net/vhost/rte_eth_vhost.c | 53 ++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 198bf4d1f4..96deb18d91 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -686,25 +686,32 @@ eth_vhost_install_intr(struct rte_eth_dev *dev) dev->intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE); if (dev->intr_handle == NULL) { VHOST_LOG(ERR, "Fail to allocate intr_handle\n"); - return -ENOMEM; + ret = -ENOMEM; + goto error; + } + if (rte_intr_efd_counter_size_set(dev->intr_handle, sizeof(uint64_t))) { + ret = -rte_errno; + goto error; } - if (rte_intr_efd_counter_size_set(dev->intr_handle, sizeof(uint64_t))) - return -rte_errno; if (rte_intr_vec_list_alloc(dev->intr_handle, NULL, nb_rxq)) { - VHOST_LOG(ERR, - "Failed to allocate memory for interrupt vector\n"); - rte_intr_instance_free(dev->intr_handle); - return -ENOMEM; + VHOST_LOG(ERR, "Failed to allocate memory for interrupt vector\n"); + ret = -ENOMEM; + goto error; } VHOST_LOG(INFO, "Prepare intr vec\n"); for (i = 0; i < nb_rxq; i++) { - if (rte_intr_vec_list_index_set(dev->intr_handle, i, RTE_INTR_VEC_RXTX_OFFSET + i)) - return -rte_errno; - if (rte_intr_efds_index_set(dev->intr_handle, i, -1)) - return -rte_errno; + if (rte_intr_vec_list_index_set(dev->intr_handle, i, + RTE_INTR_VEC_RXTX_OFFSET + i)) { + ret = -rte_errno; + goto error; + } + if (rte_intr_efds_index_set(dev->intr_handle, i, -1)) { + ret = -rte_errno; + goto error; + } vq = dev->data->rx_queues[i]; if (!vq) { VHOST_LOG(INFO, "rxq-%d not setup yet, skip!\n", i); @@ -729,16 +736,24 @@ eth_vhost_install_intr(struct rte_eth_dev *dev) VHOST_LOG(INFO, "Installed intr vec for rxq-%d\n", i); } - if (rte_intr_nb_efd_set(dev->intr_handle, nb_rxq)) - return -rte_errno; - - if (rte_intr_max_intr_set(dev->intr_handle, nb_rxq + 1)) - return -rte_errno; - - if (rte_intr_type_set(dev->intr_handle, RTE_INTR_HANDLE_VDEV)) - return -rte_errno; + if (rte_intr_nb_efd_set(dev->intr_handle, nb_rxq)) { + ret = -rte_errno; + goto error; + } + if (rte_intr_max_intr_set(dev->intr_handle, nb_rxq + 1)) { + ret = -rte_errno; + goto error; + } + if (rte_intr_type_set(dev->intr_handle, RTE_INTR_HANDLE_VDEV)) { + ret = -rte_errno; + goto error; + } return 0; + +error: + eth_vhost_uninstall_intr(dev); + return ret; } static void -- 2.39.2