diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 20 | 
1 files changed, 6 insertions, 14 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 0af8868525d..5ffb5626e07 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -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. @@ -1930,13 +1930,6 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)  	}  	/* -	 * 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  	 * any signal-sending on another CPU that wants to examine it. @@ -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  |