Messages in this thread | | | Date | Fri, 3 Aug 2012 19:38:30 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH 2/2] ptrace: fix set_task_blockstep()->update_debugctlmsr() logic |
| |
On 08/03, Sebastian Andrzej Siewior wrote: > > On 08/03/2012 06:29 PM, Oleg Nesterov wrote: >> diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c >> index afa60db..636402e 100644 >> --- 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(); > > wouldn't preempt_disable() be enough?
preempt_disable() can't help if interrupt handler changes other bits in between?
Oleg.
| |