public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: Yao Qi <qiyaoltc@gmail.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH v3 05/17] Embed the pending step-over chain in thread_info objects
Date: Wed, 22 Apr 2015 20:14:00 -0000	[thread overview]
Message-ID: <55380114.6040607@redhat.com> (raw)
In-Reply-To: <86mw21zy0e.fsf@gmail.com>

On 04/21/2015 09:28 AM, Yao Qi wrote:
> Pedro Alves <palves@redhat.com> writes:
> 
> Hi Pedro,
> This patch looks good to me, some questions below.
> 
>> 	(displaced_step_prepare): Assert that trap_expected is set.  Use
>> 	thread_step_over_chain_enqueue.  Split starting a new displaced
>> 	step to ...
>> 	(start_step_over): ... this new function.
> 
> If I read this patch correctly,  start_step_over is moved from
> displaced_step_fixup.  That is why we call start_step_over after each
> displaced_step_fixup.

Correct.

> 
>> v3:
>>
>> 	More comments.  The step-over chain is now a global instead of
>> 	being per-inferior.  Previous versions had actually broken
>> 	multiple-processes displaced stepping at the same time.  Added new
> 
> How does per-inferior step-over chain (or displaced stepping queue)
> break multi-process displaced stepping?

v1 and v2 put the head of the step-over chain in the inferior
structure.  start_step_over would look up the inferior structure of
the thread that just finished the step over, and try to
start a step-over of another thread of that inferior.

And if we had just finished an in-line step over, and the step-over that we
could start now is a displaced-step of _another_ inferior, in v2,
we wouldn't start it (because start_step_over_inferior wouldn't see that
thread).

And if we could start a displaced-step for a thread of the event
inferior, start_step_over would return immediately, instead
of trying to start a displaced step in another inferior too.

Even in-line step-overs were broken.  E.g., say you have two inferiors,
each with one thread.  Everything is stopped at a breakpoint that
must be stepped over. sched-multi is on, and the user does "continue"
to continue both inferiors.  We'd start an in-line step-over for
inferior 1.  Once that is done, we'd try starting a new step over
in the same inferior, and we'd miss that the other inferior
has a thread to step over too.

I went a bit in circles a trying to address that.  The fact that for
in-line step overs we must stop all threads currently (we should be
able to stop only threads sharing the stepped thread's address space
instead, but we're not there yet), but not for displaced stepping
started making it too complicated.  Related I also considered that we
could have more that one displaced step scratch pad slot per
inferior (e.g., "reserve" a few more bytes around the entry point).

Another thing I realized is that per-inferior queue breaks the
forward-progress-guarantee ordering, as we'd be giving priority
to start step overs on threads of the same inferior that had
just finished a step over, potentially starving threads of other
inferiors.  The ordering issue is that there was no ordering
between the step-over chains of the multiple inferiors, so if we
left the chain per-inferior, we wouldn't know which inferior's
chain had the thread that was waiting for a step-over for the
longest time.

All in all, I realized that a single list is simpler and
more flexible.

> 
>> @@ -2972,35 +2983,17 @@ infrun_thread_stop_requested_callback (struct thread_info *info, void *arg)
>>  static void
>>  infrun_thread_stop_requested (ptid_t ptid)
>>  {
>> -  struct displaced_step_inferior_state *displaced;
>> -
>> -  /* PTID was requested to stop.  Remove it from the displaced
>> -     stepping queue, so we don't try to resume it automatically.  */
>> -
>> -  for (displaced = displaced_step_inferior_states;
>> -       displaced;
>> -       displaced = displaced->next)
>> -    {
>> -      struct displaced_step_request *it, **prev_next_p;
>> -
>> -      it = displaced->step_request_queue;
>> -      prev_next_p = &displaced->step_request_queue;
>> -      while (it)
>> -	{
>> -	  if (ptid_match (it->ptid, ptid))
>> -	    {
>> -	      *prev_next_p = it->next;
>> -	      it->next = NULL;
>> -	      xfree (it);
>> -	    }
>> -	  else
>> -	    {
>> -	      prev_next_p = &it->next;
>> -	    }
>> +  struct thread_info *tp;
>>  
>> -	  it = *prev_next_p;
>> -	}
>> -    }
>> +  /* PTID was requested to stop.  Remove matching threads from the
>> +     step-over queue, so we don't try to resume them
>> +     automatically.  */
> 
> I can understand the code below, except the comment "we don't try to
> resume them automatically".  It looks not necessary here.

By "resumed automatically" I meant that if thread A is left in
the step-over chain (or currently in mainline in the displaced step queue)
it ends up stepped when all others threads in the step over queue
are done with their steps, even if thread A is supposed to be stopped.
But I agree it's not really necessary.  I'll remove it.

> 
>> +  ALL_NON_EXITED_THREADS (tp)
>> +    if (ptid_match (tp->ptid, ptid))
>> +      {
>> +	if (thread_is_in_step_over_chain (tp))
>> +	  thread_step_over_chain_remove (tp);
>> +      }
>>  
>>    iterate_over_threads (infrun_thread_stop_requested_callback, &ptid);
>>  }
>> @@ -4051,6 +4044,9 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
>>  	       that this operation also cleans up the child process for vfork,
>>  	       because their pages are shared.  */
>>  	    displaced_step_fixup (ecs->ptid, GDB_SIGNAL_TRAP);
>> +	    /* Start a new step-over in another thread if there's one
>> +	       that needs it.  */
>> +	    start_step_over ();
> 
> The comment is confusing to me, especially the "one" and the "it".  Do
> you mean "in another thread if there is one thread that needs step-over"?
> 
>> @@ -323,6 +403,10 @@ delete_thread_1 (ptid_t ptid, int silent)
>>    if (!tp)
>>      return;
>>  
>> +  /* Dead threads don't need to step-over.  Remove from queue.  */
>> +  if (tp->step_over_next != NULL)
>> +    thread_step_over_chain_remove (tp);
>> +
> 
> I am wondering how this can happen?  A thread needs step-over becomes dead?

It can happen if the process exits or disappears (target is closed, etc.)
while the thread was waiting for its turn.

Thanks,
Pedro Alves

  reply	other threads:[~2015-04-22 20:14 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-17 10:47 [PATCH v3 00/23] All-stop on top of non-stop Pedro Alves
2015-04-17 10:45 ` [PATCH v3 13/17] Fix step-over-{trips-on-watchpoint|lands-on-breakpoint}.exp race Pedro Alves
2015-04-17 10:45 ` [PATCH v3 03/17] remote.c/all-stop: Implement TARGET_WAITKIND_NO_RESUMED and TARGET_WNOHANG Pedro Alves
2015-04-17 10:45 ` [PATCH v3 04/17] Make thread_still_needs_step_over consider stepping_over_watchpoint too Pedro Alves
2015-04-17 10:45 ` [PATCH v3 06/17] Use keep_going in proceed and start_step_over too Pedro Alves
2015-04-22  5:09   ` Doug Evans
2015-04-22 22:22     ` Pedro Alves
2015-04-17 10:45 ` [PATCH v3 02/17] Change adjust_pc_after_break's prototype Pedro Alves
2015-04-17 10:45 ` [PATCH v3 15/17] PPC64: Fix gdb.arch/ppc64-atomic-inst.exp with displaced stepping Pedro Alves
2015-04-21 11:21   ` Yao Qi
2015-04-22 20:04     ` Pedro Alves
2015-04-17 10:45 ` [PATCH v3 11/17] Fix signal-while-stepping-over-bp-other-thread.exp on targets always in non-stop Pedro Alves
2015-04-17 10:45 ` [PATCH v3 08/17] Factor out code to re-resume stepped thread Pedro Alves
2015-04-17 10:45 ` [PATCH v3 05/17] Embed the pending step-over chain in thread_info objects Pedro Alves
2015-04-21  8:28   ` Yao Qi
2015-04-22 20:14     ` Pedro Alves [this message]
2015-04-21  9:53   ` Yao Qi
2015-04-22 19:07     ` Pedro Alves
2015-04-22  4:25   ` Doug Evans
2015-04-22 22:19     ` Pedro Alves
2015-04-17 10:47 ` [PATCH v3 01/17] Fix and test "checkpoint" in non-stop mode Pedro Alves
2015-04-21  2:36   ` Doug Evans
2015-04-22 17:48     ` Pedro Alves
2015-04-28 18:18       ` Doug Evans
2015-04-29  4:56         ` Doug Evans
2015-05-19 18:08           ` Pedro Alves
2015-04-17 10:47 ` [PATCH v3 07/17] Misc switch_back_to_stepped_thread cleanups Pedro Alves
2015-04-21  9:50   ` Yao Qi
2015-04-22 20:04     ` Pedro Alves
2015-04-22  5:23   ` Doug Evans
2015-04-22 20:05     ` Pedro Alves
2015-04-28 20:28       ` Doug Evans
2015-04-17 10:47 ` [PATCH v3 17/17] native Linux: enable always non-stop by default Pedro Alves
2015-04-17 10:52 ` [PATCH v3 12/17] Fix interrupt-noterm.exp on targets always in non-stop Pedro Alves
2015-04-21 11:40   ` Yao Qi
2015-04-22 20:03     ` Pedro Alves
2015-04-17 10:52 ` [PATCH v3 09/17] Teach non-stop to do in-line step-overs (stop all, step, restart) Pedro Alves
2015-04-17 11:01   ` Pedro Alves
2015-04-21 15:01   ` Yao Qi
2015-04-22 20:03     ` Pedro Alves
2015-04-24  9:06       ` Yao Qi
2015-04-27 20:17   ` Doug Evans
2015-05-19 18:09     ` Pedro Alves
2015-05-19 18:49       ` Pedro Alves
2015-04-17 10:56 ` [PATCH v3 14/17] Disable displaced stepping if trying it fails Pedro Alves
2015-04-17 11:06 ` [PATCH v3 16/17] S/390: displaced stepping and PC-relative RIL-b/RIL-c instructions Pedro Alves
2015-04-17 11:38 ` [PATCH v3 10/17] Implement all-stop on top of a target running non-stop mode Pedro Alves
2015-04-21 11:09   ` Yao Qi
2015-04-22 20:16     ` Pedro Alves
2015-04-24  7:39       ` Yao Qi
2015-05-19 18:08         ` Pedro Alves
2015-05-21  9:17           ` Yao Qi
2015-04-20 12:02 ` [PATCH v3 00/23] All-stop on top of non-stop Yao Qi
2015-04-20 16:54   ` Sergio Durigan Junior
2015-04-20 16:43     ` Pedro Alves
2015-04-21  7:48       ` Yao Qi
2015-04-21 15:05         ` Yao Qi
2015-04-22 22:27           ` Pedro Alves
2015-04-20 17:35 ` Simon Marchi
2015-05-19 18:14   ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55380114.6040607@redhat.com \
    --to=palves@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=qiyaoltc@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).