NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-arm/55533: nodejs fails with "out of memory" on aarch64 (with reproducer)



The following reply was made to PR port-arm/55533; it has been noted by GNATS.

From: Michael van Elst <mlelstv%serpens.de@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: port-arm/55533: nodejs fails with "out of memory" on aarch64
 (with reproducer)
Date: Sat, 8 Aug 2020 14:08:20 +0200

 The mmap failure is pretty forward.
 
 The memory map is a list of adjacent memory regions, each with a part
 that is allocated (start..end) followed by a part that is free
 (end..end+gap).
 
 mmap() searches the list until it finds a gap that is large enough and
 where the requested alignment can be fullfilled.
 
 When a zero hint is used, the search starts from the beginning of the
 list and everything is fine.
 
 But with a non-zero hint, the search starts with the region that
 includes the given address. This is technically wrong, since the
 beginning of the list is never searched. But if the hint is
 somewhere in the heap, the search will reach the end of the heap
 and find space there.
 
 This also works when we do top down allocation. The search goes
 backwards and the "end" of the heap is its lowest address.
 
 Things go wrong if you use a hint that is not in the heap, e.g.
 a stack address for bottom up allocation, or a program address
 for top down allocation.
 
 To be correct, the search would need to wrap around until it
 reaches the start position to really search the full list.
 
 
 
 In our code we use an additional red-black-tree to locate
 a region for a given address faster than the original
 linear search. The tree even maintains a "max gap" value
 for subtrees, so we could just walk the tree and prune
 subtrees when searching for free space.
 
 But we don't do that. We just search downwards, using
 a simple heuristic. This speeds up the search when
 we need go to the end of the heap, but otherwise may
 miss gaps that are large enough. In that case we fall
 back to the linear search.
 
 Instead of wrapping around the linear search, we could
 also do a complete tree walk. The linear search wouldn't
 be necessary then.
 
 
 Greetings,
 -- 
                                 Michael van Elst
 Internet: mlelstv%serpens.de@localhost
                                 "A potential Snark may lurk in every tree."
 


Home | Main Index | Thread Index | Old Index