Fix two prof-related bugs in rallocm().
Properly handle boundary conditions for sampled region promotion in rallocm(). Prior to this fix, some combinations of 'size' and 'extra' values could cause erroneous behavior. Additionally, size class recording for promoted regions was incorrect.
This commit is contained in:
parent
0cdd42eb32
commit
183ba50c19
@ -1657,6 +1657,7 @@ arena_prof_promoted(const void *ptr, size_t size)
|
|||||||
assert(ptr != NULL);
|
assert(ptr != NULL);
|
||||||
assert(CHUNK_ADDR2BASE(ptr) != ptr);
|
assert(CHUNK_ADDR2BASE(ptr) != ptr);
|
||||||
assert(isalloc(ptr) == PAGE_SIZE);
|
assert(isalloc(ptr) == PAGE_SIZE);
|
||||||
|
assert(size <= small_maxclass);
|
||||||
|
|
||||||
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
|
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
|
||||||
pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT;
|
pageind = ((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT;
|
||||||
|
@ -1670,15 +1670,22 @@ JEMALLOC_P(rallocm)(void **ptr, size_t *rsize, size_t size, size_t extra,
|
|||||||
old_ctx = prof_ctx_get(p);
|
old_ctx = prof_ctx_get(p);
|
||||||
if ((cnt = prof_alloc_prep(max_usize)) == NULL)
|
if ((cnt = prof_alloc_prep(max_usize)) == NULL)
|
||||||
goto OOM;
|
goto OOM;
|
||||||
if (prof_promote && (uintptr_t)cnt != (uintptr_t)1U && max_usize
|
/*
|
||||||
<= small_maxclass) {
|
* Use minimum usize to determine whether promotion may happen.
|
||||||
|
*/
|
||||||
|
if (prof_promote && (uintptr_t)cnt != (uintptr_t)1U
|
||||||
|
&& ((alignment == 0) ? s2u(size) : sa2u(size,
|
||||||
|
alignment, NULL)) <= small_maxclass) {
|
||||||
q = iralloc(p, small_maxclass+1, (small_maxclass+1 >=
|
q = iralloc(p, small_maxclass+1, (small_maxclass+1 >=
|
||||||
size+extra) ? 0 : size+extra - (small_maxclass+1),
|
size+extra) ? 0 : size+extra - (small_maxclass+1),
|
||||||
alignment, zero, no_move);
|
alignment, zero, no_move);
|
||||||
if (q == NULL)
|
if (q == NULL)
|
||||||
goto ERR;
|
goto ERR;
|
||||||
usize = isalloc(q);
|
usize = isalloc(q);
|
||||||
arena_prof_promoted(q, usize);
|
if (max_usize < PAGE_SIZE) {
|
||||||
|
usize = max_usize;
|
||||||
|
arena_prof_promoted(q, usize);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
q = iralloc(p, size, extra, alignment, zero, no_move);
|
q = iralloc(p, size, extra, alignment, zero, no_move);
|
||||||
if (q == NULL)
|
if (q == NULL)
|
||||||
|
Loading…
Reference in New Issue
Block a user