[PATCH] D116366: [Support] Add MemoryBuffer::dontNeedIfMmap
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 29 17:46:47 PST 2021
MaskRay updated this revision to Diff 396586.
MaskRay edited the summary of this revision.
MaskRay added a comment.
Clarify that dontNeedIfMmap should not be called on a writable buffer (Linux MADV_DONTNEED has unusual destructive semantics)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D116366/new/
https://reviews.llvm.org/D116366
Files:
llvm/include/llvm/Support/FileSystem.h
llvm/include/llvm/Support/MemoryBuffer.h
llvm/lib/Support/MemoryBuffer.cpp
llvm/lib/Support/Unix/Path.inc
llvm/lib/Support/Windows/Path.inc
Index: llvm/lib/Support/Windows/Path.inc
===================================================================
--- llvm/lib/Support/Windows/Path.inc
+++ llvm/lib/Support/Windows/Path.inc
@@ -959,6 +959,8 @@
}
}
+void mapped_file_region::dontNeedImpl() {}
+
int mapped_file_region::alignment() {
SYSTEM_INFO SysInfo;
::GetSystemInfo(&SysInfo);
Index: llvm/lib/Support/Unix/Path.inc
===================================================================
--- llvm/lib/Support/Unix/Path.inc
+++ llvm/lib/Support/Unix/Path.inc
@@ -870,6 +870,12 @@
::munmap(Mapping, Size);
}
+void mapped_file_region::dontNeedImpl() {
+ assert(Mode == mapped_file_region::readonly);
+ if (Mapping)
+ ::madvise(Mapping, Size, MADV_DONTNEED);
+}
+
int mapped_file_region::alignment() {
return Process::getPageSizeEstimate();
}
Index: llvm/lib/Support/MemoryBuffer.cpp
===================================================================
--- llvm/lib/Support/MemoryBuffer.cpp
+++ llvm/lib/Support/MemoryBuffer.cpp
@@ -220,6 +220,8 @@
MemoryBuffer::BufferKind getBufferKind() const override {
return MemoryBuffer::MemoryBuffer_MMap;
}
+
+ void dontNeedIfMmap() override { MFR.dontNeed(); }
};
} // namespace
Index: llvm/include/llvm/Support/MemoryBuffer.h
===================================================================
--- llvm/include/llvm/Support/MemoryBuffer.h
+++ llvm/include/llvm/Support/MemoryBuffer.h
@@ -74,6 +74,13 @@
/// from.
virtual StringRef getBufferIdentifier() const { return "Unknown buffer"; }
+ /// For read-only MemoryBuffer_MMap, mark the buffer as unused in the near
+ /// future and the kernel can free resources associated with it. Further
+ /// access is supported but may be expensive. This calls
+ /// madvise(MADV_DONTNEED) on read-only file mappings on *NIX systems. This
+ /// function should not be called on a writable buffer.
+ virtual void dontNeedIfMmap() {}
+
/// Open the specified file as a MemoryBuffer, returning a new MemoryBuffer
/// if successful, otherwise returning null.
///
Index: llvm/include/llvm/Support/FileSystem.h
===================================================================
--- llvm/include/llvm/Support/FileSystem.h
+++ llvm/include/llvm/Support/FileSystem.h
@@ -1279,6 +1279,7 @@
}
void unmapImpl();
+ void dontNeedImpl();
std::error_code init(sys::fs::file_t FD, uint64_t Offset, mapmode Mode);
@@ -1308,6 +1309,7 @@
unmapImpl();
copyFrom(mapped_file_region());
}
+ void dontNeed() { dontNeedImpl(); }
size_t size() const;
char *data() const;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D116366.396586.patch
Type: text/x-patch
Size: 2589 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211230/68086351/attachment.bin>
More information about the llvm-commits
mailing list