Message ID | 20220420065013.222816-38-npiggin@gmail.com |
---|---|
State | New |
Headers | show |
Series | gdbserver multi-threaded debugging and POWER9/10 support | expand |
On Wed, 20 Apr 2022 at 06:52, Nicholas Piggin <npiggin@gmail.com> wrote: > > This could (marginally) improve stop/start latency when targeting > all threads. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Joel Stanley <joel@jms.id.au> > --- > src/pdbgproxy.c | 44 +++++++++++++++++++++++++------------------- > 1 file changed, 25 insertions(+), 19 deletions(-) > > diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c > index d50121c0..e81dba40 100644 > --- a/src/pdbgproxy.c > +++ b/src/pdbgproxy.c > @@ -686,13 +686,19 @@ static void __start_all(void) > if (!all_stopped) > PR_ERROR("starting while not all stopped\n"); > > - for_each_path_target_class("thread", target) { > - if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) > - continue; > + if (path_target_all_selected("thread", NULL)) { > + if (thread_start_all()) { > + PR_ERROR("Could not start threads\n"); > + } > + } else { > + for_each_path_target_class("thread", target) { > + if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) > + continue; > > - if (thread_start(target)) { > - PR_ERROR("Could not start thread %s\n", > - pdbg_target_path(target)); > + if (thread_start(target)) { > + PR_ERROR("Could not start thread %s\n", > + pdbg_target_path(target)); > + } > } > } > > @@ -706,16 +712,10 @@ static void start_all(void) > for_each_path_target_class("thread", target) { > struct thread *thread = target_to_thread(target); > struct gdb_thread *gdb_thread; > - struct thread_state status; > > if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) > continue; > > - target->probe(target); > - status = thread_status(target); > - if (!status.quiesced) > - PR_ERROR("starting thread not quiesced\n"); > - > gdb_thread = thread->gdbserver_priv; > > gdb_thread->stop_attn = false; > @@ -794,14 +794,20 @@ static void __stop_all(void) > if (all_stopped) > PR_ERROR("stopping while all stopped\n"); > > - for_each_path_target_class("thread", target) { > - if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) > - continue; > + if (path_target_all_selected("thread", NULL)) { > + if (thread_stop_all()) { > + PR_ERROR("Could not stop threads\n"); > + } > + } else { > + for_each_path_target_class("thread", target) { > + if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) > + continue; > > - if (thread_stop(target)) { > - PR_ERROR("Could not stop thread %s\n", > - pdbg_target_path(target)); > - /* How to fix? */ > + if (thread_stop(target)) { > + PR_ERROR("Could not stop thread %s\n", > + pdbg_target_path(target)); > + /* How to fix? */ > + } > } > } > > -- > 2.35.1 > > -- > Pdbg mailing list > Pdbg@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/pdbg
diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c index d50121c0..e81dba40 100644 --- a/src/pdbgproxy.c +++ b/src/pdbgproxy.c @@ -686,13 +686,19 @@ static void __start_all(void) if (!all_stopped) PR_ERROR("starting while not all stopped\n"); - for_each_path_target_class("thread", target) { - if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) - continue; + if (path_target_all_selected("thread", NULL)) { + if (thread_start_all()) { + PR_ERROR("Could not start threads\n"); + } + } else { + for_each_path_target_class("thread", target) { + if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) + continue; - if (thread_start(target)) { - PR_ERROR("Could not start thread %s\n", - pdbg_target_path(target)); + if (thread_start(target)) { + PR_ERROR("Could not start thread %s\n", + pdbg_target_path(target)); + } } } @@ -706,16 +712,10 @@ static void start_all(void) for_each_path_target_class("thread", target) { struct thread *thread = target_to_thread(target); struct gdb_thread *gdb_thread; - struct thread_state status; if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) continue; - target->probe(target); - status = thread_status(target); - if (!status.quiesced) - PR_ERROR("starting thread not quiesced\n"); - gdb_thread = thread->gdbserver_priv; gdb_thread->stop_attn = false; @@ -794,14 +794,20 @@ static void __stop_all(void) if (all_stopped) PR_ERROR("stopping while all stopped\n"); - for_each_path_target_class("thread", target) { - if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) - continue; + if (path_target_all_selected("thread", NULL)) { + if (thread_stop_all()) { + PR_ERROR("Could not stop threads\n"); + } + } else { + for_each_path_target_class("thread", target) { + if (pdbg_target_status(target) != PDBG_TARGET_ENABLED) + continue; - if (thread_stop(target)) { - PR_ERROR("Could not stop thread %s\n", - pdbg_target_path(target)); - /* How to fix? */ + if (thread_stop(target)) { + PR_ERROR("Could not stop thread %s\n", + pdbg_target_path(target)); + /* How to fix? */ + } } }
This could (marginally) improve stop/start latency when targeting all threads. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- src/pdbgproxy.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-)