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

diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c 
b/lib/librte_vhost/vhost_user/vhost-net-user.c
index c84fd3b..71e5bbd 100644
--- a/lib/librte_vhost/vhost_user/vhost-net-user.c
+++ b/lib/librte_vhost/vhost_user/vhost-net-user.c
@@ -289,6 +289,7 @@ vserver_message_handler(int connfd, void *dat)

                close(connfd);
                fdset_del(&g_vhost_server->fdset, connfd);
+               user_destroy_device(ctx);
                ops->destroy_device(ctx);

                return;
@@ -298,6 +299,7 @@ vserver_message_handler(int connfd, void *dat)

                close(connfd);
                fdset_del(&g_vhost_server->fdset, connfd);
+               user_destroy_device(ctx);
                ops->destroy_device(ctx);

                return;
@@ -308,6 +310,8 @@ vserver_message_handler(int connfd, void *dat)

                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 3481eb8..8e6d580 100644
--- a/lib/librte_vhost/vhost_user/virtio-net-user.c
+++ b/lib/librte_vhost/vhost_user/virtio-net-user.c
@@ -68,6 +68,30 @@ 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;
+       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;
+                       munmap((void *)
+                               RTE_ALIGN_FLOOR(
+                                       region[idx].mapped_address, alignment),
+                               RTE_ALIGN_CEIL(
+                                       region[idx].mapped_size, alignment));
+                       close(region[idx].fd);
+               }
+       }
+}
+
 int
 user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg)
 {
@@ -80,24 +104,11 @@ user_set_mem_table(struct vhost_device_ctx ctx, struct 
VhostUserMsg *pmsg)
                [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;
        }
@@ -258,7 +269,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);
-
 }

 /*
@@ -294,5 +304,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