summaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
authorHaozhong Zhang <haozhong.zhang@intel.com>2016-10-24 20:49:37 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2016-10-24 15:46:11 +0200
commit8360668e6988736bf621d8f3a3bae5d9f1a30bc5 (patch)
tree90cb50db0f37e1f5c24c4d4cdc56eb8d060ef010 /exec.c
parent82878dac6fcd16cb4fa47266bcd3dd03df436dae (diff)
downloadqemu-8360668e6988736bf621d8f3a3bae5d9f1a30bc5.tar.gz
exec.c: workaround regression caused by alignment change in d2f39ad
Commit d2f39ad "exec.c: Ensure right alignment also for file backed ram" added an additional alignment requirement on the size of backend file besides the previous page size. On x86, the alignment is changed from 4KB in QEMU 2.6 to 2MB in QEMU 2.7. This change breaks certain usages in QEMU 2.7 on x86, e.g. -object memory-backend-file,id=mem1,mem-path=/tmp/,size=$SZ -device pc-dimm,id=dimm1,memdev=mem1 where $SZ is multiple of 4KB but not 2MB (e.g. 1023M). QEMU 2.7 reports the following error message and aborts: qemu-system-x86_64: -device pc-dimm,memdev=mem1,id=nv1: backend memory size must be multiple of 0x200000 The same regression may also happen in other platforms as indicated by Igor Mammedov. This change is however necessary for s390 according to the commit message of d2f39ad, so we workaround the regression by taking the change only on s390. Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com> Reported-by: "Xu, Anthony" <anthony.xu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/exec.c b/exec.c
index e63c5a1bd4..6d7f600c0c 100644
--- a/exec.c
+++ b/exec.c
@@ -1254,7 +1254,12 @@ static void *file_ram_alloc(RAMBlock *block,
}
block->page_size = qemu_fd_getpagesize(fd);
- block->mr->align = MAX(block->page_size, QEMU_VMALLOC_ALIGN);
+ block->mr->align = block->page_size;
+#if defined(__s390x__)
+ if (kvm_enabled()) {
+ block->mr->align = MAX(block->mr->align, QEMU_VMALLOC_ALIGN);
+ }
+#endif
if (memory < block->page_size) {
error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be equal to "