We have to consider the device id, otherwise we'll lose some events for unrelated devices. If the device does not have a device id (very unlikely), the target of the notifications has to update the size of all devices manually either way.
This was noticed by starting a VM with two virtio-mem devices that each have a requested size > 0. The Linux guest will initialize both devices in parallel, resulting in losing MEMORY_DEVICE_SIZE_CHANGE events for one of the devices. Fixes: 722a3c783ef4 ("virtio-pci: Send qapi events when the virtio-mem size changes") Cc: "Dr. David Alan Gilbert" <dgilb...@redhat.com> (maintainer:Human Monitor (HMP)) Cc: Markus Armbruster <arm...@redhat.com> (supporter:QMP) Cc: Michael S. Tsirkin <m...@redhat.com> Cc: Eric Blake <ebl...@redhat.com> Cc: Igor Mammedov <imamm...@redhat.com> Cc: Michal Privoznik <mpriv...@redhat.com> Signed-off-by: David Hildenbrand <da...@redhat.com> --- monitor/monitor.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/monitor/monitor.c b/monitor/monitor.c index 46a171bca6..05c0b32b67 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -474,6 +474,11 @@ static unsigned int qapi_event_throttle_hash(const void *key) hash += g_str_hash(qdict_get_str(evstate->data, "node-name")); } + if (evstate->event == QAPI_EVENT_MEMORY_DEVICE_SIZE_CHANGE && + qdict_get(evstate->data, "id")) { + hash += g_str_hash(qdict_get_str(evstate->data, "id")); + } + return hash; } @@ -496,6 +501,20 @@ static gboolean qapi_event_throttle_equal(const void *a, const void *b) qdict_get_str(evb->data, "node-name")); } + if (eva->event == QAPI_EVENT_MEMORY_DEVICE_SIZE_CHANGE) { + const bool id_a = qdict_get(eva->data, "id"); + const bool id_b = qdict_get(evb->data, "id"); + + if (!id_a && !id_b) { + return TRUE; + } else if (id_a ^ id_b) { + return FALSE; + } + + return !strcmp(qdict_get_str(eva->data, "id"), + qdict_get_str(evb->data, "id")); + } + return TRUE; } -- 2.31.1