diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-12-05 06:42:31 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-12-05 06:42:31 +0200 |
commit | 42a4ae54c2f05bccd2d6d752bbc23652962b6929 (patch) | |
tree | b483ef198239a4c41556a8181d27b9bb7d053b03 /storage/innobase/buf | |
parent | 504202bd7fe7d7e85039fface189e721d1aeff7a (diff) | |
download | mariadb-git-42a4ae54c2f05bccd2d6d752bbc23652962b6929.tar.gz |
MDEV-21225 Remove ut_align() and use aligned_malloc()
Before commit 90c52e5291b3ad0935df7da56ec0fcbf530733b4 introduced
aligned_malloc(), InnoDB always used a pattern of over-allocating
memory and invoking ut_align() to guarantee the desired alignment.
It is cleaner to invoke aligned_malloc() and aligned_free() directly.
ut_align(): Remove. In assertions, ut_align_down() can be used instead.
Diffstat (limited to 'storage/innobase/buf')
-rw-r--r-- | storage/innobase/buf/buf0buf.cc | 5 | ||||
-rw-r--r-- | storage/innobase/buf/buf0dblwr.cc | 65 |
2 files changed, 21 insertions, 49 deletions
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 6a2bc34c767..7f98be9e729 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1601,8 +1601,11 @@ buf_chunk_init( opt_large_page_size is smaller than srv_page_size, we may allocate one fewer block than requested. When it is bigger, we may allocate more blocks than requested. */ + static_assert(sizeof(byte*) == sizeof(ulint), "pointer size"); - frame = (byte*) ut_align(chunk->mem, srv_page_size); + frame = reinterpret_cast<byte*>((reinterpret_cast<ulint>(chunk->mem) + + srv_page_size - 1) + & ~(srv_page_size - 1)); chunk->size = (chunk->mem_pfx.m_size >> srv_page_size_shift) - (frame != chunk->mem); diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 72f82a88f49..460874e086e 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -126,12 +126,9 @@ static void buf_dblwr_init(const byte *doublewrite) buf_dblwr->in_use = static_cast<bool*>( ut_zalloc_nokey(buf_size * sizeof(bool))); - buf_dblwr->write_buf_unaligned = static_cast<byte*>( - ut_malloc_nokey((1 + buf_size) << srv_page_size_shift)); - buf_dblwr->write_buf = static_cast<byte*>( - ut_align(buf_dblwr->write_buf_unaligned, - srv_page_size)); + aligned_malloc(buf_size << srv_page_size_shift, + srv_page_size)); buf_dblwr->buf_block_arr = static_cast<buf_page_t**>( ut_zalloc_nokey(buf_size * sizeof(void*))); @@ -355,23 +352,18 @@ buf_dblwr_init_or_load_pages( ulint space_id; byte* read_buf; byte* doublewrite; - byte* unaligned_read_buf; ibool reset_space_ids = FALSE; recv_dblwr_t& recv_dblwr = recv_sys.dblwr; /* We do the file i/o past the buffer pool */ - - unaligned_read_buf = static_cast<byte*>( - ut_malloc_nokey(3U << srv_page_size_shift)); - read_buf = static_cast<byte*>( - ut_align(unaligned_read_buf, srv_page_size)); + aligned_malloc(2 * srv_page_size, srv_page_size)); /* Read the trx sys header to check if we are using the doublewrite buffer */ dberr_t err; - IORequest read_request(IORequest::READ); + IORequest read_request(IORequest::READ); err = os_file_read( read_request, @@ -382,9 +374,8 @@ buf_dblwr_init_or_load_pages( ib::error() << "Failed to read the system tablespace header page"; - - ut_free(unaligned_read_buf); - +func_exit: + aligned_free(read_buf); return(err); } @@ -403,8 +394,8 @@ buf_dblwr_init_or_load_pages( buf = buf_dblwr->write_buf; } else { - ut_free(unaligned_read_buf); - return(DB_SUCCESS); + err = DB_SUCCESS; + goto func_exit; } if (mach_read_from_4(doublewrite + TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED) @@ -432,10 +423,7 @@ buf_dblwr_init_or_load_pages( ib::error() << "Failed to read the first double write buffer " "extent"; - - ut_free(unaligned_read_buf); - - return(err); + goto func_exit; } err = os_file_read( @@ -450,10 +438,7 @@ buf_dblwr_init_or_load_pages( ib::error() << "Failed to read the second double write buffer " "extent"; - - ut_free(unaligned_read_buf); - - return(err); + goto func_exit; } /* Check if any of these pages is half-written in data files, in the @@ -480,10 +465,8 @@ buf_dblwr_init_or_load_pages( + i - TRX_SYS_DOUBLEWRITE_BLOCK_SIZE; } - IORequest write_request(IORequest::WRITE); - err = os_file_write( - write_request, path, file, page, + IORequestWrite, path, file, page, source_page_no << srv_page_size_shift, srv_page_size); if (err != DB_SUCCESS) { @@ -491,10 +474,7 @@ buf_dblwr_init_or_load_pages( ib::error() << "Failed to write to the double write" " buffer"; - - ut_free(unaligned_read_buf); - - return(err); + goto func_exit; } } else if (mach_read_from_8(page + FIL_PAGE_LSN)) { /* Each valid page header must contain @@ -509,9 +489,8 @@ buf_dblwr_init_or_load_pages( os_file_flush(file); } - ut_free(unaligned_read_buf); - - return(DB_SUCCESS); + err = DB_SUCCESS; + goto func_exit; } /** Process and remove the double write buffer pages for all tablespaces. */ @@ -520,18 +499,14 @@ buf_dblwr_process() { ulint page_no_dblwr = 0; byte* read_buf; - byte* unaligned_read_buf; recv_dblwr_t& recv_dblwr = recv_sys.dblwr; if (!buf_dblwr) { return; } - unaligned_read_buf = static_cast<byte*>( - ut_malloc_nokey(3U << srv_page_size_shift)); - read_buf = static_cast<byte*>( - ut_align(unaligned_read_buf, srv_page_size)); + aligned_malloc(2 * srv_page_size, srv_page_size)); byte* const buf = read_buf + srv_page_size; for (recv_dblwr_t::list::iterator i = recv_dblwr.pages.begin(); @@ -687,7 +662,7 @@ bad: recv_dblwr.pages.clear(); fil_flush_file_spaces(FIL_TYPE_TABLESPACE); - ut_free(unaligned_read_buf); + aligned_free(read_buf); } /****************************************************************//** @@ -702,15 +677,9 @@ buf_dblwr_free() os_event_destroy(buf_dblwr->b_event); os_event_destroy(buf_dblwr->s_event); - ut_free(buf_dblwr->write_buf_unaligned); - buf_dblwr->write_buf_unaligned = NULL; - + aligned_free(buf_dblwr->write_buf); ut_free(buf_dblwr->buf_block_arr); - buf_dblwr->buf_block_arr = NULL; - ut_free(buf_dblwr->in_use); - buf_dblwr->in_use = NULL; - mutex_free(&buf_dblwr->mutex); ut_free(buf_dblwr); buf_dblwr = NULL; |