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:
parent
0b72d2965d
commit
19e008e7f7
@ -184,7 +184,9 @@ morecore(int bucket)
|
|||||||
nblks = 1;
|
nblks = 1;
|
||||||
}
|
}
|
||||||
if (amt > pagepool_end - pagepool_start)
|
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;
|
return;
|
||||||
op = (union overhead *)pagepool_start;
|
op = (union overhead *)pagepool_start;
|
||||||
pagepool_start += amt;
|
pagepool_start += amt;
|
||||||
@ -269,6 +271,8 @@ morepages(int n)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pagepool_start == MAP_FAILED)
|
||||||
|
pagepool_start = 0;
|
||||||
offset = (uintptr_t)pagepool_start - rounddown2(
|
offset = (uintptr_t)pagepool_start - rounddown2(
|
||||||
(uintptr_t)pagepool_start, pagesz);
|
(uintptr_t)pagepool_start, pagesz);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user