Fix performance regression in arena_palloc().
Pass large allocation requests to arena_malloc() when possible. This
regression was introduced by 155bfa7da1
(Normalize size classes.).
This commit is contained in:
parent
5aa50a2834
commit
5154175cf1
15
src/arena.c
15
src/arena.c
@ -2175,9 +2175,20 @@ arena_palloc(tsd_t *tsd, arena_t *arena, size_t usize, size_t alignment,
|
|||||||
void *ret;
|
void *ret;
|
||||||
|
|
||||||
if (usize <= SMALL_MAXCLASS && (alignment < PAGE || (alignment == PAGE
|
if (usize <= SMALL_MAXCLASS && (alignment < PAGE || (alignment == PAGE
|
||||||
&& (usize & PAGE_MASK) == 0)))
|
&& (usize & PAGE_MASK) == 0))) {
|
||||||
|
/* Small; alignment doesn't require special run placement. */
|
||||||
ret = arena_malloc(tsd, arena, usize, zero, tcache);
|
ret = arena_malloc(tsd, arena, usize, zero, tcache);
|
||||||
else {
|
} else if (usize <= arena_maxclass && alignment <= PAGE) {
|
||||||
|
/*
|
||||||
|
* Large; alignment doesn't require special run placement.
|
||||||
|
* However, the cached pointer may be at a random offset from
|
||||||
|
* the base of the run, so do some bit manipulation to retrieve
|
||||||
|
* the base.
|
||||||
|
*/
|
||||||
|
ret = arena_malloc(tsd, arena, usize, zero, tcache);
|
||||||
|
if (config_cache_oblivious)
|
||||||
|
ret = (void *)((uintptr_t)ret & ~PAGE_MASK);
|
||||||
|
} else {
|
||||||
if (likely(usize <= arena_maxclass)) {
|
if (likely(usize <= arena_maxclass)) {
|
||||||
ret = arena_palloc_large(tsd, arena, usize, alignment,
|
ret = arena_palloc_large(tsd, arena, usize, alignment,
|
||||||
zero);
|
zero);
|
||||||
|
Loading…
Reference in New Issue
Block a user