[PULL 06/17] numa: Teach ram block notifiers about resizeable ram blocks
From: David Hildenbrand Ram block notifiers are currently not aware of resizes. To properly handle resizes during migration, we want to teach ram block notifiers about resizeable ram. Introduce the basic infrastructure but keep using max_size in the existing notifiers. Supply the max_size when adding and removing ram blocks. Also, notify on resizes. Acked-by: Paul Durrant Reviewed-by: Peter Xu Cc: xen-de...@lists.xenproject.org Cc: haxm-t...@intel.com Cc: Paul Durrant Cc: Stefano Stabellini Cc: Anthony Perard Cc: Wenchao Wang Cc: Colin Xu Signed-off-by: David Hildenbrand Message-Id: <20210429112708.12291-3-da...@redhat.com> Signed-off-by: Dr. David Alan Gilbert --- hw/core/numa.c | 22 +- hw/i386/xen/xen-mapcache.c | 7 --- include/exec/ramlist.h | 13 + softmmu/physmem.c | 12 ++-- target/i386/hax/hax-mem.c | 5 +++-- target/i386/sev.c | 18 ++ util/vfio-helpers.c| 16 7 files changed, 61 insertions(+), 32 deletions(-) diff --git a/hw/core/numa.c b/hw/core/numa.c index 134ebc2b72..4c58b2348d 100644 --- a/hw/core/numa.c +++ b/hw/core/numa.c @@ -805,11 +805,12 @@ void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms) static int ram_block_notify_add_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_added(notifier, host, max_size); +notifier->ram_block_added(notifier, host, size, max_size); } return 0; } @@ -826,20 +827,31 @@ void ram_block_notifier_remove(RAMBlockNotifier *n) QLIST_REMOVE(n, next); } -void ram_block_notify_add(void *host, size_t size) +void ram_block_notify_add(void *host, size_t size, size_t max_size) { RAMBlockNotifier *notifier; QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { -notifier->ram_block_added(notifier, host, size); +notifier->ram_block_added(notifier, host, size, max_size); } } -void ram_block_notify_remove(void *host, size_t size) +void ram_block_notify_remove(void *host, size_t size, size_t max_size) { RAMBlockNotifier *notifier; QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { -notifier->ram_block_removed(notifier, host, size); +notifier->ram_block_removed(notifier, host, size, max_size); +} +} + +void ram_block_notify_resize(void *host, size_t old_size, size_t new_size) +{ +RAMBlockNotifier *notifier; + +QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { +if (notifier->ram_block_resized) { +notifier->ram_block_resized(notifier, host, old_size, new_size); +} } } diff --git a/hw/i386/xen/xen-mapcache.c b/hw/i386/xen/xen-mapcache.c index e82b7dcdd2..bd47c3d672 100644 --- a/hw/i386/xen/xen-mapcache.c +++ b/hw/i386/xen/xen-mapcache.c @@ -169,7 +169,8 @@ static void xen_remap_bucket(MapCacheEntry *entry, if (entry->vaddr_base != NULL) { if (!(entry->flags & XEN_MAPCACHE_ENTRY_DUMMY)) { -ram_block_notify_remove(entry->vaddr_base, entry->size); +ram_block_notify_remove(entry->vaddr_base, entry->size, +entry->size); } /* @@ -224,7 +225,7 @@ static void xen_remap_bucket(MapCacheEntry *entry, } if (!(entry->flags & XEN_MAPCACHE_ENTRY_DUMMY)) { -ram_block_notify_add(vaddr_base, size); +ram_block_notify_add(vaddr_base, size, size); } entry->vaddr_base = vaddr_base; @@ -465,7 +466,7 @@ static void xen_invalidate_map_cache_entry_unlocked(uint8_t *buffer) } pentry->next = entry->next; -ram_block_notify_remove(entry->vaddr_base, entry->size); +ram_block_notify_remove(entry->vaddr_base, entry->size, entry->size); if (munmap(entry->vaddr_base, entry->size) != 0) { perror("unmap fails"); exit(-1); diff --git a/include/exec/ramlist.h b/include/exec/ramlist.h index 26704aa3b0..ece6497ee2 100644 --- a/include/exec/ramlist.h +++ b/include/exec/ramlist.h @@ -65,15 +65,20 @@ void qemu_mutex_lock_ramlist(void); 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_added)(RAMBlockNotifier *n, void *host, size_t size, +size_t max_size); +void (*ram_block_removed)(RAMBlockNotifier *n, void *host, size_t size, + size_t max_size); +void (*ram_block_resized)(RAMBlockNotifier *n, void *host, size_t old_size, + size_t new_size); QLIST_ENTRY(RAMBlockNotifier) next; }; void ram_block_n
[PULL 06/17] numa: Teach ram block notifiers about resizeable ram blocks
From: David Hildenbrand Ram block notifiers are currently not aware of resizes. To properly handle resizes during migration, we want to teach ram block notifiers about resizeable ram. Introduce the basic infrastructure but keep using max_size in the existing notifiers. Supply the max_size when adding and removing ram blocks. Also, notify on resizes. Acked-by: Paul Durrant Reviewed-by: Peter Xu Cc: xen-de...@lists.xenproject.org Cc: haxm-t...@intel.com Cc: Paul Durrant Cc: Stefano Stabellini Cc: Anthony Perard Cc: Wenchao Wang Cc: Colin Xu Signed-off-by: David Hildenbrand Message-Id: <20210429112708.12291-3-da...@redhat.com> Signed-off-by: Dr. David Alan Gilbert --- hw/core/numa.c | 22 +- hw/i386/xen/xen-mapcache.c | 7 --- include/exec/ramlist.h | 13 + softmmu/physmem.c | 12 ++-- target/i386/hax/hax-mem.c | 5 +++-- target/i386/sev.c | 18 ++ util/vfio-helpers.c| 16 7 files changed, 61 insertions(+), 32 deletions(-) diff --git a/hw/core/numa.c b/hw/core/numa.c index 134ebc2b72..4c58b2348d 100644 --- a/hw/core/numa.c +++ b/hw/core/numa.c @@ -805,11 +805,12 @@ void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms) static int ram_block_notify_add_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_added(notifier, host, max_size); +notifier->ram_block_added(notifier, host, size, max_size); } return 0; } @@ -826,20 +827,31 @@ void ram_block_notifier_remove(RAMBlockNotifier *n) QLIST_REMOVE(n, next); } -void ram_block_notify_add(void *host, size_t size) +void ram_block_notify_add(void *host, size_t size, size_t max_size) { RAMBlockNotifier *notifier; QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { -notifier->ram_block_added(notifier, host, size); +notifier->ram_block_added(notifier, host, size, max_size); } } -void ram_block_notify_remove(void *host, size_t size) +void ram_block_notify_remove(void *host, size_t size, size_t max_size) { RAMBlockNotifier *notifier; QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { -notifier->ram_block_removed(notifier, host, size); +notifier->ram_block_removed(notifier, host, size, max_size); +} +} + +void ram_block_notify_resize(void *host, size_t old_size, size_t new_size) +{ +RAMBlockNotifier *notifier; + +QLIST_FOREACH(notifier, &ram_list.ramblock_notifiers, next) { +if (notifier->ram_block_resized) { +notifier->ram_block_resized(notifier, host, old_size, new_size); +} } } diff --git a/hw/i386/xen/xen-mapcache.c b/hw/i386/xen/xen-mapcache.c index 5b120ed44b..d6dcea65d1 100644 --- a/hw/i386/xen/xen-mapcache.c +++ b/hw/i386/xen/xen-mapcache.c @@ -169,7 +169,8 @@ static void xen_remap_bucket(MapCacheEntry *entry, if (entry->vaddr_base != NULL) { if (!(entry->flags & XEN_MAPCACHE_ENTRY_DUMMY)) { -ram_block_notify_remove(entry->vaddr_base, entry->size); +ram_block_notify_remove(entry->vaddr_base, entry->size, +entry->size); } if (munmap(entry->vaddr_base, entry->size) != 0) { perror("unmap fails"); @@ -211,7 +212,7 @@ static void xen_remap_bucket(MapCacheEntry *entry, } if (!(entry->flags & XEN_MAPCACHE_ENTRY_DUMMY)) { -ram_block_notify_add(vaddr_base, size); +ram_block_notify_add(vaddr_base, size, size); } entry->vaddr_base = vaddr_base; @@ -452,7 +453,7 @@ static void xen_invalidate_map_cache_entry_unlocked(uint8_t *buffer) } pentry->next = entry->next; -ram_block_notify_remove(entry->vaddr_base, entry->size); +ram_block_notify_remove(entry->vaddr_base, entry->size, entry->size); if (munmap(entry->vaddr_base, entry->size) != 0) { perror("unmap fails"); exit(-1); diff --git a/include/exec/ramlist.h b/include/exec/ramlist.h index 26704aa3b0..ece6497ee2 100644 --- a/include/exec/ramlist.h +++ b/include/exec/ramlist.h @@ -65,15 +65,20 @@ void qemu_mutex_lock_ramlist(void); 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_added)(RAMBlockNotifier *n, void *host, size_t size, +size_t max_size); +void (*ram_block_removed)(RAMBlockNotifier *n, void *host, size_t size, + size_t max_size); +void (*ram_block_resized)(RAMBlockNotifier *n, void *host, size_t old_size, +