From: MichaƂ Chojnowski Date: Thu, 7 Jul 2022 10:54:51 +0000 (+0300) Subject: [BOLT] Fix concurrent hash table modification in the instrumentation runtime X-Git-Tag: upstream/15.0.7~2458 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd301a418bf2a866c7c17a5cdc82a1d7d13e156f;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/bolt/runtime/instr.cpp b/bolt/runtime/instr.cpp index 8dd84ff..1a8bcf5 100644 --- a/bolt/runtime/instr.cpp +++ b/bolt/runtime/instr.cpp @@ -289,6 +289,7 @@ public: /// Traverses all elements in the table template 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 void resetIndCallCounter(T &Entry) { template void SimpleHashTable::resetCounters() { - Lock L(M); forEachElement(resetIndCallCounter); }