[PATCH] D100348: [hwasan] Fix lock contention on thread creation.
Evgenii Stepanov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 14 15:50:46 PDT 2021
eugenis updated this revision to Diff 337575.
eugenis added a comment.
split locks for live and free lists
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100348/new/
https://reviews.llvm.org/D100348
Files:
compiler-rt/lib/hwasan/hwasan_thread_list.h
Index: compiler-rt/lib/hwasan/hwasan_thread_list.h
===================================================================
--- compiler-rt/lib/hwasan/hwasan_thread_list.h
+++ compiler-rt/lib/hwasan/hwasan_thread_list.h
@@ -86,17 +86,22 @@
}
Thread *CreateCurrentThread() {
- Thread *t;
+ Thread *t = nullptr;
{
- SpinMutexLock l(&list_mutex_);
+ SpinMutexLock l(&free_list_mutex_);
if (!free_list_.empty()) {
t = free_list_.back();
free_list_.pop_back();
- uptr start = (uptr)t - ring_buffer_size_;
- internal_memset((void *)start, 0, ring_buffer_size_ + sizeof(Thread));
- } else {
- t = AllocThread();
}
+ }
+ if (t) {
+ uptr start = (uptr)t - ring_buffer_size_;
+ internal_memset((void *)start, 0, ring_buffer_size_ + sizeof(Thread));
+ } else {
+ t = AllocThread();
+ }
+ {
+ SpinMutexLock l(&live_list_mutex_);
live_list_.push_back(t);
}
t->Init((uptr)t - ring_buffer_size_, ring_buffer_size_);
@@ -110,6 +115,7 @@
}
void RemoveThreadFromLiveList(Thread *t) {
+ SpinMutexLock l(&live_list_mutex_);
for (Thread *&t2 : live_list_)
if (t2 == t) {
// To remove t2, copy the last element of the list in t2's position, and
@@ -124,10 +130,10 @@
void ReleaseThread(Thread *t) {
RemoveThreadStats(t);
t->Destroy();
- SpinMutexLock l(&list_mutex_);
+ DontNeedThread(t);
RemoveThreadFromLiveList(t);
+ SpinMutexLock l(&free_list_mutex_);
free_list_.push_back(t);
- DontNeedThread(t);
}
Thread *GetThreadByBufferAddress(uptr p) {
@@ -144,7 +150,7 @@
template <class CB>
void VisitAllLiveThreads(CB cb) {
- SpinMutexLock l(&list_mutex_);
+ SpinMutexLock l(&live_list_mutex_);
for (Thread *t : live_list_) cb(t);
}
@@ -180,9 +186,10 @@
uptr ring_buffer_size_;
uptr thread_alloc_size_;
+ SpinMutex free_list_mutex_;
InternalMmapVector<Thread *> free_list_;
+ SpinMutex live_list_mutex_;
InternalMmapVector<Thread *> live_list_;
- SpinMutex list_mutex_;
ThreadStats stats_;
SpinMutex stats_mutex_;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D100348.337575.patch
Type: text/x-patch
Size: 2147 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210414/edce2faf/attachment.bin>
More information about the llvm-commits
mailing list