From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Compare the temporary region list with the current list to generate a change flag (replacing the old mem_changed_start_addr) and flip the temporary list into becoming the new current list.
Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- hw/virtio/trace-events | 1 + hw/virtio/vhost.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events index 7de0663652..3dd6be797c 100644 --- a/hw/virtio/trace-events +++ b/hw/virtio/trace-events @@ -1,6 +1,7 @@ # See docs/devel/tracing.txt for syntax documentation. # hw/virtio/vhost.c +vhost_commit(bool started, bool changed) "Started: %d Changed: %d" vhost_region_add_tmp(const char *name, uint64_t gpa, uint64_t size, uint64_t host) "%s: 0x%"PRIx64"+0x%"PRIx64" @ 0x%"PRIx64 vhost_region_add_tmp_abut(const char *name, uint64_t new_size) "%s: 0x%"PRIx64 vhost_section(const char *name, int r) "%s:%d" diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 2084888aa7..1b276b210f 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -642,15 +642,25 @@ static void vhost_commit(MemoryListener *listener) memory_listener); uint64_t log_size; int r; + bool changed = false; - g_free(dev->tmp_mem); - if (!dev->memory_changed) { - return; + if (dev->mem->nregions != dev->tmp_mem->nregions) { + changed = true; + } else { + /* Same size, lets check the contents */ + size_t region_size = dev->mem->nregions * sizeof dev->mem->regions[0]; + changed = memcmp(dev->mem->regions, dev->tmp_mem->regions, + region_size) != 0; } + g_free(dev->mem); + dev->mem = dev->tmp_mem; + dev->tmp_mem = NULL; + + trace_vhost_commit(dev->started, changed); if (!dev->started) { return; } - if (dev->mem_changed_start_addr > dev->mem_changed_end_addr) { + if (!changed) { return; } -- 2.14.3