mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
s390: autodetect map private
By default qemu will use MAP_PRIVATE for guest pages. This will write protect pages and thus break on s390 systems that dont support this feature. Therefore qemu has a hack to always use MAP_SHARED for s390. But MAP_SHARED has other problems (no dirty pages tracking, a lot more swap overhead etc.) Newer systems allow the distinction via KVM_CAP_S390_COW. With this feature qemu can use the standard qemu alloc if available, otherwise it will use the old s390 hack. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Acked-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
9233685597
commit
fdec991857
5 changed files with 56 additions and 15 deletions
18
exec.c
18
exec.c
|
@ -2536,26 +2536,14 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
|
|||
exit(1);
|
||||
#endif
|
||||
} else {
|
||||
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
|
||||
/* S390 KVM requires the topmost vma of the RAM to be smaller than
|
||||
an system defined value, which is at least 256GB. Larger systems
|
||||
have larger values. We put the guest between the end of data
|
||||
segment (system break) and this value. We use 32GB as a base to
|
||||
have enough room for the system break to grow. */
|
||||
new_block->host = mmap((void*)0x800000000, size,
|
||||
PROT_EXEC|PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
||||
if (new_block->host == MAP_FAILED) {
|
||||
fprintf(stderr, "Allocating RAM failed\n");
|
||||
abort();
|
||||
}
|
||||
#else
|
||||
if (xen_enabled()) {
|
||||
xen_ram_alloc(new_block->offset, size, mr);
|
||||
} else if (kvm_enabled()) {
|
||||
/* some s390/kvm configurations have special constraints */
|
||||
new_block->host = kvm_vmalloc(size);
|
||||
} else {
|
||||
new_block->host = qemu_vmalloc(size);
|
||||
}
|
||||
#endif
|
||||
qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue