Fix an alignment-related bug in huge_ralloc().
Fix huge_ralloc() to call huge_palloc() only if alignment requires it. This bug caused under-sized allocation for aligned huge reallocation (via rallocm()) if the requested alignment was less than the chunk size (4 MiB by default).
This commit is contained in:
parent
f256680f87
commit
31bfb3e7b0
@ -83,7 +83,7 @@ huge_palloc(size_t size, size_t alignment, bool zero)
|
|||||||
* alignment, in order to assure the alignment can be achieved, then
|
* alignment, in order to assure the alignment can be achieved, then
|
||||||
* unmap leading and trailing chunks.
|
* unmap leading and trailing chunks.
|
||||||
*/
|
*/
|
||||||
assert(alignment >= chunksize);
|
assert(alignment > chunksize);
|
||||||
|
|
||||||
chunk_size = CHUNK_CEILING(size);
|
chunk_size = CHUNK_CEILING(size);
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra,
|
|||||||
* different size class. In that case, fall back to allocating new
|
* different size class. In that case, fall back to allocating new
|
||||||
* space and copying.
|
* space and copying.
|
||||||
*/
|
*/
|
||||||
if (alignment != 0)
|
if (alignment > chunksize)
|
||||||
ret = huge_palloc(size + extra, alignment, zero);
|
ret = huge_palloc(size + extra, alignment, zero);
|
||||||
else
|
else
|
||||||
ret = huge_malloc(size + extra, zero);
|
ret = huge_malloc(size + extra, zero);
|
||||||
@ -201,7 +201,7 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra,
|
|||||||
if (extra == 0)
|
if (extra == 0)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
/* Try again, this time without extra. */
|
/* Try again, this time without extra. */
|
||||||
if (alignment != 0)
|
if (alignment > chunksize)
|
||||||
ret = huge_palloc(size, alignment, zero);
|
ret = huge_palloc(size, alignment, zero);
|
||||||
else
|
else
|
||||||
ret = huge_malloc(size, zero);
|
ret = huge_malloc(size, zero);
|
||||||
|
Loading…
Reference in New Issue
Block a user