• Stephen Warren's avatar
    malloc: improve memalign fragmentation fix · 034eda86
    Stephen Warren authored
    Commit 4f144a41 "malloc: work around some memalign fragmentation
    issues" enhanced memalign() so that it can succeed in more cases where
    heap fragmentation is present. However, it did not solve as many cases
    as it could. This patch enhances the code to cover more cases.
    The alignment code works by allocating more space than the user requests,
    then adjusting the returned pointer to achieve alignment. In general, one
    must allocate "alignment" bytes more than the user requested in order to
    guarantee that alignment is possible. This is what the original code does.
    The previous enhancement attempted a second allocation if the padded
    allocation failed, and succeeded if that allocation just happened to be
    aligned; a fluke that happened often in practice. There are still cases
    where this could fail, yet where it is still possible to honor the user's
    allocation request. In particular, if the heap contains a free region that
    is large enough for the user's request, and for leading padding to ensure
    alignment, but has no or little space for any trailing padding. In this
    case, we can make a third(!) allocation attempt after calculating exactly
    the size of the leading padding required to achieve alignment, which is
    the minimal over-allocation needed for the overall memalign() operation to
    succeed if the third and second allocations end up at the same location.
    This patch isn't checkpatch-clean, since it conforms to the existing
    coding style in dlmalloc.c, which is different to the rest of U-Boot.
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Reviewed-by: default avatarTom Rini <trini@konsulko.com>
dlmalloc.c 71 KB