[PATCH] [JITLink] Always unmap standard segments in InProcessMemoryManager::deallocat...
authorMin-Yih Hsu <min.hsu@sifive.com>
Sat, 17 Feb 2024 00:19:56 +0000 (16:19 -0800)
committerSylvestre Ledru <sylvestre@debian.org>
Mon, 23 Sep 2024 11:23:31 +0000 (13:23 +0200)
Right now InProcessMemoryManager only releases a standard segment (via
sys::Memory::releaseMappedMemory) in `deallocate` when there is a
DeallocAction associated, leaving residual memory pages in the process
until termination.
Despite being a de facto memory leak, it won't cause a major issue if
users only create a single LLJIT instance per process, which is the most
common use cases. It will, however, drain virtual memory pages if we
create thousands of ephemeral LLJIT instances in the same process.

This patch fixes this issue by releasing every standard segments
regardless of the attached DeallocAction.

Gbp-Pq: Name rv64-fix-mm-leak.diff

llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp

index 474a0b5160bcb05bd8bdfa586080b9c5557916b6..dacf0e6c8aa4f205c8ce5136db605690e1f63735 100644 (file)
@@ -449,8 +449,7 @@ void InProcessMemoryManager::deallocate(std::vector<FinalizedAlloc> Allocs,
     for (auto &Alloc : Allocs) {
       auto *FA = Alloc.release().toPtr<FinalizedAllocInfo *>();
       StandardSegmentsList.push_back(std::move(FA->StandardSegments));
-      if (!FA->DeallocActions.empty())
-        DeallocActionsList.push_back(std::move(FA->DeallocActions));
+      DeallocActionsList.push_back(std::move(FA->DeallocActions));
       FA->~FinalizedAllocInfo();
       FinalizedAllocInfos.Deallocate(FA);
     }