[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v2 19/41] virtio-mem: Allow notifiers for size changes
From: |
Michael S. Tsirkin |
Subject: |
[PULL v2 19/41] virtio-mem: Allow notifiers for size changes |
Date: |
Sat, 4 Jul 2020 14:30:13 -0400 |
From: David Hildenbrand <david@redhat.com>
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>
Message-Id: <20200626072248.78761-17-david@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
include/hw/virtio/virtio-mem.h | 5 +++++
hw/virtio/virtio-mem.c | 21 ++++++++++++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/hw/virtio/virtio-mem.h b/include/hw/virtio/virtio-mem.h
index 6981096f7c..b74c77cd42 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 */
uint64_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
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index 2d6f3061a6..6b5551515d 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)
{
@@ -668,6 +684,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);
@@ -705,6 +722,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 = {
--
MST
- [PULL v2 08/41] s390x/pv: Convert to ram_block_discard_disable(), (continued)
- [PULL v2 08/41] s390x/pv: Convert to ram_block_discard_disable(), Michael S. Tsirkin, 2020/07/04
- [PULL v2 09/41] virtio-balloon: Rip out qemu_balloon_inhibit(), Michael S. Tsirkin, 2020/07/04
- [PULL v2 11/41] migration/rdma: Use ram_block_discard_disable(), Michael S. Tsirkin, 2020/07/04
- [PULL v2 12/41] migration/colo: Use ram_block_discard_disable(), Michael S. Tsirkin, 2020/07/04
- [PULL v2 13/41] virtio-mem: Paravirtualized memory hot(un)plug, Michael S. Tsirkin, 2020/07/04
- [PULL v2 14/41] virtio-pci: Proxy for virtio-mem, Michael S. Tsirkin, 2020/07/04
- [PULL v2 15/41] MAINTAINERS: Add myself as virtio-mem maintainer, Michael S. Tsirkin, 2020/07/04
- [PULL v2 16/41] hmp: Handle virtio-mem when printing memory device info, Michael S. Tsirkin, 2020/07/04
- [PULL v2 17/41] numa: Handle virtio-mem in NUMA stats, Michael S. Tsirkin, 2020/07/04
- [PULL v2 18/41] pc: Support for virtio-mem-pci, Michael S. Tsirkin, 2020/07/04
- [PULL v2 19/41] virtio-mem: Allow notifiers for size changes,
Michael S. Tsirkin <=
- [PULL v2 20/41] virtio-pci: Send qapi events when the virtio-mem size changes, Michael S. Tsirkin, 2020/07/04
- [PULL v2 22/41] virtio-mem: Add trace events, Michael S. Tsirkin, 2020/07/04
- [PULL v2 23/41] virtio-mem: Exclude unplugged memory during migration, Michael S. Tsirkin, 2020/07/04
- [PULL v2 24/41] numa: Auto-enable NUMA when any memory devices are possible, Michael S. Tsirkin, 2020/07/04
- [PULL v2 25/41] tests/acpi: remove stale allowed tables, Michael S. Tsirkin, 2020/07/04
- [PULL v2 27/41] MAINTAINERS: add VT-d entry, Michael S. Tsirkin, 2020/07/04
- [PULL v2 26/41] docs: vhost-user: add Virtio status protocol feature, Michael S. Tsirkin, 2020/07/04
- [PULL v2 28/41] net: introduce qemu_get_peer, Michael S. Tsirkin, 2020/07/04
- [PULL v2 29/41] vhost_net: use the function qemu_get_peer, Michael S. Tsirkin, 2020/07/04
- [PULL v2 30/41] virtio-bus: introduce queue_enabled method, Michael S. Tsirkin, 2020/07/04