net/tap: fix mbuf and mem leak during queue release
For the tap PMD, we should release mbufs and iovecs from the Rx queue when closing device. In order to remove duplicated code, rte_pmd_tap_remove() calls tap_dev_close(). Fixes: 0781f5762cfe ("net/tap: support segmented mbufs") Cc: stable@dpdk.org Signed-off-by: Yunjian Wang <wangyunjian@huawei.com> Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
24cb500c17
commit
710aa42790
@ -1020,15 +1020,25 @@ tap_dev_close(struct rte_eth_dev *dev)
|
||||
int i;
|
||||
struct pmd_internals *internals = dev->data->dev_private;
|
||||
struct pmd_process_private *process_private = dev->process_private;
|
||||
struct rx_queue *rxq;
|
||||
|
||||
tap_link_set_down(dev);
|
||||
tap_flow_flush(dev, NULL);
|
||||
tap_flow_implicit_flush(internals, NULL);
|
||||
if (internals->nlsk_fd != -1) {
|
||||
tap_flow_flush(dev, NULL);
|
||||
tap_flow_implicit_flush(internals, NULL);
|
||||
tap_nl_final(internals->nlsk_fd);
|
||||
internals->nlsk_fd = -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
|
||||
if (process_private->rxq_fds[i] != -1) {
|
||||
rxq = &internals->rxq[i];
|
||||
close(process_private->rxq_fds[i]);
|
||||
process_private->rxq_fds[i] = -1;
|
||||
rte_pktmbuf_free(rxq->pool);
|
||||
rte_free(rxq->iovecs);
|
||||
rxq->pool = NULL;
|
||||
rxq->iovecs = NULL;
|
||||
}
|
||||
if (process_private->txq_fds[i] != -1) {
|
||||
close(process_private->txq_fds[i]);
|
||||
@ -2398,8 +2408,6 @@ rte_pmd_tap_remove(struct rte_vdev_device *dev)
|
||||
{
|
||||
struct rte_eth_dev *eth_dev = NULL;
|
||||
struct pmd_internals *internals;
|
||||
struct pmd_process_private *process_private;
|
||||
int i;
|
||||
|
||||
/* find the ethdev entry */
|
||||
eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev));
|
||||
@ -2412,28 +2420,12 @@ rte_pmd_tap_remove(struct rte_vdev_device *dev)
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return rte_eth_dev_release_port(eth_dev);
|
||||
|
||||
internals = eth_dev->data->dev_private;
|
||||
process_private = eth_dev->process_private;
|
||||
tap_dev_close(eth_dev);
|
||||
|
||||
internals = eth_dev->data->dev_private;
|
||||
TAP_LOG(DEBUG, "Closing %s Ethernet device on numa %u",
|
||||
tuntap_types[internals->type], rte_socket_id());
|
||||
|
||||
if (internals->nlsk_fd) {
|
||||
tap_flow_flush(eth_dev, NULL);
|
||||
tap_flow_implicit_flush(internals, NULL);
|
||||
tap_nl_final(internals->nlsk_fd);
|
||||
}
|
||||
for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
|
||||
if (process_private->rxq_fds[i] != -1) {
|
||||
close(process_private->rxq_fds[i]);
|
||||
process_private->rxq_fds[i] = -1;
|
||||
}
|
||||
if (process_private->txq_fds[i] != -1) {
|
||||
close(process_private->txq_fds[i]);
|
||||
process_private->txq_fds[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
close(internals->ioctl_sock);
|
||||
rte_free(eth_dev->process_private);
|
||||
if (tap_devices_count == 1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user