From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Compare the temporary region data with the original, and if it's different update the original in the device state.
Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- hw/virtio/trace-events | 2 ++ hw/virtio/vhost.c | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events index 92fadec192..fac89aaba5 100644 --- a/hw/virtio/trace-events +++ b/hw/virtio/trace-events @@ -2,6 +2,8 @@ # hw/virtio/vhost.c vhost_section(const char *name, int r) "%s:%d" +vhost_update_mem(void) "" +vhost_update_mem_changed(void) "" vhost_update_mem_cb(const char *name, uint64_t gpa, uint64_t size, uint64_t host) "%s: 0x%"PRIx64"+0x%"PRIx64" @ 0x%"PRIx64 vhost_update_mem_cb_abut(const char *name, uint64_t new_size) "%s: 0x%"PRIx64 diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 646a3480c1..c00d82f96a 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -707,10 +707,12 @@ static int vhost_update_mem(struct vhost_dev *dev, bool *changed) { int res; struct vhost_update_mem_tmp vtmp; + size_t mem_size; vtmp.regions = 0; vtmp.nregions = 0; vtmp.dev = dev; + trace_vhost_update_mem(); *changed = false; res = address_space_iterate(&address_space_memory, vhost_update_mem_cb, &vtmp); @@ -718,8 +720,21 @@ static int vhost_update_mem(struct vhost_dev *dev, bool *changed) goto out; } - /* TODO */ - *changed = dev->mem_changed_start_addr < dev->mem_changed_end_addr; + mem_size = offsetof(struct vhost_memory, regions) + + (vtmp.nregions + 1) * sizeof dev->mem->regions[0]; + + if (vtmp.nregions != dev->mem->nregions || + memcmp(vtmp.regions, dev->mem->regions, mem_size)) { + *changed = true; + /* Update the main regions list from our tmp */ + dev->mem = g_realloc(dev->mem, mem_size); + dev->mem->nregions = vtmp.nregions; + memcpy(dev->mem->regions, vtmp.regions, + vtmp.nregions * sizeof dev->mem->regions[0]); + used_memslots = vtmp.nregions; + trace_vhost_update_mem_changed(); + } + out: g_free(vtmp.regions); return res; -- 2.14.3