Fixes memory leak on QEMU migration.

Fixes: 54f9e32305d4 ("vhost: handle dirty pages logging request")
Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
---
 lib/librte_vhost/rte_virtio_net.h             |  3 ++-
 lib/librte_vhost/vhost_user/virtio-net-user.c | 15 +++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/lib/librte_vhost/rte_virtio_net.h 
b/lib/librte_vhost/rte_virtio_net.h
index 600b20b..5ae5d58 100644
--- a/lib/librte_vhost/rte_virtio_net.h
+++ b/lib/librte_vhost/rte_virtio_net.h
@@ -143,7 +143,8 @@ struct virtio_net {
        uint64_t                log_base;       /**< Where dirty pages are 
logged */
        struct ether_addr       mac;            /**< MAC address */
        rte_atomic16_t          broadcast_rarp; /**< A flag to tell if we need 
broadcast rarp packet */
-       uint64_t                reserved[61];   /**< Reserve some spaces for 
future extension. */
+       uint64_t                log_addr;       /**< Where log mapped. */
+       uint64_t                reserved[60];   /**< Reserve some spaces for 
future extension. */
        struct vhost_virtqueue  *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2];  /**< 
Contains all virtqueue information. */
 } __rte_cache_aligned;

diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.c 
b/lib/librte_vhost/vhost_user/virtio-net-user.c
index a4e20b5..e765ce7 100644
--- a/lib/librte_vhost/vhost_user/virtio-net-user.c
+++ b/lib/librte_vhost/vhost_user/virtio-net-user.c
@@ -96,6 +96,10 @@ vhost_backend_cleanup(struct virtio_net *dev)
                free(dev->mem);
                dev->mem = NULL;
        }
+       if (dev->log_addr) {
+               munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
+               dev->log_addr = 0;
+       }
 }

 int
@@ -403,8 +407,15 @@ user_set_log_base(struct vhost_device_ctx ctx,
                return -1;
        }

-       /* TODO: unmap on stop */
-       dev->log_base = (uint64_t)(uintptr_t)addr + off;
+       /*
+        * Free previously mapped log memory on occasionally
+        * multiple VHOST_USER_SET_LOG_BASE.
+        */
+       if (dev->log_addr) {
+               munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
+       }
+       dev->log_addr = (uint64_t)(uintptr_t)addr;
+       dev->log_base = dev->log_addr + off;
        dev->log_size = size;

        return 0;
-- 
2.7.4

Reply via email to