Fix memory leak when detaching virtual device. Set dev_flags to
RTE_ETH_DEV_DETACHABLE and implement pmd_af_packet_drv.uninit method.
Copy device name to ethdev->data to make it compatibile with
rte_eth_dev_allocated().

Signed-off-by: Wojciech Zmuda <woz at semihalf.com>
---
 drivers/net/af_packet/rte_eth_af_packet.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/net/af_packet/rte_eth_af_packet.c 
b/drivers/net/af_packet/rte_eth_af_packet.c
index 767f36b..7ef65ff 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -667,11 +667,13 @@ rte_pmd_init_internals(const char *name,
        data->nb_tx_queues = (uint16_t)nb_queues;
        data->dev_link = pmd_link;
        data->mac_addrs = &(*internals)->eth_addr;
+       strncpy(data->name,
+               (*eth_dev)->data->name, strlen((*eth_dev)->data->name));

        (*eth_dev)->data = data;
        (*eth_dev)->dev_ops = &ops;
        (*eth_dev)->driver = NULL;
-       (*eth_dev)->data->dev_flags = 0;
+       (*eth_dev)->data->dev_flags = RTE_ETH_DEV_DETACHABLE;
        (*eth_dev)->data->drv_name = drivername;
        (*eth_dev)->data->kdrv = RTE_KDRV_NONE;
        (*eth_dev)->data->numa_node = numa_node;
@@ -836,10 +838,35 @@ exit:
        return ret;
 }

+static int
+rte_pmd_af_packet_devuninit(const char *name)
+{
+       struct rte_eth_dev *eth_dev = NULL;
+
+       RTE_LOG(INFO, PMD, "Closing AF_PACKET ethdev on numa socket %u\n",
+                       rte_socket_id());
+
+       if (name == NULL)
+               return -1;
+
+       /* reserve an ethdev entry */
+       eth_dev = rte_eth_dev_allocated(name);
+       if (eth_dev == NULL)
+               return -1;
+
+       rte_free(eth_dev->data->dev_private);
+       rte_free(eth_dev->data);
+
+       rte_eth_dev_release_port(eth_dev);
+
+       return 0;
+}
+
 static struct rte_driver pmd_af_packet_drv = {
        .name = "eth_af_packet",
        .type = PMD_VDEV,
        .init = rte_pmd_af_packet_devinit,
+       .uninit = rte_pmd_af_packet_devuninit,
 };

 PMD_REGISTER_DRIVER(pmd_af_packet_drv);
-- 
1.9.1

Reply via email to