On 10/14, Roland McGrath wrote: > > > In short: I no longer understand why utrace->resume can be UTRACE_*STEP > > when the tracee is stopped, and in fact I think this is not right. > > I think we didn't have that originally.
Yes. > The rationale that I remember is > the idea that you should be able to implement a debugger interface feature > like PTRACE_SINGLESTEP without noticeably more overhead than it had in > pre-utrace ptrace. That is, in vanilla ptrace, the tracer thread calls > user_enable_single_step itself and then just lets the tracee resume > directly to user mode. We wanted to avoid always having an additional trip > through tracehook_notify_resume and the utrace reporting loop and then back > through the return-to-user assembly path a second time, between the tracee > waking up and actually going to user mode. Probably, I am not sure. I can't recall the previous discussions. IIRC, the main problem with user_enable_single_step() was: we wanted to move the callsite from tracer to tracee by many reasons. I can't recall if "avoid another reporting loop" was the target, and additional trip through tracehook_notify_resume() is not avoidable anyway. Afaics, this was introduced by 26fefca955cc7c3c83014be2e10b773209d32eea "utrace: sticky resume action". Before that patch the stopped tracee could only "remember" the pending UTRACE_REPORT or UTRACE_INTERRUPT. > Right. Said another way, any time an engine that previously used > UTRACE_*STEP now uses UTRACE_RESUME, we must degrade utrace->resume back to > UTRACE_REPORT at most. Since we don't keep track of which engine it was > that put UTRACE_*STEP into utrace->resume before, we'd have to just always > degrade it any time anybody uses UTRACE_RESUME. Agreed. > That has almost the whole effect of punting utrace->resume back to just a > utrace->report flag. (see below) > But that's how it used to be, and then we changed it. > So it merits digging up our old discussion threads that led to doing that > and see what all we had in mind then. I tried to grep my mail archives and google, but failed to find anything related. _Perhaps_ this was not intended actually. Before the commit above, another problem was fixed by 8ad60bbd4c665a11be179a0bff41483cca3b3560 "utrace_stop: preserve report/interrupt requests across stop/resume", until this one it was possible to lose UTRACE_INTERRUPT request if it "races" with UTRACE_STOP from another engine. So, perhaps cleanup was the main reason for 26fefca9. See also http://www.mail-archive.com/utrace-devel@redhat.com/msg01647.html Oleg.