• Austin Clements's avatar
    runtime: remove non-reserved heap logic · 51ae88ee
    Austin Clements authored
    Currently large sysReserve calls on some OSes don't actually reserve
    the memory, but just check that it can be reserved. This was important
    when we called sysReserve to "reserve" many gigabytes for the heap up
    front, but now that we map memory in small increments as we need it,
    this complication is no longer necessary.
    
    This has one curious side benefit: currently, on Linux, allocations
    that are large enough to be rejected by mmap wind up freezing the
    application for a long time before it panics. This happens because
    sysReserve doesn't reserve the memory, so sysMap calls mmap_fixed,
    which calls mmap, which fails because the mapping is too large.
    However, mmap_fixed doesn't inspect *why* mmap fails, so it falls back
    to probing every page in the desired region individually with mincore
    before performing an (otherwise dangerous) MAP_FIXED mapping, which
    will also fail. This takes a long time for a large region. Now this
    logic is gone, so the mmap failure leads to an immediate panic.
    
    Updates #10460.
    
    Change-Id: I8efe88c611871cdb14f99fadd09db83e0161ca2e
    Reviewed-on: https://go-review.googlesource.com/85888
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    51ae88ee
mem_linux.go 5.17 KB