[PATCH] D13156: Fix performance problem in long-running SectionMemoryManagers
Keno Fischer via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 30 14:41:34 PDT 2015
loladiro updated this revision to Diff 36145.
loladiro added a comment.
Addresses review comments. @reames let me know if you agree with the wording of the explanatory
comment.
http://reviews.llvm.org/D13156
Files:
include/llvm/ExecutionEngine/SectionMemoryManager.h
lib/ExecutionEngine/SectionMemoryManager.cpp
Index: lib/ExecutionEngine/SectionMemoryManager.cpp
===================================================================
--- lib/ExecutionEngine/SectionMemoryManager.cpp
+++ lib/ExecutionEngine/SectionMemoryManager.cpp
@@ -83,7 +83,7 @@
// Save this address as the basis for our next request
MemGroup.Near = MB;
- MemGroup.AllocatedMem.push_back(MB);
+ MemGroup.PendingMem.push_back(MB);
Addr = (uintptr_t)MB.base();
uintptr_t EndOfBlock = Addr + MB.size();
@@ -138,29 +138,39 @@
// relocations) will get to the data cache but not to the instruction cache.
invalidateInstructionCache();
+ // Now, remember that we have successfully applied the permissions to avoid
+ // having to apply them again.
+ CodeMem.AllocatedMem.append(CodeMem.PendingMem.begin(),CodeMem.PendingMem.end());
+ RODataMem.AllocatedMem.append(RODataMem.PendingMem.begin(),RODataMem.PendingMem.end());
+ CodeMem.PendingMem.clear();
+ RODataMem.PendingMem.clear();
+
return false;
}
std::error_code
SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup,
unsigned Permissions) {
- for (sys::MemoryBlock &MB : MemGroup.AllocatedMem)
+ for (sys::MemoryBlock &MB : MemGroup.PendingMem)
if (std::error_code EC = sys::Memory::protectMappedMemory(MB, Permissions))
return EC;
return std::error_code();
}
void SectionMemoryManager::invalidateInstructionCache() {
- for (sys::MemoryBlock &Block : CodeMem.AllocatedMem)
+ for (sys::MemoryBlock &Block : CodeMem.PendingMem)
sys::Memory::InvalidateInstructionCache(Block.base(), Block.size());
}
SectionMemoryManager::~SectionMemoryManager() {
- for (MemoryGroup *Group : {&CodeMem, &RWDataMem, &RODataMem})
+ for (MemoryGroup *Group : {&CodeMem, &RWDataMem, &RODataMem}) {
for (sys::MemoryBlock &Block : Group->AllocatedMem)
sys::Memory::releaseMappedMemory(Block);
+ for (sys::MemoryBlock &Block : Group->PendingMem)
+ sys::Memory::releaseMappedMemory(Block);
+ }
}
} // namespace llvm
Index: include/llvm/ExecutionEngine/SectionMemoryManager.h
===================================================================
--- include/llvm/ExecutionEngine/SectionMemoryManager.h
+++ include/llvm/ExecutionEngine/SectionMemoryManager.h
@@ -84,8 +84,23 @@
private:
struct MemoryGroup {
- SmallVector<sys::MemoryBlock, 16> AllocatedMem;
+ // PendingMem contains all allocated memory blocks
+ // which have not yet had their permissions set. Note
+ // that this tracks memory blocks that have been given to
+ // this memory manager by the system, not those
+ // given out to the user. In particular, the memory manager
+ // will give out subblocks of these MemoryBlocks in response
+ // to user requests. We track which subblocks have not beeen
+ // given out yet in `FreeMem`.
+ SmallVector<sys::MemoryBlock, 16> PendingMem;
SmallVector<sys::MemoryBlock, 16> FreeMem;
+
+ // All allocated memory blocks that have had their permissions
+ // set (i.e. that have been finalized). Because of this, we may
+ // not give out subblocks of this memory to the user anymore,
+ // even if those subblocks have not been previously given out.
+ SmallVector<sys::MemoryBlock, 16> AllocatedMem;
+
sys::MemoryBlock Near;
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D13156.36145.patch
Type: text/x-patch
Size: 3375 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150930/610d4312/attachment.bin>
More information about the llvm-commits
mailing list