[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 16/20] virtio-mem: Allow notifiers for size changes
From: |
David Hildenbrand |
Subject: |
[PATCH v3 16/20] virtio-mem: Allow notifiers for size changes |
Date: |
Wed, 3 Jun 2020 16:49:10 +0200 |
We want to send qapi events in case the size of a virtio-mem device
changes. This allows upper layers to always know how much memory is
actually currently consumed via a virtio-mem device.
Unfortuantely, we have to report the id of our proxy device. Let's provide
an easy way for our proxy device to register, so it can send the qapi
events. Piggy-backing on the notifier infrastructure (although we'll
only ever have one notifier registered) seems to be an easy way.
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
hw/virtio/virtio-mem.c | 21 ++++++++++++++++++++-
include/hw/virtio/virtio-mem.h | 5 +++++
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index 1fdad64696..455d957e17 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -184,6 +184,7 @@ static int virtio_mem_state_change_request(VirtIOMEM *vmem,
uint64_t gpa,
} else {
vmem->size -= size;
}
+ notifier_list_notify(&vmem->size_change_notifiers, &vmem->size);
return VIRTIO_MEM_RESP_ACK;
}
@@ -242,7 +243,10 @@ static int virtio_mem_unplug_all(VirtIOMEM *vmem)
return -EBUSY;
}
bitmap_clear(vmem->bitmap, 0, vmem->bitmap_size);
- vmem->size = 0;
+ if (vmem->size) {
+ vmem->size = 0;
+ notifier_list_notify(&vmem->size_change_notifiers, &vmem->size);
+ }
virtio_mem_resize_usable_region(vmem, vmem->requested_size, true);
return 0;
@@ -561,6 +565,18 @@ static MemoryRegion
*virtio_mem_get_memory_region(VirtIOMEM *vmem, Error **errp)
return &vmem->memdev->mr;
}
+static void virtio_mem_add_size_change_notifier(VirtIOMEM *vmem,
+ Notifier *notifier)
+{
+ notifier_list_add(&vmem->size_change_notifiers, notifier);
+}
+
+static void virtio_mem_remove_size_change_notifier(VirtIOMEM *vmem,
+ Notifier *notifier)
+{
+ notifier_remove(notifier);
+}
+
static void virtio_mem_get_size(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
@@ -672,6 +688,7 @@ static void virtio_mem_instance_init(Object *obj)
VirtIOMEM *vmem = VIRTIO_MEM(obj);
vmem->block_size = VIRTIO_MEM_MIN_BLOCK_SIZE;
+ notifier_list_init(&vmem->size_change_notifiers);
object_property_add(obj, VIRTIO_MEM_SIZE_PROP, "size", virtio_mem_get_size,
NULL, NULL, NULL);
@@ -709,6 +726,8 @@ static void virtio_mem_class_init(ObjectClass *klass, void
*data)
vmc->fill_device_info = virtio_mem_fill_device_info;
vmc->get_memory_region = virtio_mem_get_memory_region;
+ vmc->add_size_change_notifier = virtio_mem_add_size_change_notifier;
+ vmc->remove_size_change_notifier = virtio_mem_remove_size_change_notifier;
}
static const TypeInfo virtio_mem_info = {
diff --git a/include/hw/virtio/virtio-mem.h b/include/hw/virtio/virtio-mem.h
index 26b90e8f3e..408a6ede50 100644
--- a/include/hw/virtio/virtio-mem.h
+++ b/include/hw/virtio/virtio-mem.h
@@ -64,6 +64,9 @@ typedef struct VirtIOMEM {
/* block size and alignment */
uint32_t block_size;
+
+ /* notifiers to notify when "size" changes */
+ NotifierList size_change_notifiers;
} VirtIOMEM;
typedef struct VirtIOMEMClass {
@@ -73,6 +76,8 @@ typedef struct VirtIOMEMClass {
/* public */
void (*fill_device_info)(const VirtIOMEM *vmen, VirtioMEMDeviceInfo *vi);
MemoryRegion *(*get_memory_region)(VirtIOMEM *vmem, Error **errp);
+ void (*add_size_change_notifier)(VirtIOMEM *vmem, Notifier *notifier);
+ void (*remove_size_change_notifier)(VirtIOMEM *vmem, Notifier *notifier);
} VirtIOMEMClass;
#endif
--
2.25.4
- [PATCH v3 08/20] migration/colo: Use ram_block_discard_disable(), (continued)
- [PATCH v3 08/20] migration/colo: Use ram_block_discard_disable(), David Hildenbrand, 2020/06/03
- [PATCH v3 09/20] linux-headers: update to contain virtio-mem, David Hildenbrand, 2020/06/03
- [PATCH v3 10/20] virtio-mem: Paravirtualized memory hot(un)plug, David Hildenbrand, 2020/06/03
- [PATCH v3 11/20] virtio-pci: Proxy for virtio-mem, David Hildenbrand, 2020/06/03
- [PATCH v3 12/20] MAINTAINERS: Add myself as virtio-mem maintainer, David Hildenbrand, 2020/06/03
- [PATCH v3 13/20] hmp: Handle virtio-mem when printing memory device info, David Hildenbrand, 2020/06/03
- [PATCH v3 14/20] numa: Handle virtio-mem in NUMA stats, David Hildenbrand, 2020/06/03
- [PATCH v3 15/20] pc: Support for virtio-mem-pci, David Hildenbrand, 2020/06/03
- [PATCH v3 16/20] virtio-mem: Allow notifiers for size changes,
David Hildenbrand <=
- [PATCH v3 17/20] virtio-pci: Send qapi events when the virtio-mem size changes, David Hildenbrand, 2020/06/03
- [PATCH v3 18/20] virtio-mem: Migration sanity checks, David Hildenbrand, 2020/06/03
- [PATCH v3 19/20] virtio-mem: Add trace events, David Hildenbrand, 2020/06/03
- [PATCH v3 20/20] virtio-mem: Exclude unplugged memory during migration, David Hildenbrand, 2020/06/03
- Re: [PATCH v3 00/20] virtio-mem: Paravirtualized memory hot(un)plug, Eric Blake, 2020/06/03
- Re: [PATCH v3 00/20] virtio-mem: Paravirtualized memory hot(un)plug, Michael S. Tsirkin, 2020/06/09