|
@@ -1908,7 +1908,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
|
|
|
preempt_disable();
|
|
|
read_unlock(&tasklist_lock);
|
|
|
preempt_enable_no_resched();
|
|
|
- schedule();
|
|
|
+ freezable_schedule();
|
|
|
} else {
|
|
|
/*
|
|
|
* By the time we got the lock, our tracer went away.
|
|
@@ -1929,13 +1929,6 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
|
|
|
read_unlock(&tasklist_lock);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * While in TASK_TRACED, we were considered "frozen enough".
|
|
|
- * Now that we woke up, it's crucial if we're supposed to be
|
|
|
- * frozen that we freeze now before running anything substantial.
|
|
|
- */
|
|
|
- try_to_freeze();
|
|
|
-
|
|
|
/*
|
|
|
* We are back. Now reacquire the siglock before touching
|
|
|
* last_siginfo, so that we are sure to have synchronized with
|
|
@@ -2092,7 +2085,7 @@ static bool do_signal_stop(int signr)
|
|
|
}
|
|
|
|
|
|
/* Now we don't run again until woken by SIGCONT or SIGKILL */
|
|
|
- schedule();
|
|
|
+ freezable_schedule();
|
|
|
return true;
|
|
|
} else {
|
|
|
/*
|
|
@@ -2200,15 +2193,14 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
|
|
|
if (unlikely(uprobe_deny_signal()))
|
|
|
return 0;
|
|
|
|
|
|
-relock:
|
|
|
/*
|
|
|
- * We'll jump back here after any time we were stopped in TASK_STOPPED.
|
|
|
- * While in TASK_STOPPED, we were considered "frozen enough".
|
|
|
- * Now that we woke up, it's crucial if we're supposed to be
|
|
|
- * frozen that we freeze now before running anything substantial.
|
|
|
+ * Do this once, we can't return to user-mode if freezing() == T.
|
|
|
+ * do_signal_stop() and ptrace_stop() do freezable_schedule() and
|
|
|
+ * thus do not need another check after return.
|
|
|
*/
|
|
|
try_to_freeze();
|
|
|
|
|
|
+relock:
|
|
|
spin_lock_irq(&sighand->siglock);
|
|
|
/*
|
|
|
* Every stopped thread goes here after wakeup. Check to see if
|