| .. | .. |
|---|
| 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 | |
|---|