* define supporting function free_mem_region * changes to other support functions
Signed-off-By: Pravin M Bathija <[email protected]> --- lib/vhost/vhost_user.c | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index ac9d24d067..029dc70292 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -228,7 +228,17 @@ async_dma_map(struct virtio_net *dev, bool do_map) } static void -free_mem_region(struct virtio_net *dev) +free_mem_region(struct rte_vhost_mem_region *reg) +{ + if (reg != NULL && reg->host_user_addr) { + munmap(reg->mmap_addr, reg->mmap_size); + close(reg->fd); + memset(reg, 0, sizeof(struct rte_vhost_mem_region)); + } +} + +static void +free_all_mem_regions(struct virtio_net *dev) { uint32_t i; struct rte_vhost_mem_region *reg; @@ -239,12 +249,10 @@ free_mem_region(struct virtio_net *dev) if (dev->async_copy && rte_vfio_is_enabled("vfio")) async_dma_map(dev, false); - for (i = 0; i < dev->mem->nregions; i++) { + for (i = 0; i < VHOST_MEMORY_MAX_NREGIONS; i++) { reg = &dev->mem->regions[i]; - if (reg->host_user_addr) { - munmap(reg->mmap_addr, reg->mmap_size); - close(reg->fd); - } + if (reg->mmap_addr) + free_mem_region(reg); } } @@ -258,7 +266,7 @@ vhost_backend_cleanup(struct virtio_net *dev) vdpa_dev->ops->dev_cleanup(dev->vid); if (dev->mem) { - free_mem_region(dev); + free_all_mem_regions(dev); rte_free(dev->mem); dev->mem = NULL; } @@ -707,7 +715,7 @@ numa_realloc(struct virtio_net **pdev, struct vhost_virtqueue **pvq) vhost_devices[dev->vid] = dev; mem_size = sizeof(struct rte_vhost_memory) + - sizeof(struct rte_vhost_mem_region) * dev->mem->nregions; + sizeof(struct rte_vhost_mem_region) * VHOST_MEMORY_MAX_NREGIONS; mem = rte_realloc_socket(dev->mem, mem_size, 0, node); if (!mem) { VHOST_CONFIG_LOG(dev->ifname, ERR, @@ -811,8 +819,10 @@ hua_to_alignment(struct rte_vhost_memory *mem, void *ptr) uint32_t i; uintptr_t hua = (uintptr_t)ptr; - for (i = 0; i < mem->nregions; i++) { + for (i = 0; i < VHOST_MEMORY_MAX_NREGIONS; i++) { r = &mem->regions[i]; + if (r->host_user_addr == 0) + continue; if (hua >= r->host_user_addr && hua < r->host_user_addr + r->size) { return get_blk_size(r->fd); @@ -1250,9 +1260,13 @@ vhost_user_postcopy_register(struct virtio_net *dev, int main_fd, * retrieve the region offset when handling userfaults. */ memory = &ctx->msg.payload.memory; - for (i = 0; i < memory->nregions; i++) { + for (i = 0; i < VHOST_MEMORY_MAX_NREGIONS; i++) { + int reg_msg_index = 0; reg = &dev->mem->regions[i]; - memory->regions[i].userspace_addr = reg->host_user_addr; + if (reg->host_user_addr == 0) + continue; + memory->regions[reg_msg_index].userspace_addr = reg->host_user_addr; + reg_msg_index++; } /* Send the addresses back to qemu */ @@ -1279,8 +1293,10 @@ vhost_user_postcopy_register(struct virtio_net *dev, int main_fd, } /* Now userfault register and we can use the memory */ - for (i = 0; i < memory->nregions; i++) { + for (i = 0; i < VHOST_MEMORY_MAX_NREGIONS; i++) { reg = &dev->mem->regions[i]; + if (reg->host_user_addr == 0) + continue; if (vhost_user_postcopy_region_register(dev, reg) < 0) return -1; } -- 2.43.0

