MySQL 9.1.0
Source Code Documentation
|
Allocation routines which are purposed for allocating memory through the means of what is known as large (huge) pages. More...
#include <large_page_alloc.h>
Public Types | |
using | page_allocation_metadata = Page_alloc_metadata_pfs |
Static Public Member Functions | |
static void * | alloc (std::size_t size, page_allocation_metadata::pfs_metadata::pfs_memory_key_t key) |
Allocates memory through large-page support. More... | |
static bool | free (PFS_metadata::data_segment_ptr data) noexcept |
Releases storage allocated through Large_page_alloc_pfs::alloc(). More... | |
static size_t | datalen (PFS_metadata::data_segment_ptr data) |
Returns the number of bytes that have been allocated. More... | |
static Page_type | page_type (PFS_metadata::data_segment_ptr data) |
Returns the Page_type. More... | |
static allocation_low_level_info | low_level_info (void *data) |
Retrieves the pointer and size of the allocation provided by the OS. More... | |
Static Private Member Functions | |
static void * | deduce (PFS_metadata::data_segment_ptr data) noexcept |
Helper function which deduces the original pointer returned by Large_page_alloc_pfs from a pointer which is passed to us by the call-site. More... | |
Additional Inherited Members | |
Static Public Attributes inherited from ut::detail::allocator_traits< true > | |
static constexpr auto | is_pfs_instrumented_v |
Allocation routines which are purposed for allocating memory through the means of what is known as large (huge) pages.
This is a PFS (performance-schema) variant of Large_page_alloc. Implemented in terms of Page_alloc_metadata_pfs.
large_page_aligned_alloc() and large_page_aligned_free() are taking care of OS specific details and Large_page_alloc is a convenience wrapper which only makes the use of large pages more ergonomic so that it serializes all the relevant PFS details into the raw memory. Otherwise, client code would have been responsible to store and keep those details somewhere until the memory segment is freed. Additionally, information on type of page used to back up requested allocation is also serialized into the memory allowing to build higher-kinded abstractions more easily. See ut::malloc_large_page with option to fallback to regular pages through ut::malloc_page.
Cost associated with this abstraction is the size of a single CPU page. In terms of virtual memory, especially in 64-bit address space, this cost is negligible. In practice this means that for each N huge-page sized allocation request, application code will get to use CPU_PAGE_SIZE bytes less. In other words, for a request that is backed up by three 2MiB huge-pages, application code will get to use 3 * 2MiB - CPU_PAGE_SIZE of total bytes. CPU_PAGE_SIZE is normally 4K but some architectures such as SPARC have it set to 8K. ARM64 can be set to 4K, 8K or 64K.
Memory layout representation looks like the following:
^ ^ | | | | | ptr (large-page) to be | returned to call-site
^ ^ | | | ------------------------— | | OWNER | DATALEN | KEY | | ------------------------— | ptr returned by large_page_aligned_alloc
For details on PFS-META, PAGE-TYPE, VARLEN and PFS-META-OFFSET fields see Page_alloc_metadata_pfs.
DATA is an actual page-aligned (!) segment backed by large (huge) page memory that will be returned to the call-site and which the client code will be able to use for the application data.
|
inlinestatic |
Allocates memory through large-page support.
[in] | size | Size of storage (in bytes) requested to be allocated. |
[in] | key | PSI memory key to be used for PFS memory instrumentation. |
|
inlinestatic |
Returns the number of bytes that have been allocated.
[in] | data | Pointer to storage allocated through Large_page_alloc_pfs::alloc() |
|
inlinestaticprivatenoexcept |
Helper function which deduces the original pointer returned by Large_page_alloc_pfs from a pointer which is passed to us by the call-site.
|
inlinestaticnoexcept |
Releases storage allocated through Large_page_alloc_pfs::alloc().
[in] | data | Pointer to storage allocated through Large_page_alloc_pfs::alloc() |
|
inlinestatic |
Retrieves the pointer and size of the allocation provided by the OS.
It is a low level information, and is needed only to call low level memory-related OS functions.
[in] | data | Pointer to storage allocated through Large_page_alloc_pfs::alloc() |
|
inlinestatic |
Returns the Page_type.
[in] | data | Pointer to storage allocated through Large_page_alloc_pfs::alloc() |