In zero-copy mode the per-memseg regions (i > 0) take their fd from
rte_memseg_get_fd(), which rte_memory.h documents as EAL-internal and
read-only. Both memif_connect() and memif_free_regions() closed that fd,
so the next connect handed the peer a stale (possibly reused)
descriptor and the PMD closed a descriptor it does not own. Stop closing
it in both paths and just clear the region fd; the fd is not ours.

Fixes: 43b815d88188 ("net/memif: support zero-copy slave")
Cc: [email protected]

Suggested-by: Stephen Hemminger <[email protected]>
Signed-off-by: Sriram Yagnaraman <[email protected]>
---
 drivers/net/memif/rte_eth_memif.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/net/memif/rte_eth_memif.c 
b/drivers/net/memif/rte_eth_memif.c
index 1d1d12e242..e753243440 100644
--- a/drivers/net/memif/rte_eth_memif.c
+++ b/drivers/net/memif/rte_eth_memif.c
@@ -1289,9 +1289,9 @@ memif_free_regions(struct rte_eth_dev *dev)
                if (r != NULL) {
                        /* This is memzone */
                        if (i > 0 && (pmd->flags & ETH_MEMIF_FLAG_ZERO_COPY)) {
+                               /* memseg fd is owned by EAL, do not close */
                                r->addr = NULL;
-                               if (r->fd > 0)
-                                       close(r->fd);
+                               r->fd = -1;
                        }
                        if (r->addr != NULL) {
                                munmap(r->addr, r->region_size);
@@ -1611,8 +1611,7 @@ memif_connect(struct rte_eth_dev *dev)
                                }
                        }
                        if (i > 0 && (pmd->flags & ETH_MEMIF_FLAG_ZERO_COPY)) {
-                               /* close memseg file */
-                               close(mr->fd);
+                               /* memseg fd is owned by EAL, do not close */
                                mr->fd = -1;
                        }
                }
-- 
2.43.7

Reply via email to