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:
Jason Evans 2011-01-31 19:58:22 -08:00
parent f256680f87
commit 31bfb3e7b0

View File

@ -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);