On 08/03/2012 06:29 PM, Oleg Nesterov wrote:
--- a/arch/x86/kernel/step.c +++ b/arch/x86/kernel/step.c @@ -166,12 +166,18 @@ static void set_task_blockstep(struct task_struct *task, bool on) else clear_tsk_thread_flag(task, TIF_BLOCKSTEP);+ if (task != current) + return; + + /* ensure irq/preemption can't change debugctl in between */ + local_irq_disable(); debugctl = get_debugctlmsr(); if (on) debugctl |= DEBUGCTLMSR_BTF; else debugctl&= ~DEBUGCTLMSR_BTF; update_debugctlmsr(debugctl); + local_irq_enable(); }
I would say that you can remove this chunk. For task != current we leave. For uprobes we never set the bit, we only need it cleared. We get here via int 3 and do_debug() already clears TIF_BLOCKSTEP because the CPU clears the bit in CPU. So both, TIF_BLOCKSTEP and DEBUGCTLMSR_BTF are never set. Sebastian -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

