[dpdk-dev] [PATCH] net/virtio: fix memory leak

2017-10-25 Thread Pengzhen Liu
In function eth_virtio_dev_init(), dynamic memory stored
in "eth_dev->data->mac_addrs" variable and it is not freed whe function return,
this is a possible memory leak.

Fixes: 6b9ed026a870 ("net/virtio: eth_dev->data->mac_addrs is not freed")
Cc: sta...@dpdk.org
Signed-off-by: Pengzhen Liu 
---
 drivers/net/virtio/virtio_ethdev.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index 0ec54a9..d9f186f 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1586,13 +1586,13 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
if (!hw->virtio_user_dev) {
ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw);
if (ret)
-   return ret;
+goto out;
}
 
/* reset device and negotiate default features */
ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES);
if (ret < 0)
-   return ret;
+goto out;
 
/* Setup interrupt callback  */
if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
@@ -1600,6 +1600,10 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
virtio_interrupt_handler, eth_dev);
 
return 0;
+
+out:
+rte_free(eth_dev->data->mac_addrs);
+return ret;
 }
 
 static int
-- 
1.7.12.4



[dpdk-dev] [PATCH] net/virtio: fix memory leak

2017-10-26 Thread Pengzhen Liu
In function eth_virtio_dev_init(), dynamic memory stored
in "eth_dev->data->mac_addrs" variable and it is not freed when function return,
this is a possible memory leak.

Fixes: 6b9ed026a870 ("net/virtio: eth_dev->data->mac_addrs is not freed")
Cc: sta...@dpdk.org
Signed-off-by: Pengzhen Liu 
---
 drivers/net/virtio/virtio_ethdev.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index c85c14d..c450f25 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1587,13 +1587,13 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
if (!hw->virtio_user_dev) {
ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw);
if (ret)
-goto out;
+   goto out;
}
 
/* reset device and negotiate default features */
ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES);
if (ret < 0)
-goto out;
+   goto out;
 
/* Setup interrupt callback  */
if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
@@ -1603,8 +1603,8 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev 
*dev,
return 0;
 
 out:
-rte_free(eth_dev->data->mac_addrs);
-return ret;
+   rte_free(eth_dev->data->mac_addrs);
+   return ret;
 }
 
 static int
-- 
1.7.12.4



[dpdk-dev] [PATCH] net/virtio: fix memory leak

2017-10-26 Thread Pengzhen Liu
In function eth_virtio_dev_init(), dynamic memory stored
in "eth_dev->data->mac_addrs" variable and it is not freed
when function return,
this is a possible memory leak.

Fixes: 6b9ed026a870 ("net/virtio: eth_dev->data->mac_addrs is not freed")
Cc: sta...@dpdk.org
Signed-off-by: Pengzhen Liu 
---
 drivers/net/virtio/virtio_ethdev.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index c85c14d..c450f25 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1587,13 +1587,13 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
if (!hw->virtio_user_dev) {
ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw);
if (ret)
-goto out;
+   goto out;
}
 
/* reset device and negotiate default features */
ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES);
if (ret < 0)
-goto out;
+   goto out;
 
/* Setup interrupt callback  */
if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
@@ -1603,8 +1603,8 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev 
*dev,
return 0;
 
 out:
-rte_free(eth_dev->data->mac_addrs);
-return ret;
+   rte_free(eth_dev->data->mac_addrs);
+   return ret;
 }
 
 static int
-- 
1.7.12.4



[dpdk-dev] [PATCH] net/tap: fix invalid queue file descriptor

2017-10-26 Thread Pengzhen Liu
From: Keith Wiles 

Rx and Tx queues share the common tap file descriptor, but save this
value separately.

Setting up Rx/Tx queue sets up both queues, release_queue close the
tap file but update file descriptor only for that queue.

This makes other queue's file descriptor invalid.

As a workaround, prevent release_queue callback to be called by default.

This is done by separating Rx/Tx setup functions, so that each only
setup its own queue, this prevents rte_eth_rx/tx_queue_setup() calling
release_queue before setup_queue.

Fixes: 02f96a0a82d1 ("net/tap: add TUN/TAP device PMD")

Signed-off-by: Keith Wiles 
Signed-off-by: Ferruh Yigit 
---
 drivers/net/tap/rte_eth_tap.c | 26 ++
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index c0afc2d..91f63f5 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -428,8 +428,6 @@ struct pmd_internals {
}
}
}
-   dev->data->rx_queues[qid] = rx;
-   dev->data->tx_queues[qid] = tx;
 
rx->fd = fd;
tx->fd = fd;
@@ -438,6 +436,26 @@ struct pmd_internals {
 }
 
 static int
+rx_setup_queue(struct rte_eth_dev *dev,
+   struct pmd_internals *internals,
+   uint16_t qid)
+{
+   dev->data->rx_queues[qid] = &internals->rxq[qid];
+
+   return tap_setup_queue(dev, internals, qid);
+}
+
+static int
+tx_setup_queue(struct rte_eth_dev *dev,
+   struct pmd_internals *internals,
+   uint16_t qid)
+{
+   dev->data->tx_queues[qid] = &internals->txq[qid];
+
+   return tap_setup_queue(dev, internals, qid);
+}
+
+static int
 tap_rx_queue_setup(struct rte_eth_dev *dev,
   uint16_t rx_queue_id,
   uint16_t nb_rx_desc __rte_unused,
@@ -469,7 +487,7 @@ struct pmd_internals {
return -ENOMEM;
}
 
-   fd = tap_setup_queue(dev, internals, rx_queue_id);
+   fd = rx_setup_queue(dev, internals, rx_queue_id);
if (fd == -1)
return -1;
 
@@ -493,7 +511,7 @@ struct pmd_internals {
if (tx_queue_id >= internals->nb_queues)
return -1;
 
-   ret = tap_setup_queue(dev, internals, tx_queue_id);
+   ret = tx_setup_queue(dev, internals, tx_queue_id);
if (ret == -1)
return -1;
 
-- 
1.7.12.4



[dpdk-dev] [PATCH] net/virtio: fix memory leak

2017-10-26 Thread Pengzhen Liu
In function eth_virtio_dev_init(), dynamic memory stored
in "eth_dev->data->mac_addrs" variable and it is not freed
when function return,
this is a possible memory leak.

Fixes: 289ba0c0f52a ("net/virtio: eth_dev->data->mac_addrs is not freed")
Cc: sta...@dpdk.org
Signed-off-by: Pengzhen Liu 
---
 drivers/net/virtio/virtio_ethdev.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index ff2d9d6..4c7c3c4 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1587,13 +1587,13 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
if (!hw->virtio_user_dev) {
ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw);
if (ret)
-   return ret;
+   goto out;
}
 
/* reset device and negotiate default features */
ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES);
if (ret < 0)
-   return ret;
+   goto out;
 
/* Setup interrupt callback  */
if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
@@ -1601,6 +1601,10 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
virtio_interrupt_handler, eth_dev);
 
return 0;
+
+out:
+rte_free(eth_dev->data->mac_addrs);
+return ret;
 }
 
 static int
-- 
1.7.12.4



[dpdk-dev] [PATCH] net/virtio: fix memory leak

2017-10-26 Thread Pengzhen Liu
In function eth_virtio_dev_init(), dynamic memory stored
in "eth_dev->data->mac_addrs" variable and it is not freed
when function return,
this is a possible memory leak.

Fixes: 8ced1542f7a3 ("net/virtio: eth_dev->data->mac_addrs is not freed")
Cc: sta...@dpdk.org
Signed-off-by: Pengzhen Liu 
---
 drivers/net/virtio/virtio_ethdev.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index a8ae788..59a76ad 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1588,13 +1588,13 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
if (!hw->virtio_user_dev) {
ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw);
if (ret)
-   return ret;
+   goto out;
}
 
/* reset device and negotiate default features */
ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES);
if (ret < 0)
-   return ret;
+   goto out;
 
/* Setup interrupt callback  */
if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
@@ -1602,6 +1602,10 @@ static int virtio_dev_xstats_get_names(struct 
rte_eth_dev *dev,
virtio_interrupt_handler, eth_dev);
 
return 0;
+
+out:
+   rte_free(eth_dev->data->mac_addrs);
+   return ret;
 }
 
 static int
-- 
1.7.12.4