• Konrad Rzeszutek Wilk's avatar
    xen/p2m: Reserve 8MB of _brk space for P2M leafs when populating back. · 5bc6f988
    Konrad Rzeszutek Wilk authored
    When we release pages back during bootup:
    
    Freeing  9d-100 pfn range: 99 pages freed
    Freeing  9cf36-9d0d2 pfn range: 412 pages freed
    Freeing  9f6bd-9f6bf pfn range: 2 pages freed
    Freeing  9f714-9f7bf pfn range: 171 pages freed
    Freeing  9f7e0-9f7ff pfn range: 31 pages freed
    Freeing  9f800-100000 pfn range: 395264 pages freed
    Released 395979 pages of unused memory
    
    We then try to populate those pages back. In the P2M tree however
    the space for those leafs must be reserved - as such we use extend_brk.
    We reserve 8MB of _brk space, which means we can fit over
    1048576 PFNs - which is more than we should ever need.
    
    Without this, on certain compilation of the kernel we would hit:
    
    (XEN) domain_crash_sync called from entry.S
    (XEN) CPU:    0
    (XEN) RIP:    e033:[<ffffffff818aad3b>]
    (XEN) RFLAGS: 0000000000000206   EM: 1   CONTEXT: pv guest
    (XEN) rax: ffffffff81a7c000   rbx: 000000000000003d   rcx: 0000000000001000
    (XEN) rdx: ffffffff81a7b000   rsi: 0000000000001000   rdi: 0000000000001000
    (XEN) rbp: ffffffff81801cd8   rsp: ffffffff81801c98   r8:  0000000000100000
    (XEN) r9:  ffffffff81a7a000   r10: 0000000000000001   r11: 0000000000000003
    (XEN) r12: 0000000000000004   r13: 0000000000000004   r14: 000000000000003d
    (XEN) r15: 00000000000001e8   cr0: 000000008005003b   cr4: 00000000000006f0
    (XEN) cr3: 0000000125803000   cr2: 0000000000000000
    (XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: e02b   cs: e033
    (XEN) Guest stack trace from rsp=ffffffff81801c98:
    
    .. which is extend_brk hitting a BUG_ON.
    
    Interestingly enough, most of the time we are not going to hit this
    b/c the _brk space is quite large (v3.5):
     ffffffff81a25000 B __brk_base
     ffffffff81e43000 B __brk_limit
    = ~4MB.
    
    vs earlier kernels (with this back-ported), the space is smaller:
     ffffffff81a25000 B __brk_base
     ffffffff81a7b000 B __brk_limit
    = 344 kBytes.
    
    where we would certainly hit this and hit extend_brk.
    
    Note that git commit c3d93f88
    (xen: populate correct number of pages when across mem boundary (v2))
    exposed this bug).
    
    [v1: Made it 8MB of _brk space instead of 4MB per Jan's suggestion]
    
    CC: stable@vger.kernel.org #only for 3.5
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    5bc6f988
p2m.c 30.5 KB