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/

Reply via email to