diff options
author | ilezhankin <ilezhankin@yandex-team.com> | 2025-03-03 18:46:45 +0300 |
---|---|---|
committer | ilezhankin <ilezhankin@yandex-team.com> | 2025-03-03 19:11:56 +0300 |
commit | 2bc1762eb4cc1110a3dfe6195ec4ee7423a9e30e (patch) | |
tree | 0a541f3fe92ea9be796025c0354d5efeef387bb4 /yql/essentials/minikql/aligned_page_pool.cpp | |
parent | 46a0810e4806b6d9769174f0d9ce3c342b273960 (diff) | |
download | ydb-2bc1762eb4cc1110a3dfe6195ec4ee7423a9e30e.tar.gz |
Implement and use a page arena for small Arrow allocations
commit_hash:2bcb57a12fbb750db7b33872e2cfbec66bdf6405
Diffstat (limited to 'yql/essentials/minikql/aligned_page_pool.cpp')
-rw-r--r-- | yql/essentials/minikql/aligned_page_pool.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/yql/essentials/minikql/aligned_page_pool.cpp b/yql/essentials/minikql/aligned_page_pool.cpp index 04aab1bd8a..bcbb3edd11 100644 --- a/yql/essentials/minikql/aligned_page_pool.cpp +++ b/yql/essentials/minikql/aligned_page_pool.cpp @@ -783,6 +783,40 @@ void* GetAlignedPage(ui64 size) { } template<typename TMmap> +void* GetAlignedPage() { + const auto size = TAlignedPagePool::POOL_PAGE_SIZE; + auto& globalPool = TGlobalPools<TMmap, false>::Instance(); + + if (auto* page = globalPool.Get(0).GetPage()) { + return page; + } + + auto allocSize = size * 2; + void* unalignedPtr = globalPool.DoMmap(allocSize); + if (Y_UNLIKELY(MAP_FAILED == unalignedPtr)) { + TStringStream mmaps; + const auto lastError = LastSystemError(); + if (lastError == ENOMEM) { + mmaps << GetMemoryMapsString(); + } + + ythrow yexception() << "Mmap failed to allocate " << allocSize << " bytes: " + << LastSystemErrorText(lastError) << mmaps.Str(); + } + + void* page = AlignUp(unalignedPtr, size); + + // Unmap unaligned prefix before offset and tail after aligned page + const size_t offset = (intptr_t)page - (intptr_t)unalignedPtr; + if (Y_UNLIKELY(offset)) { + globalPool.DoMunmap(unalignedPtr, offset); + globalPool.DoMunmap((ui8*)page + size, size - offset); + } + + return page; +} + +template<typename TMmap> void ReleaseAlignedPage(void* mem, ui64 size) { size = AlignUp(size, SYS_PAGE_SIZE); if (size < TAlignedPagePool::POOL_PAGE_SIZE) { @@ -801,6 +835,11 @@ void ReleaseAlignedPage(void* mem, ui64 size) { } template<typename TMmap> +void ReleaseAlignedPage(void* ptr) { + TGlobalPools<TMmap, false>::Instance().PushPage(0, ptr); +} + +template<typename TMmap> i64 GetTotalMmapedBytes() { return TGlobalPools<TMmap, true>::Instance().GetTotalMmappedBytes() + TGlobalPools<TMmap, false>::Instance().GetTotalMmappedBytes(); } @@ -822,10 +861,18 @@ template void* GetAlignedPage<>(ui64); template void* GetAlignedPage<TFakeAlignedMmap>(ui64); template void* GetAlignedPage<TFakeUnalignedMmap>(ui64); +template void* GetAlignedPage<>(); +template void* GetAlignedPage<TFakeAlignedMmap>(); +template void* GetAlignedPage<TFakeUnalignedMmap>(); + template void ReleaseAlignedPage<>(void*,ui64); template void ReleaseAlignedPage<TFakeAlignedMmap>(void*,ui64); template void ReleaseAlignedPage<TFakeUnalignedMmap>(void*,ui64); +template void ReleaseAlignedPage<>(void*); +template void ReleaseAlignedPage<TFakeAlignedMmap>(void*); +template void ReleaseAlignedPage<TFakeUnalignedMmap>(void*); + size_t GetMemoryMapsCount() { size_t lineCount = 0; TString line; |