Hi Michal,

On 31/5/24 09:29, Michal Privoznik 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);

Can we use size_to_str() instead?

Also display backend name:

"backend '%s' memory size must be multiple of %s"

+        return;
+    }
if (backend->merge &&
          qemu_madvise(ptr, sz, QEMU_MADV_MERGEABLE)) {


Reply via email to