Q: utrace_stop() && notification
Oleg Nesterov
oleg at redhat.com
Wed Jul 22 18:03:51 UTC 2009
On 07/21, Roland McGrath wrote:
>
> > So, if we do not want to add the special (and not-a-report) hooks
> > into engine->ops, then perhaps it makes sense to do
> [...]
>
> That is exactly the kludge
I fully agree with the "kludge" above.
> > So, perhaps we can just add engine->ops->notify_stopped() (or even [...]
>
> My main point was that we should look for an entirely different way to
> attack the problem. If I thought this hook would only be used for
> ptrace, it might be fine. (OTOH then it's not all that much better than
> the terrible ptrace-only kludge.) But AFAICT we'd likely wind up with
> every other new utrace module that cares about doing synchronization
> with debugger threads needing to use this hook too. That's why I want
> to talk about the general case in the utrace API, and not just ptrace.
Yes sure. That is why I tried to talk about utrace notifications
"in general", not only about ptrace case.
> Let's ignore SIGCHLD for a moment, and just think about ptrace's
> report_* waking up wait. That is like what we expect will be the
> general case of this: a debugger thread wants to sleep somehow and have
> its report_* callbacks say "wake the debugger so it can examine me".
>
> So, how does the utrace module writer build that? You'd probably use
> wait_event() et al in your debugger thread, and wake_up() in report_*
> callbacks.
OK.
> (That's approximately what you have in ptrace+wait.)
Hmm. Except in this case ptracer can be running. It is not placed
on any wqh, but still needs a notification.
> So how much is satisfied with a "delayed wake-up" (rather than an
> open-ended hook). Let's say:
>
> utrace_wake_up(task, engine, wqh); // replaces wake_up(wqh);
> return UTRACE_STOP; // | UTRACE_SIGNAL_IGN|UTRACE_SIGNAL_HOLD
>
> That would mean, approximately, as if wake_up(wqh) and then the wakee
> had called utrace_barrier(task,engine), but without the sched flutter.
>
> Formally, I think the guarantee should be "when utrace_barrier would
> return for you". Technically this means that if your callback did not
> use UTRACE_STOP, it's just sometime after your callback returns. But if
> you did use UTRACE_STOP, then it means after the task will definitely
> stop.
This looks nice, but
> That's all it means today, but I think we want to strengthen that
> guarantee so that when you have used UTRACE_STOP (either in a callback
> already in progress when you called utrace_barrier, or in a utrace_control
> call before the utrace_barrier call), utrace_barrier doesn't return until
> "utrace_prepare_examine will work", i.e. actually in TASK_TRACED/STOPPED.
this means the meaning of utrace_barrier() should be changed?
> In ptrace, I think this alone might suffice to cover things "cleanly" in
> the utrace API. (That is, clean for utrace. ;-) The ptrace layer could
> use the trick of a custom wake function to implement SIGCHLD
A custom wake function can only be used if the wakee has already called
add_wait_queue(). Wake function belongs to wait_queue_t, not to
wait_queue_head_t.
But this doesn't really matter. I think that using wait_queue_func_t->func()
(or whatever else we use to implement the utrace-delayed-wakeup) to do
ptrace-specific hacks is not better than engine->ops->special_hook().
In essence, this looks like we add another ->ops into engine implicitly.
> without
> needing anything but utrace_wake_up from the utrace layer.
Not sure I understand how to implement this all :(
Oleg.
More information about the utrace-devel
mailing list