summaryrefslogtreecommitdiff
path: root/bolt/runtime
diff options
context:
space:
mode:
authorMichaƂ Chojnowski <michal.chojnowski@scylladb.com>2022-07-07 13:54:51 +0300
committerVladislav Khmelevsky <och95@yandex.ru>2022-07-07 14:27:29 +0300
commitbd301a418bf2a866c7c17a5cdc82a1d7d13e156f (patch)
treeb143e5626daf91818d581d8ff210000636f6cd02 /bolt/runtime
parent8e03bfc368f72a4f97129b0837396e69ae2ba1fe (diff)
downloadllvm-bd301a418bf2a866c7c17a5cdc82a1d7d13e156f.tar.gz
[BOLT] Fix concurrent hash table modification in the instrumentation runtime
`__bolt_instr_data_dump()` does not lock the hash tables when iterating over them, so the iteration can happen concurrently with a modification done in another thread, when the table is in an inconsistent state. This also has been observed in practice, when it caused a segmentation fault. We fix this by locking hash tables during iteration. This is done by taking the lock in `forEachElement()`. The only other site of iteration, `resetCounters()`, has been correctly locking the table even before this patch. This patch removes its `Lock` because the lock is now taken in the inner `forEachElement()`. Reviewed By: maksfb, yota9 Differential Revision: https://reviews.llvm.org/D129089
Diffstat (limited to 'bolt/runtime')
-rw-r--r--bolt/runtime/instr.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/bolt/runtime/instr.cpp b/bolt/runtime/instr.cpp
index 8dd84ffcb4e8..1a8bcf500362 100644
--- a/bolt/runtime/instr.cpp
+++ b/bolt/runtime/instr.cpp
@@ -289,6 +289,7 @@ public:
/// Traverses all elements in the table
template <typename... Args>
void forEachElement(void (*Callback)(MapEntry &, Args...), Args... args) {
+ Lock L(M);
if (!TableRoot)
return;
return forEachElement(Callback, InitialSize, TableRoot, args...);
@@ -378,7 +379,6 @@ template <typename T> void resetIndCallCounter(T &Entry) {
template <typename T, uint32_t X, uint32_t Y>
void SimpleHashTable<T, X, Y>::resetCounters() {
- Lock L(M);
forEachElement(resetIndCallCounter);
}