We already allow resizable ram blocks for anonymous memory, however, they are not actually resized. All memory is mmaped() R/W, including the memory exceeding the used_length, up to the max_length.
When resizing, effectively only the boundary is moved. Implement actually resizable anonymous allocations and make use of them in resizable ram blocks when possible. Memory exceeding the used_length will be inaccessible. Especially ram block notifiers require care. Having actually resizable anonymous allocations (via mmap-hackery) allows to reserve a big region in virtual address space and grow the accessible/usable part on demand. Even if "/proc/sys/vm/overcommit_memory" is set to "never" under Linux, huge reservations will succeed. If there is not enough memory when resizing (to populate parts of the reserved region), trying to resize will fail. Only the actually used size is reserved in the OS. E.g., virtio-mem [1] wants to reserve big resizable memory regions and grow the usable part on demand. I think this change is worth sending out individually. Accompanied by a bunch of minor fixes and cleanups. Especially, memory notifiers already handle resizing by first removing the old region, and then re-adding the resized region. prealloc is currently not possible with resizable ram blocks. mlock() should continue to work as is. Resizing is currently rare and must only happen on the start of an incoming migration, or during resets. No code path (except HAX and SEV ram block notifiers) should access memory outside of the usable range - and if we ever find one, that one has to be fixed (I did not identify any). v1 -> v2: - Add "util: vfio-helpers: Fix qemu_vfio_close()" - Add "util: vfio-helpers: Remove Error parameter from qemu_vfio_undo_mapping()" - Add "util: vfio-helpers: Factor out removal from qemu_vfio_undo_mapping()" - "util/mmap-alloc: ..." -- Minor changes due to review feedback (e.g., assert alignment, return bool when resizing) - "util: vfio-helpers: Implement ram_block_resized()" -- Reserve max_size in the IOVA address space. -- On resize, undo old mapping and do new mapping. We can later implement a new ioctl to resize the mapping directly. - "numa: Teach ram block notifiers about resizable ram blocks" -- Pass size/max_size to ram block notifiers, which makes things easier an cleaner - "exec: Ram blocks with resizable anonymous allocations under POSIX" -- Adapt to new ram block notifiers -- Shrink after notifying. Always trigger ram block notifiers on resizes -- Add a safety net that all ram block notifiers registered at runtime support resizes. [1] https://lore.kernel.org/kvm/20191212171137.13872-1-da...@redhat.com/ David Hildenbrand (16): util: vfio-helpers: Factor out and fix processing of existing ram blocks util: vfio-helpers: Fix qemu_vfio_close() util: vfio-helpers: Remove Error parameter from qemu_vfio_undo_mapping() util: vfio-helpers: Factor out removal from qemu_vfio_undo_mapping() exec: Factor out setting ram settings (madvise ...) into qemu_ram_apply_settings() exec: Reuse qemu_ram_apply_settings() in qemu_ram_remap() exec: Drop "shared" parameter from ram_block_add() util/mmap-alloc: Factor out calculation of pagesize to mmap_pagesize() util/mmap-alloc: Factor out reserving of a memory region to mmap_reserve() util/mmap-alloc: Factor out populating of memory to mmap_populate() util/mmap-alloc: Prepare for resizable mmaps util/mmap-alloc: Implement resizable mmaps numa: Teach ram block notifiers about resizable ram blocks util: vfio-helpers: Implement ram_block_resized() util: oslib: Resizable anonymous allocations under POSIX exec: Ram blocks with resizable anonymous allocations under POSIX exec.c | 104 +++++++++++++++++++---- hw/core/numa.c | 53 +++++++++++- hw/i386/xen/xen-mapcache.c | 7 +- include/exec/cpu-common.h | 3 + include/exec/memory.h | 8 ++ include/exec/ramlist.h | 14 +++- include/qemu/mmap-alloc.h | 21 +++-- include/qemu/osdep.h | 6 +- stubs/ram-block.c | 20 ----- target/i386/hax-mem.c | 5 +- target/i386/sev.c | 18 ++-- util/mmap-alloc.c | 165 +++++++++++++++++++++++-------------- util/oslib-posix.c | 37 ++++++++- util/oslib-win32.c | 14 ++++ util/trace-events | 9 +- util/vfio-helpers.c | 145 +++++++++++++++++++++----------- 16 files changed, 450 insertions(+), 179 deletions(-) -- 2.24.1