Hi Wojciech,
> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Wojciech Zmuda > Sent: Tuesday, January 5, 2016 2:05 PM > To: dev at dpdk.org > Subject: [dpdk-dev] [PATCH] af_packet: make the device detachable > > 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 Typo, compatibile should be compatible. > 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 */ Above comment should be /* find the ethdev entry */ > + eth_dev = rte_eth_dev_allocated(name); > + if (eth_dev == NULL) > + return -1; > + In rte_pmd_init_internals() memory is allocated for rx and tx queues this should also be freed. Line 606: rx_queue->rd = rte_zmalloc_socket(name, rdsize, 0, numa_node); Line 620:tx_queue->rd = rte_zmalloc_socket(name, rdsize, 0, numa_node); rte_free((*internals)->rx_queue[q].rd); rte_free((*internals)->tx_queue[q].rd); > + 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