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