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


Reply via email to