-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[LLDB] Fix deadlock in module callback when running in parallel #168425
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
@llvm/pr-subscribers-lldb Author: Jacob Lalonde (Jlalond) ChangesWhen the target is being created, the target list acquires the mutex for the duration of the target creation process. However if a module callback is enabled and is being called in parallel there exists an opportunity to deadlock if the callback calls into targetlist. I've created a minimum repro here. This looks like a straight forward fix, where Full diff: https://github.com/llvm/llvm-project/pull/168425.diff 1 Files Affected:
diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp
index 2e03bc1e38ea0..af0d24d7b1d0a 100644
--- a/lldb/source/Target/TargetList.cpp
+++ b/lldb/source/Target/TargetList.cpp
@@ -48,11 +48,16 @@ Status TargetList::CreateTarget(Debugger &debugger,
LoadDependentFiles load_dependent_files,
const OptionGroupPlatform *platform_options,
TargetSP &target_sp) {
- std::lock_guard<std::recursive_mutex> guard(m_target_list_mutex);
+ // Create Target Internal does not modify and state
+ // directly and instead calls into methods which
+ // they themselves are thread-safe. We do this so
+ // the load module call back doesn't cause a re-entry
+ // dead-lock when creating the target.
auto result = TargetList::CreateTargetInternal(
debugger, user_exe_path, triple_str, load_dependent_files,
platform_options, target_sp);
+ std::lock_guard<std::recursive_mutex> guard(m_target_list_mutex);
if (target_sp && result.Success())
AddTargetInternal(target_sp, /*do_select*/ true);
return result;
@@ -63,11 +68,16 @@ Status TargetList::CreateTarget(Debugger &debugger,
const ArchSpec &specified_arch,
LoadDependentFiles load_dependent_files,
PlatformSP &platform_sp, TargetSP &target_sp) {
- std::lock_guard<std::recursive_mutex> guard(m_target_list_mutex);
+ // Create Target Internal does not modify and state
+ // directly and instead calls into methods which
+ // they themselves are thread-safe. We do this so
+ // the load module call back doesn't cause a re-entry
+ // dead-lock when creating the target.
auto result = TargetList::CreateTargetInternal(
debugger, user_exe_path, specified_arch, load_dependent_files,
platform_sp, target_sp);
+ std::lock_guard<std::recursive_mutex> guard(m_target_list_mutex);
if (target_sp && result.Success())
AddTargetInternal(target_sp, /*do_select*/ true);
return result;
|
🐧 Linux x64 Test Results
|
8bda2cf to
6c12e75
Compare
… for the entire target creation and causing a deadlock with the module callback when running in parallel.
6c12e75 to
f2d3ad3
Compare
clayborg
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems ok to to. m_target_list_mutex is really there to protect the target list itself. We might want to move the mutex lock into TargetList::AddTargetInternal to keep things cleaner?
When the target is being created, the target list acquires the mutex for the duration of the target creation process. However if a module callback is enabled and is being called in parallel there exists an opportunity to deadlock if the callback calls into targetlist. I've created a minimum repro here.
This looks like a straight forward fix, where
CreateTargetInternaldoesn't access any state directly, and instead calls methods which they themselves are thread-safe. So I've moved the lock to when we update the list with the created target. I'm not sure if this is a comprehensive fix, but it does fix my above example and in my (albeit limited) testing, doesn't cause any strange change in behavior.