This patch has been successfully tested by QE. After allocating some hugepages in the host, try to boot up a VM with the memory backed by a file and the size unaligned, check now the message displayed by QEMU: qemu-system-x86_64: backend memory size must be multiple of 0x200000
Tested-by: Mario Casquero <mcasq...@redhat.com> On Fri, May 31, 2024 at 9:29 AM Michal Privoznik <mpriv...@redhat.com> wrote: > > If memory-backend-{file,ram} has a size that's not aligned to > underlying page size it is not only wasteful, but also may lead > to hard to debug behaviour. For instance, in case > memory-backend-file and hugepages, madvise() and mbind() fail. > Rightfully so, page is the smallest unit they can work with. And > even though an error is reported, the root cause it not very > clear: > > qemu-system-x86_64: Couldn't set property 'dump' on 'memory-backend-file': > Invalid argument > > After this commit: > > qemu-system-x86_64: backend memory size must be multiple of 0x200000 > > Signed-off-by: Michal Privoznik <mpriv...@redhat.com> > --- > backends/hostmem.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/backends/hostmem.c b/backends/hostmem.c > index 012a8c190f..5f9c9ea8f5 100644 > --- a/backends/hostmem.c > +++ b/backends/hostmem.c > @@ -337,6 +337,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, > Error **errp) > HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc); > void *ptr; > uint64_t sz; > + size_t pagesize; > bool async = !phase_check(PHASE_LATE_BACKENDS_CREATED); > > if (!bc->alloc) { > @@ -348,6 +349,13 @@ host_memory_backend_memory_complete(UserCreatable *uc, > Error **errp) > > ptr = memory_region_get_ram_ptr(&backend->mr); > sz = memory_region_size(&backend->mr); > + pagesize = qemu_ram_pagesize(backend->mr.ram_block); > + > + if (!QEMU_IS_ALIGNED(sz, pagesize)) { > + error_setg(errp, "backend memory size must be multiple of 0x%" > + PRIx64, pagesize); > + return; > + } > > if (backend->merge && > qemu_madvise(ptr, sz, QEMU_MADV_MERGEABLE)) { > -- > 2.44.1 > >