|
@@ -822,6 +822,19 @@ static int ram_block_notify_add_single(RAMBlock *rb, void *opaque)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int ram_block_notify_remove_single(RAMBlock *rb, void *opaque)
|
|
|
+{
|
|
|
+ const ram_addr_t max_size = qemu_ram_get_max_length(rb);
|
|
|
+ const ram_addr_t size = qemu_ram_get_used_length(rb);
|
|
|
+ void *host = qemu_ram_get_host_addr(rb);
|
|
|
+ RAMBlockNotifier *notifier = opaque;
|
|
|
+
|
|
|
+ if (host) {
|
|
|
+ notifier->ram_block_removed(notifier, host, size, max_size);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
void ram_block_notifier_add(RAMBlockNotifier *n)
|
|
|
{
|
|
|
QLIST_INSERT_HEAD(&ram_list.ramblock_notifiers, n, next);
|
|
@@ -835,6 +848,10 @@ void ram_block_notifier_add(RAMBlockNotifier *n)
|
|
|
void ram_block_notifier_remove(RAMBlockNotifier *n)
|
|
|
{
|
|
|
QLIST_REMOVE(n, next);
|
|
|
+
|
|
|
+ if (n->ram_block_removed) {
|
|
|
+ qemu_ram_foreach_block(ram_block_notify_remove_single, n);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void ram_block_notify_add(void *host, size_t size, size_t max_size)
|