.. | .. |
---|
196 | 196 | spin_lock_irq(&task->sighand->siglock); |
---|
197 | 197 | if (task_is_traced(task) && !looks_like_a_spurious_pid(task) && |
---|
198 | 198 | !__fatal_signal_pending(task)) { |
---|
199 | | - unsigned long flags; |
---|
200 | | - |
---|
201 | | - raw_spin_lock_irqsave(&task->pi_lock, flags); |
---|
202 | | - if (task->state & __TASK_TRACED) |
---|
203 | | - task->state = __TASK_TRACED; |
---|
204 | | - else |
---|
205 | | - task->saved_state = __TASK_TRACED; |
---|
206 | | - raw_spin_unlock_irqrestore(&task->pi_lock, flags); |
---|
| 199 | + task->state = __TASK_TRACED; |
---|
207 | 200 | ret = true; |
---|
208 | 201 | } |
---|
209 | 202 | spin_unlock_irq(&task->sighand->siglock); |
---|
.. | .. |
---|
213 | 206 | |
---|
214 | 207 | static void ptrace_unfreeze_traced(struct task_struct *task) |
---|
215 | 208 | { |
---|
216 | | - unsigned long flags; |
---|
217 | | - bool frozen = true; |
---|
| 209 | + if (task->state != __TASK_TRACED) |
---|
| 210 | + return; |
---|
218 | 211 | |
---|
219 | 212 | WARN_ON(!task->ptrace || task->parent != current); |
---|
220 | 213 | |
---|
.. | .. |
---|
223 | 216 | * Recheck state under the lock to close this race. |
---|
224 | 217 | */ |
---|
225 | 218 | spin_lock_irq(&task->sighand->siglock); |
---|
226 | | - |
---|
227 | | - raw_spin_lock_irqsave(&task->pi_lock, flags); |
---|
228 | | - if (task->state == __TASK_TRACED) |
---|
229 | | - task->state = TASK_TRACED; |
---|
230 | | - else if (task->saved_state == __TASK_TRACED) |
---|
231 | | - task->saved_state = TASK_TRACED; |
---|
232 | | - else |
---|
233 | | - frozen = false; |
---|
234 | | - raw_spin_unlock_irqrestore(&task->pi_lock, flags); |
---|
235 | | - |
---|
236 | | - if (frozen && __fatal_signal_pending(task)) |
---|
237 | | - wake_up_state(task, __TASK_TRACED); |
---|
238 | | - |
---|
| 219 | + if (task->state == __TASK_TRACED) { |
---|
| 220 | + if (__fatal_signal_pending(task)) |
---|
| 221 | + wake_up_state(task, __TASK_TRACED); |
---|
| 222 | + else |
---|
| 223 | + task->state = TASK_TRACED; |
---|
| 224 | + } |
---|
239 | 225 | spin_unlock_irq(&task->sighand->siglock); |
---|
240 | 226 | } |
---|
241 | 227 | |
---|