Skip to content
  • Akihiko Odaki's avatar
    2aea137a
    linux-user: Do not align brk with host page size · 2aea137a
    Akihiko Odaki authored
    do_brk() minimizes calls into target_mmap() by aligning the address
    with host page size, which is potentially larger than the target page
    size. However, the current implementation of this optimization has two
    bugs:
    
    - The start of brk is rounded up with the host page size while brk
      advertises an address aligned with the target page size as the
      beginning of brk. This makes the beginning of brk unmapped.
    - Content clearing after mapping is flawed. The size to clear is
      specified as HOST_PAGE_ALIGN(brk_page) - brk_page, but brk_page is
      aligned with the host page size so it is always zero.
    
    This optimization actually has no practical benefit. It makes difference
    when brk() is called multiple times with values in a range of the host
    page size. However, sophisticated memory allocators try to avoid to
    make such frequent brk() calls. For example, glibc 2.37 calls brk() to
    shrink the heap only when there is a room more than 128 KiB. It is
    rare to have a page size larger than 128 KiB if it happens.
    
    Let's remove the optimization to fix the bugs and make the code simpler.
    
    Fixes: 86f04735 ("linux-user: Fix brk() to release pages")
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1616
    
    
    Signed-off-by: default avatarAkihiko Odaki <akihiko.odaki@daynix.com>
    Message-Id: <20230802071754.14876-7-akihiko.odaki@daynix.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    2aea137a
    linux-user: Do not align brk with host page size
    Akihiko Odaki authored
    do_brk() minimizes calls into target_mmap() by aligning the address
    with host page size, which is potentially larger than the target page
    size. However, the current implementation of this optimization has two
    bugs:
    
    - The start of brk is rounded up with the host page size while brk
      advertises an address aligned with the target page size as the
      beginning of brk. This makes the beginning of brk unmapped.
    - Content clearing after mapping is flawed. The size to clear is
      specified as HOST_PAGE_ALIGN(brk_page) - brk_page, but brk_page is
      aligned with the host page size so it is always zero.
    
    This optimization actually has no practical benefit. It makes difference
    when brk() is called multiple times with values in a range of the host
    page size. However, sophisticated memory allocators try to avoid to
    make such frequent brk() calls. For example, glibc 2.37 calls brk() to
    shrink the heap only when there is a room more than 128 KiB. It is
    rare to have a page size larger than 128 KiB if it happens.
    
    Let's remove the optimization to fix the bugs and make the code simpler.
    
    Fixes: 86f04735 ("linux-user: Fix brk() to release pages")
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1616
    
    
    Signed-off-by: default avatarAkihiko Odaki <akihiko.odaki@daynix.com>
    Message-Id: <20230802071754.14876-7-akihiko.odaki@daynix.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Loading