It turns out, original code is even more buggy than I thought.
Ironically, "task != current" case is more difficult and so far
I do not see how we can handle this case correctly. I'll return
to this a bit later, currently I am working on other patches.
For uprobes we never set the bit, we only need it cleared.
Yes, at least at first step, and probably we will never need more.
We get here
via int 3 and do_debug() already clears TIF_BLOCKSTEP
No, we get here via do_int3(), TIF_BLOCKSTEP is not cleared,
because the
CPU clears the bit in CPU.
I am not sure. The manual says:
If the BTF flag is set when the processor generates a debug
exception, the processor clears the BTF flag along with the
TF flag.
but I am not sure "debug exception" also means "breakpoint exception".
do_debug() does clear TIF_BLOCKSTEP, and "The processor cleared BTF"
is true in this case. But it is called after single-step.
Oleg.