On 08/18, Oleg Nesterov wrote: > > utrace_resume(UTRACE_REPORT) always calls utrace_reset() because > start_callback() obviously can't clear report->spurious when > event == 0. > > Change start_callback() to correctly clear ->spurious in this case.
Correctly????? I am stupid, and this patch is wrong (47c593ee in your tree). > --- kstub/kernel/utrace.c~10_utrace_resume_and_spurious 2010-08-18 > 19:00:50.000000000 +0200 > +++ kstub/kernel/utrace.c 2010-08-18 19:41:05.000000000 +0200 > @@ -1540,7 +1540,7 @@ static const struct utrace_engine_ops *s > if (want & ENGINE_STOP) > report->action = UTRACE_STOP; > > - if (want & event) { > + if (want & (event ?: UTRACE_EVENT(QUIESCE))) { > report->spurious = false; > return ops; > } with this change utrace_resume()->start_callback() returns with utrace->reporting != NULL !!! This obviously breaks utrace_barrier(), it can hang "forever". I noticed this by accident, when I was trying to understand the problems with vCont changes. I'll send the fix tomorrow. Damn, the fix is trivial but I'd like to avoid another ugly check in start_callback(), and I don't think utrace_resume() should clear ->reporting. Oleg.