Commit c5856b0a authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-21351: Allocate aligned memory

recv_sys_t::ALIGNMENT: The recv_sys_t::alloc() alignment
parent 6eed99f1
...@@ -365,6 +365,9 @@ struct recv_sys_t{ ...@@ -365,6 +365,9 @@ struct recv_sys_t{
return true; return true;
} }
/** The alloc() memory alignment, in bytes */
static constexpr size_t ALIGNMENT= sizeof(size_t);
/** Get the memory block for storing recv_t and redo log data /** Get the memory block for storing recv_t and redo log data
@param[in] len length of the data to be stored @param[in] len length of the data to be stored
@param[in] store_recv whether to store recv_t object @param[in] store_recv whether to store recv_t object
......
...@@ -892,14 +892,17 @@ inline byte* recv_sys_t::alloc(size_t len, bool store_recv) ...@@ -892,14 +892,17 @@ inline byte* recv_sys_t::alloc(size_t len, bool store_recv)
{ {
create_block: create_block:
block= buf_block_alloc(nullptr); block= buf_block_alloc(nullptr);
block->page.access_time= 1U << 16 | static_cast<uint16_t>(len); block->page.access_time= 1U << 16 |
ut_calc_align<uint16_t>(static_cast<uint16_t>(len), ALIGNMENT);
static_assert(ut_is_2pow(ALIGNMENT), "ALIGNMENT must be a power of 2");
UT_LIST_ADD_FIRST(blocks, block); UT_LIST_ADD_FIRST(blocks, block);
UNIV_MEM_INVALID(block->frame, len); UNIV_MEM_INVALID(block->frame, len);
UNIV_MEM_FREE(block->frame + len, srv_page_size - len); UNIV_MEM_FREE(block->frame + len, srv_page_size - len);
return block->frame; return my_assume_aligned<ALIGNMENT>(block->frame);
} }
size_t free_offset= static_cast<uint16_t>(block->page.access_time); size_t free_offset= static_cast<uint16_t>(block->page.access_time);
ut_ad(!ut_2pow_remainder(free_offset, ALIGNMENT));
if (UNIV_UNLIKELY(!free_offset)) if (UNIV_UNLIKELY(!free_offset))
{ {
ut_ad(srv_page_size == 65536); ut_ad(srv_page_size == 65536);
...@@ -915,9 +918,9 @@ inline byte* recv_sys_t::alloc(size_t len, bool store_recv) ...@@ -915,9 +918,9 @@ inline byte* recv_sys_t::alloc(size_t len, bool store_recv)
goto create_block; goto create_block;
block->page.access_time= ((block->page.access_time >> 16) + 1) << 16 | block->page.access_time= ((block->page.access_time >> 16) + 1) << 16 |
static_cast<uint16_t>(free_offset); ut_calc_align<uint16_t>(static_cast<uint16_t>(free_offset), ALIGNMENT);
UNIV_MEM_ALLOC(block->frame + free_offset - len, len); UNIV_MEM_ALLOC(block->frame + free_offset - len, len);
return block->frame + free_offset - len; return my_assume_aligned<ALIGNMENT>(block->frame + free_offset - len);
} }
...@@ -925,6 +928,7 @@ inline byte* recv_sys_t::alloc(size_t len, bool store_recv) ...@@ -925,6 +928,7 @@ inline byte* recv_sys_t::alloc(size_t len, bool store_recv)
@param data buffer returned by alloc() */ @param data buffer returned by alloc() */
inline void recv_sys_t::free(const void *data) inline void recv_sys_t::free(const void *data)
{ {
ut_ad(!ut_align_offset(data, ALIGNMENT));
data= page_align(data); data= page_align(data);
ut_ad(mutex_own(&mutex)); ut_ad(mutex_own(&mutex));
for (buf_block_t *block= UT_LIST_GET_LAST(blocks); for (buf_block_t *block= UT_LIST_GET_LAST(blocks);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment