From: Long Li <lon...@microsoft.com>

FDs passed from rte_mp_msg are duplicated to the secondary process and
need to be closed.

Fixes: 0203d33a10 ("net/mlx4: support secondary process")
Signed-off-by: Long Li <lon...@microsoft.com>
---
Change in v2: handle error case where mlx4_proc_priv_init() might fail 

 drivers/net/mlx4/mlx4.c    | 9 ++++++---
 drivers/net/mlx4/mlx4_mp.c | 7 ++++++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 3f3c4a7c72..2e0b4a17e2 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -877,6 +877,8 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct 
rte_pci_device *pci_dev)
                snprintf(name, sizeof(name), "%s port %u",
                         mlx4_glue->get_device_name(ibv_dev), port);
                if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
+                       int fd;
+
                        eth_dev = rte_eth_dev_attach_secondary(name);
                        if (eth_dev == NULL) {
                                ERROR("can not attach rte ethdev");
@@ -899,13 +901,14 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct 
rte_pci_device *pci_dev)
                        if (err)
                                goto err_secondary;
                        /* Receive command fd from primary process. */
-                       err = mlx4_mp_req_verbs_cmd_fd(eth_dev);
-                       if (err < 0) {
+                       fd = mlx4_mp_req_verbs_cmd_fd(eth_dev);
+                       if (fd < 0) {
                                err = rte_errno;
                                goto err_secondary;
                        }
                        /* Remap UAR for Tx queues. */
-                       err = mlx4_tx_uar_init_secondary(eth_dev, err);
+                       err = mlx4_tx_uar_init_secondary(eth_dev, fd);
+                       close(fd);
                        if (err) {
                                err = rte_errno;
                                goto err_secondary;
diff --git a/drivers/net/mlx4/mlx4_mp.c b/drivers/net/mlx4/mlx4_mp.c
index 8fcfb5490e..b0bb48c8f1 100644
--- a/drivers/net/mlx4/mlx4_mp.c
+++ b/drivers/net/mlx4/mlx4_mp.c
@@ -5,6 +5,7 @@
 
 #include <stdio.h>
 #include <time.h>
+#include <unistd.h>
 
 #include <rte_eal.h>
 #include <ethdev_driver.h>
@@ -134,15 +135,19 @@ mp_secondary_handle(const struct rte_mp_msg *mp_msg, 
const void *peer)
                        mlx4_tx_uar_uninit_secondary(dev);
                        mlx4_proc_priv_uninit(dev);
                        ret = mlx4_proc_priv_init(dev);
-                       if (ret)
+                       if (ret) {
+                               close(mp_msg->fds[0]);
                                return -rte_errno;
+                       }
                        ret = mlx4_tx_uar_init_secondary(dev, mp_msg->fds[0]);
                        if (ret) {
+                               close(mp_msg->fds[0]);
                                mlx4_proc_priv_uninit(dev);
                                return -rte_errno;
                        }
                }
 #endif
+               close(mp_msg->fds[0]);
                rte_mb();
                mp_init_msg(dev, &mp_res, param->type);
                res->result = 0;
-- 
2.17.1

Reply via email to