We want to actually resize ram blocks (make everything between used_length and max_length inaccessible) - however, not all ram block notifiers will support that.
So introduce a way to detect if any registered notifier does not support it and add a way to notify all notifiers that support it. Using ram_block_notifiers_support_resize(), we can keep the existing handling for these special cases until they implement support (e.g., SEV, HAX) to resize. Cc: Richard Henderson <r...@twiddle.net> Cc: Paolo Bonzini <pbonz...@redhat.com> Cc: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Cc: Eduardo Habkost <ehabk...@redhat.com> Cc: Marcel Apfelbaum <marcel.apfelb...@gmail.com> Signed-off-by: David Hildenbrand <da...@redhat.com> --- hw/core/numa.c | 21 +++++++++++++++++++++ include/exec/ramlist.h | 4 ++++ util/trace-events | 1 + 3 files changed, 26 insertions(+) diff --git a/hw/core/numa.c b/hw/core/numa.c index fed4046680..5ccfcbcd41 100644 --- a/hw/core/numa.c +++ b/hw/core/numa.c @@ -940,3 +940,24 @@ void ram_block_notify_remove(void *host, size_t size) notifier->ram_block_removed(notifier, host, size); } } + +void ram_block_notify_resized(void *host, size_t oldsize, size_t newsize) +{ + RAMBlockNotifier *notifier; + + QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { + notifier->ram_block_resized(notifier, host, oldsize, newsize); + } +} + +bool ram_block_notifiers_support_resize(void) +{ + RAMBlockNotifier *notifier; + + QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { + if (!notifier->ram_block_resized) { + return false; + } + } + return true; +} diff --git a/include/exec/ramlist.h b/include/exec/ramlist.h index bc4faa1b00..33a380cbee 100644 --- a/include/exec/ramlist.h +++ b/include/exec/ramlist.h @@ -67,6 +67,8 @@ void qemu_mutex_unlock_ramlist(void); struct RAMBlockNotifier { void (*ram_block_added)(RAMBlockNotifier *n, void *host, size_t size); void (*ram_block_removed)(RAMBlockNotifier *n, void *host, size_t size); + void (*ram_block_resized)(RAMBlockNotifier *n, void *host, size_t oldsize, + size_t newsize); QLIST_ENTRY(RAMBlockNotifier) next; }; @@ -74,6 +76,8 @@ void ram_block_notifier_add(RAMBlockNotifier *n); void ram_block_notifier_remove(RAMBlockNotifier *n); void ram_block_notify_add(void *host, size_t size); void ram_block_notify_remove(void *host, size_t size); +void ram_block_notify_resized(void *host, size_t oldsize, size_t newsize); +bool ram_block_notifiers_support_resize(void); void ram_block_dump(Monitor *mon); diff --git a/util/trace-events b/util/trace-events index 83b6639018..226f406c46 100644 --- a/util/trace-events +++ b/util/trace-events @@ -76,6 +76,7 @@ qemu_mutex_unlock(void *mutex, const char *file, const int line) "released mutex qemu_vfio_dma_reset_temporary(void *s) "s %p" qemu_vfio_ram_block_added(void *s, void *p, size_t size) "s %p host %p size 0x%zx" qemu_vfio_ram_block_removed(void *s, void *p, size_t size) "s %p host %p size 0x%zx" +qemu_vfio_ram_block_resized(void *s, void *p, size_t oldsize, size_t newsizze) "s %p host %p oldsize 0x%zx newsize 0x%zx" qemu_vfio_find_mapping(void *s, void *p) "s %p host %p" qemu_vfio_new_mapping(void *s, void *host, size_t size, int index, uint64_t iova) "s %p host %p size %zu index %d iova 0x%"PRIx64 qemu_vfio_do_mapping(void *s, void *host, size_t size, uint64_t iova) "s %p host %p size %zu iova 0x%"PRIx64 -- 2.24.1