From: Antoine Tremblay <antoine.tremblay@ericsson.com>
To: Pedro Alves <palves@redhat.com>
Cc: Yao Qi <qiyaoltc@gmail.com>, <gdb-patches@sourceware.org>
Subject: Re: [PATCH 11/12] Use reinsert_breakpoint for vCont;s
Date: Mon, 20 Jun 2016 18:09:00 -0000 [thread overview]
Message-ID: <wwokk2hjd95w.fsf@ericsson.com> (raw)
In-Reply-To: <ed0b4fbf-5d6c-dd5d-19ba-c38a87cc7d4e@redhat.com>
Pedro Alves writes:
>> @@ -3518,6 +3521,23 @@ linux_wait_1 (ptid_t ptid,
>> return ignore_event (ourstatus);
>> }
>>
>> + /* Remove reinsert breakpoints ... */
>> + if (can_software_single_step ()
>> + && has_reinsert_breakpoints (current_thread)
>> + /*... if GDB requests this thread doing resume_step or ...*/
>> + && (current_thread->last_resume_kind == resume_step
>> + /* GDBserver has already started the step-over for vCont;s,
>> + but it gets some other signal, like SIGSTOP sent by
>> + GDBserver for vCont;t or other signal program received. */
>> + || !maybe_internal_trap))
>> + {
>> + stop_all_lwps (1, event_child);
>> +
>> + delete_reinsert_breakpoints (current_thread);
>> +
>> + unstop_all_lwps (1, event_child);
>> + }
>
> I'm re-looking at this and wondering if this is really the
> right place to do this. If the thread hits a breakpoint
> that ends up not reported to gdb (e.g., condition evals false),
> then we'll remove the reinsert breakpoints here, and then
> later reinsert them in proceed_all_lwps. The extra
> stopping/unstopping everything is best avoided if possible.
>
> Thus, couldn't we move this to after:
>
> /* We found no reason GDB would want us to stop. We either hit one
> of our own breakpoints, or finished an internal step GDB
> shouldn't know about. */
> if (!report_to_gdb)
> {
> ...
> }
>
> ?
A note about avoiding stop/unstop, could we make it so that we really
stop/unstop only when we're actually modifing memory ?
If we place multiple reinsert breakpoints at one location over multiple
threads like the non-stop-fair-events tests does for example, we end up
calling stop/unstop when only the breakpoint refcount gets modified.
This could be applied in general to the stop / breakpoint operation /
unstop case...
I'm testing range-stepping with this patchset and found that with
non-stop-fair-events the single stepping threads stop/unstop so often
that it actually starves the execution of the thread that could make
them stop single stepping.
Thread 2-11 of the test step in an infinite loop waiting for a signal
from thread 1 but thread 1 even if it's resumed, is stopped/started so quickly
that it never gets a chance to really execute.
Most likely limiting this stop/unstop for the refcounted case would not
solve that issue but may help.
I'm not sure what else could be done for that except maybe displaced
stepping ?
Also if you're testing this out, note that there's a bug in the event
selection code I think that can be fixed with :
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 4e79ec1..9d2f4d9 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -3664,24 +3670,6 @@ linux_wait_1 (ptid_t ptid,
if (!non_stop)
stop_all_lwps (0, NULL);
- /* If we're not waiting for a specific LWP, choose an event LWP
- from among those that have had events. Giving equal priority
- to all LWPs that have had events helps prevent
- starvation. */
- if (ptid_equal (ptid, minus_one_ptid))
- {
- event_child->status_pending_p = 1;
- event_child->status_pending = w;
-
- select_event_lwp (&event_child);
-
- /* current_thread and event_child must stay in sync. */
- current_thread = get_lwp_thread (event_child);
-
- event_child->status_pending_p = 0;
- w = event_child->status_pending;
- }
-
if (step_over_finished)
{
if (!non_stop)
@@ -3706,6 +3694,25 @@ linux_wait_1 (ptid_t ptid,
}
}
+ /* If we're not waiting for a specific LWP, choose an event LWP
+ from among those that have had events. Giving equal priority
+ to all LWPs that have had events helps prevent
+ starvation. */
+ if (ptid_equal (ptid, minus_one_ptid))
+ {
+ event_child->status_pending_p = 1;
+ event_child->status_pending = w;
+
+ select_event_lwp (&event_child);
+
+ /* current_thread and event_child must stay in sync. */
+ current_thread = get_lwp_thread (event_child);
+
+ event_child->status_pending_p = 0;
+ w = event_child->status_pending;
+ }
+
+
/* Stabilize threads (move out of jump pads). */
if (!non_stop)
stabilize_threads ();
Otherwise, the suspend refcount gets it wrong since we're changing the
event_child before calling unsuspend_all_lwps/unstop.
I'm waiting to send this one since it I need the range-stepping to test
it but I hope it's usefull to the WIP here.
next prev parent reply other threads:[~2016-06-20 18:09 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-02 9:31 [PATCH 00/12 V2] Use reinsert breakpoint " Yao Qi
2016-06-02 9:31 ` [PATCH 07/12] Create sub classes of 'struct breakpoint' Yao Qi
2016-06-13 15:09 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 08/12] Refactor clone_all_breakpoints Yao Qi
2016-06-13 15:14 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 09/12] Make reinsert_breakpoint thread specific Yao Qi
[not found] ` <71a5322e-41e3-9e23-df73-e14b14c1d656@redhat.com>
2016-06-14 12:52 ` Yao Qi
2016-06-14 12:57 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 01/12] Switch to current thread in finish_step_over Yao Qi
2016-06-13 14:25 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 06/12] Pass breakpoint type in set_breakpoint_at Yao Qi
2016-06-13 15:07 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 03/12] Step over exit with reinsert breakpoints Yao Qi
2016-06-13 14:37 ` Pedro Alves
2016-06-13 14:52 ` Yao Qi
2016-06-13 15:01 ` Pedro Alves
2016-06-17 9:50 ` Yao Qi
2016-06-02 9:31 ` [PATCH 10/12] Switch current_thread to lwp's thread in install_software_single_step_breakpoints Yao Qi
2016-06-13 15:26 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 05/12] Handle reinsert breakpoints for vforked child Yao Qi
2016-06-13 15:07 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 11/12] Use reinsert_breakpoint for vCont;s Yao Qi
2016-06-13 15:55 ` Pedro Alves
2016-06-14 13:14 ` Yao Qi
2016-06-14 15:48 ` Pedro Alves
2016-06-15 16:41 ` Yao Qi
2016-06-17 15:10 ` Pedro Alves
2016-06-20 18:09 ` Antoine Tremblay [this message]
2016-06-02 9:31 ` [PATCH 02/12] More assert checks on reinsert breakpoint Yao Qi
2016-06-13 14:25 ` Pedro Alves
2016-06-02 9:31 ` [PATCH 04/12] Delete reinsert breakpoints from forked child Yao Qi
2016-06-13 15:02 ` Pedro Alves
2016-06-13 16:53 ` Yao Qi
2016-06-13 17:29 ` Pedro Alves
2016-06-14 11:17 ` Yao Qi
2016-06-14 11:40 ` Pedro Alves
2016-06-17 9:53 ` Yao Qi
2016-06-02 9:31 ` [PATCH 12/12] Support vCont s and S actions with software single step Yao Qi
2016-06-13 15:56 ` 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=wwokk2hjd95w.fsf@ericsson.com \
--to=antoine.tremblay@ericsson.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
--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