@ -1,6 +1,7 @@
/*****************************************************************************
Copyright ( c ) 1995 , 2016 , Oracle and / or its affiliates . All Rights Reserved .
Copyright ( c ) 2019 , MariaDB Corporation .
This program is free software ; you can redistribute it and / or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -25,6 +26,9 @@ Created 9/30/1995 Heikki Tuuri
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "univ.i"
# ifdef HAVE_LINUX_LARGE_PAGES
# include "mysqld.h"
# endif
/* FreeBSD for example has only MAP_ANON, Linux has MAP_ANONYMOUS and
MAP_ANON but MAP_ANON is marked as deprecated */
@ -38,12 +42,6 @@ MAP_ANON but MAP_ANON is marked as deprecated */
system with os_mem_alloc_large ( ) . */
ulint os_total_large_mem_allocated = 0 ;
/** Whether to use large pages in the buffer pool */
my_bool os_use_large_pages ;
/** Large page size. This may be a boot-time option on some platforms */
uint os_large_page_size ;
/** Converts the current process id to a number.
@ return process id as a number */
ulint
@ -66,18 +64,18 @@ os_mem_alloc_large(
{
void * ptr ;
ulint size ;
# if defined HAVE_LINUX_LARGE_PAGES && defined UNIV_LINUX
# ifdef HAVE_LINUX_LARGE_PAGES
int shmid ;
struct shmid_ds buf ;
if ( ! os _use_large_pages | | ! os _large_page_size ) {
if ( ! my _use_large_pages | | ! opt _large_page_size ) {
goto skip ;
}
/* Align block size to os _large_page_size */
ut_ad ( ut_is_2pow ( os _large_page_size ) ) ;
size = ut_2pow_round ( * n + ( os _large_page_size - 1 ) ,
os_large_page_size ) ;
/* Align block size to opt _large_page_size */
ut_ad ( ut_is_2pow ( opt _large_page_size ) ) ;
size = ut_2pow_round ( * n + opt _large_page_size - 1 ,
ulint ( opt_large_page_size ) ) ;
shmid = shmget ( IPC_PRIVATE , ( size_t ) size , SHM_HUGETLB | SHM_R | SHM_W ) ;
if ( shmid < 0 ) {
@ -109,7 +107,7 @@ os_mem_alloc_large(
ib : : warn ( ) < < " Using conventional memory pool " ;
skip :
# endif /* HAVE_LINUX_LARGE_PAGES && UNIV_LINUX */
# endif /* HAVE_LINUX_LARGE_PAGES */
# ifdef _WIN32
SYSTEM_INFO system_info ;
@ -161,13 +159,13 @@ os_mem_free_large(
{
ut_a ( os_total_large_mem_allocated > = size ) ;
# if defined HAVE_LINUX_LARGE_PAGES && defined UNIV_LINUX
if ( os_use_large_pages & & os _large_page_size & & ! shmdt ( ptr ) ) {
# ifdef HAVE_LINUX_LARGE_PAGES
if ( my_use_large_pages & & opt _large_page_size & & ! shmdt ( ptr ) ) {
my_atomic_addlint (
& os_total_large_mem_allocated , - size ) ;
return ;
}
# endif /* HAVE_LINUX_LARGE_PAGES && UNIV_LINUX */
# endif /* HAVE_LINUX_LARGE_PAGES */
# ifdef _WIN32
/* When RELEASE memory, the size parameter must be 0.
Do not use MEM_RELEASE with MEM_DECOMMIT . */