| From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Date: Wed, 13 Jan 2016 14:09:05 +0100 |
| Subject: ptrace: don't open IRQs in ptrace_freeze_traced() too early |
| |
| In the non-RT case the spin_lock_irq() here disables interrupts as well |
| as raw_spin_lock_irq(). So in the unlock case the interrupts are enabled |
| too early. |
| |
| Reported-by: kernel test robot <ying.huang@linux.intel.com> |
| Cc: stable-rt@vger.kernel.org |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| kernel/ptrace.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/kernel/ptrace.c |
| +++ b/kernel/ptrace.c |
| @@ -128,12 +128,14 @@ static bool ptrace_freeze_traced(struct |
| |
| spin_lock_irq(&task->sighand->siglock); |
| if (task_is_traced(task) && !__fatal_signal_pending(task)) { |
| - raw_spin_lock_irq(&task->pi_lock); |
| + unsigned long flags; |
| + |
| + raw_spin_lock_irqsave(&task->pi_lock, flags); |
| if (task->state & __TASK_TRACED) |
| task->state = __TASK_TRACED; |
| else |
| task->saved_state = __TASK_TRACED; |
| - raw_spin_unlock_irq(&task->pi_lock); |
| + raw_spin_unlock_irqrestore(&task->pi_lock, flags); |
| ret = true; |
| } |
| spin_unlock_irq(&task->sighand->siglock); |