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.

Reply via email to