Patchwork s390x: change mapping base to allow guests > 2GB

login
register
mail settings
Submitter Christian Borntraeger
Date May 10, 2011, 12:49 p.m.
Message ID <4DC93446.3000807@de.ibm.com>
Download mbox | patch
Permalink /patch/94981/
State New
Headers show

Comments

Christian Borntraeger - May 10, 2011, 12:49 p.m.
Alex,

the current s390x qemu memory layout is

0x1000000: guest start
0x80000000: qemu binary

which limits the amount of available memory to <2GB.
This patch moves the guest pages to 32GB to not collide with the binary
and to leave some space for the program break of qemu. 

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>


    Make sure that big guests (e.g. 4 GB do not collide with the binary)
Alexander Graf - May 11, 2011, 10:37 p.m.
On 10.05.2011, at 14:49, Christian Borntraeger wrote:

> Alex,
> 
> the current s390x qemu memory layout is
> 
> 0x1000000: guest start
> 0x80000000: qemu binary
> 
> which limits the amount of available memory to <2GB.
> This patch moves the guest pages to 32GB to not collide with the binary
> and to leave some space for the program break of qemu. 
> 
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>

Thanks, applied to the s390-next tree. Also, please dont't address me directly in the patch description, as that one's supposed to go to the public :).


Alex

Patch

--- qemu-kvm.orig/exec.c	2011-05-04 09:25:22.411957322 +0200
+++ qemu-kvm/exec.c	2011-05-10 14:45:28.158409982 +0200
@@ -2900,10 +2900,14 @@ 
 #endif
         } else {
 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
-            /* XXX S390 KVM requires the topmost vma of the RAM to be < 256GB */
-            new_block->host = mmap((void*)0x1000000, size,
+            /* 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, -1, 0);
+                                   MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
 #else
             new_block->host = qemu_vmalloc(size);
 #endif