Messages in this thread | | | Date | Tue, 07 Aug 2012 11:41:56 +0200 | From | Sebastian Andrzej Siewior <> | Subject | Re: [PATCH 2/2] ptrace: fix set_task_blockstep()->update_debugctlmsr() logic |
| |
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
| |