close the memory region file descriptor
close the kick/callfd

vSwitch needs to run endlessly. resource leak is deadly issue.


Signed-off-by: Huawei Xie <huawei.xie at intel.com>
---
 lib/librte_vhost/vhost_user/vhost-net-user.c  |  7 ++--
 lib/librte_vhost/vhost_user/virtio-net-user.c | 59 +++++++++++++++++++--------
 lib/librte_vhost/vhost_user/virtio-net-user.h |  1 +
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c 
b/lib/librte_vhost/vhost_user/vhost-net-user.c
index 6b9ebd7..35215b4 100644
--- a/lib/librte_vhost/vhost_user/vhost-net-user.c
+++ b/lib/librte_vhost/vhost_user/vhost-net-user.c
@@ -283,9 +283,9 @@ vserver_message_handler(int connfd, uint64_t dat)
                RTE_LOG(ERR, VHOST_CONFIG,
                        "vhost read message failed\n");

-               /*TODO: cleanup */
                close(connfd);
                fdset_del(&g_vhost_server->fdset, connfd);
+               user_destroy_device(ctx);
                ops->destroy_device(ctx);

                return;
@@ -293,9 +293,9 @@ vserver_message_handler(int connfd, uint64_t dat)
                RTE_LOG(INFO, VHOST_CONFIG,
                        "vhost peer closed\n");

-               /*TODO: cleanup */
                close(connfd);
                fdset_del(&g_vhost_server->fdset, connfd);
+               user_destroy_device(ctx);
                ops->destroy_device(ctx);

                return;
@@ -304,9 +304,10 @@ vserver_message_handler(int connfd, uint64_t dat)
                RTE_LOG(ERR, VHOST_CONFIG,
                        "vhost read incorrect message\n");

-               /*TODO: cleanup */
                close(connfd);
                fdset_del(&g_vhost_server->fdset, connfd);
+               user_destroy_device(ctx);
+               ops->destroy_device(ctx);

                return;
        }
diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.c 
b/lib/librte_vhost/vhost_user/virtio-net-user.c
index 4e49e9b..75f9f54 100644
--- a/lib/librte_vhost/vhost_user/virtio-net-user.c
+++ b/lib/librte_vhost/vhost_user/virtio-net-user.c
@@ -65,6 +65,31 @@ get_blk_size(int fd)
        return (uint64_t)stat.st_blksize;
 }

+static void
+free_mem_region(struct virtio_net *dev)
+{
+       struct orig_region_map *region;
+       unsigned int idx;
+       int ret;
+       uint64_t alignment;
+
+       if (!dev || !dev->mem)
+               return;
+
+       region = orig_region(dev->mem, dev->mem->nregions);
+       for (idx = 0; idx < dev->mem->nregions; idx++) {
+               if (region[idx].mapped_address) {
+                       alignment = region[idx].blksz;
+                       printf("Freeing %p\n",
+                               (void *)(uintptr_t)region[idx].mapped_address);
+                       ret = munmap((void 
*)RTE_ALIGN_FLOOR(region[idx].mapped_address, alignment), 
RTE_ALIGN_CEIL(region[idx].mapped_size, alignment));
+                       printf("munmap ret= %d\n", ret);
+                       printf("close file %d\n", region[idx].fd);
+                       close(region[idx].fd);
+               }
+       }
+}
+
 int
 user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg)
 {
@@ -73,28 +98,15 @@ user_set_mem_table(struct vhost_device_ctx ctx, struct 
VhostUserMsg *pmsg)
        uint64_t mapped_address, mapped_size, base_address = 0;
        struct virtio_net *dev;
        unsigned int idx = 0;
+       struct orig_region_map *region;
        struct orig_region_map tmp[VHOST_MEMORY_MAX_NREGIONS] =
                { [0 ... VHOST_MEMORY_MAX_NREGIONS - 1] = { 0 } };
-       struct orig_region_map *region;
        uint64_t alignment;
-       int ret;

        /* unmap old memory regions one by one*/
        dev = get_device(ctx);
-       if (dev->mem) {
-               region = orig_region(dev->mem, dev->mem->nregions);
-               for (idx = 0; idx < dev->mem->nregions; idx++) {
-                       if (region[idx].mapped_address) {
-                               alignment = region[idx].blksz;
-                               printf("Freeing %p\n",
-                                       (void 
*)(uintptr_t)region[idx].mapped_address);
-                               ret = munmap((void 
*)RTE_ALIGN_FLOOR(region[idx].mapped_address, alignment),
-                                       RTE_ALIGN_CEIL(region[idx].mapped_size, 
alignment));
-                               printf("munmap ret= %d\n", ret);
-                               printf("close file %d\n", region[idx].fd);
-                               close(region[idx].fd);
-                       }
-               }
+       if (dev && dev->mem) {
+               free_mem_region(dev);
                free(dev->mem);
                dev->mem = NULL;
        }
@@ -248,7 +260,6 @@ user_set_vring_kick(struct vhost_device_ctx ctx, struct 
VhostUserMsg *pmsg)
        if (virtio_is_ready(dev) &&
                !(dev->flags & VIRTIO_DEV_RUNNING))
                        notify_ops->new_device(dev);
-
 }

 /*
@@ -284,5 +295,19 @@ user_get_vring_base(struct vhost_device_ctx ctx,
        }

        return 0;
+}
+
+void
+user_destroy_device(struct vhost_device_ctx ctx)
+{
+       struct virtio_net *dev = get_device(ctx);
+
+       if (dev && (dev->flags & VIRTIO_DEV_RUNNING))
+               notify_ops->destroy_device(dev);

+       if (dev && dev->mem) {
+               free_mem_region(dev);
+               free(dev->mem);
+               dev->mem = NULL;
+       }
 }
diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.h 
b/lib/librte_vhost/vhost_user/virtio-net-user.h
index 0f6a75a..df24860 100644
--- a/lib/librte_vhost/vhost_user/virtio-net-user.h
+++ b/lib/librte_vhost/vhost_user/virtio-net-user.h
@@ -45,4 +45,5 @@ void user_set_vring_kick(struct vhost_device_ctx, struct 
VhostUserMsg *);

 int user_get_vring_base(struct vhost_device_ctx, struct vhost_vring_state *);

+void user_destroy_device(struct vhost_device_ctx);
 #endif
-- 
1.8.1.4

Reply via email to