crt_malloc: Be more persistent when handling mmap() failure

In the situation with limited address space, together with
fragmentation, it is possible for mmap() request in morecore() to fail
when asking for required size + NPOOLPAGES, but succeed without the
addend.  Retry allocation there.

PR:	259076
Reported by:	Denis Koreshkov <dynamic-wind@mail.ru>
Reviewed by:	arichardson
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D32474
This commit is contained in:
Konstantin Belousov 2021-10-11 19:13:31 +03:00
parent 0b72d2965d
commit 19e008e7f7

View File

@ -184,7 +184,9 @@ morecore(int bucket)
nblks = 1;
}
if (amt > pagepool_end - pagepool_start)
if (morepages(amt/pagesz + NPOOLPAGES) == 0)
if (morepages(amt / pagesz + NPOOLPAGES) == 0 &&
/* Retry with min required size */
morepages(amt / pagesz) == 0)
return;
op = (union overhead *)pagepool_start;
pagepool_start += amt;
@ -269,6 +271,8 @@ morepages(int n)
}
}
if (pagepool_start == MAP_FAILED)
pagepool_start = 0;
offset = (uintptr_t)pagepool_start - rounddown2(
(uintptr_t)pagepool_start, pagesz);