Merge branch 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc
Pull arch signal handling cleanup from Richard Weinberger: "This patch series moves all remaining archs to the get_signal(), signal_setup_done() and sigsp() functions. Currently these archs use open coded variants of the said functions. Further, unused parameters get removed from get_signal_to_deliver(), tracehook_signal_handler() and signal_delivered(). At the end of the day we save around 500 lines of code." * 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc: (43 commits) powerpc: Use sigsp() openrisc: Use sigsp() mn10300: Use sigsp() mips: Use sigsp() microblaze: Use sigsp() metag: Use sigsp() m68k: Use sigsp() m32r: Use sigsp() hexagon: Use sigsp() frv: Use sigsp() cris: Use sigsp() c6x: Use sigsp() blackfin: Use sigsp() avr32: Use sigsp() arm64: Use sigsp() arc: Use sigsp() sas_ss_flags: Remove nested ternary if Rip out get_signal_to_deliver() Clean up signal_delivered() tracehook_signal_handler: Remove sig, info, ka and regs ...
This commit is contained in:
@@ -2170,8 +2170,7 @@ static int ptrace_signal(int signr, siginfo_t *info)
|
||||
return signr;
|
||||
}
|
||||
|
||||
int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
|
||||
struct pt_regs *regs, void *cookie)
|
||||
int get_signal(struct ksignal *ksig)
|
||||
{
|
||||
struct sighand_struct *sighand = current->sighand;
|
||||
struct signal_struct *signal = current->signal;
|
||||
@@ -2241,13 +2240,13 @@ relock:
|
||||
goto relock;
|
||||
}
|
||||
|
||||
signr = dequeue_signal(current, ¤t->blocked, info);
|
||||
signr = dequeue_signal(current, ¤t->blocked, &ksig->info);
|
||||
|
||||
if (!signr)
|
||||
break; /* will return 0 */
|
||||
|
||||
if (unlikely(current->ptrace) && signr != SIGKILL) {
|
||||
signr = ptrace_signal(signr, info);
|
||||
signr = ptrace_signal(signr, &ksig->info);
|
||||
if (!signr)
|
||||
continue;
|
||||
}
|
||||
@@ -2255,13 +2254,13 @@ relock:
|
||||
ka = &sighand->action[signr-1];
|
||||
|
||||
/* Trace actually delivered signals. */
|
||||
trace_signal_deliver(signr, info, ka);
|
||||
trace_signal_deliver(signr, &ksig->info, ka);
|
||||
|
||||
if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */
|
||||
continue;
|
||||
if (ka->sa.sa_handler != SIG_DFL) {
|
||||
/* Run the handler. */
|
||||
*return_ka = *ka;
|
||||
ksig->ka = *ka;
|
||||
|
||||
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
@@ -2311,7 +2310,7 @@ relock:
|
||||
spin_lock_irq(&sighand->siglock);
|
||||
}
|
||||
|
||||
if (likely(do_signal_stop(info->si_signo))) {
|
||||
if (likely(do_signal_stop(ksig->info.si_signo))) {
|
||||
/* It released the siglock. */
|
||||
goto relock;
|
||||
}
|
||||
@@ -2332,7 +2331,7 @@ relock:
|
||||
|
||||
if (sig_kernel_coredump(signr)) {
|
||||
if (print_fatal_signals)
|
||||
print_fatal_signal(info->si_signo);
|
||||
print_fatal_signal(ksig->info.si_signo);
|
||||
proc_coredump_connector(current);
|
||||
/*
|
||||
* If it was able to dump core, this kills all
|
||||
@@ -2342,34 +2341,32 @@ relock:
|
||||
* first and our do_group_exit call below will use
|
||||
* that value and ignore the one we pass it.
|
||||
*/
|
||||
do_coredump(info);
|
||||
do_coredump(&ksig->info);
|
||||
}
|
||||
|
||||
/*
|
||||
* Death signals, no core dump.
|
||||
*/
|
||||
do_group_exit(info->si_signo);
|
||||
do_group_exit(ksig->info.si_signo);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
spin_unlock_irq(&sighand->siglock);
|
||||
return signr;
|
||||
|
||||
ksig->sig = signr;
|
||||
return ksig->sig > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* signal_delivered -
|
||||
* @sig: number of signal being delivered
|
||||
* @info: siginfo_t of signal being delivered
|
||||
* @ka: sigaction setting that chose the handler
|
||||
* @regs: user register state
|
||||
* @ksig: kernel signal struct
|
||||
* @stepping: nonzero if debugger single-step or block-step in use
|
||||
*
|
||||
* This function should be called when a signal has successfully been
|
||||
* delivered. It updates the blocked signals accordingly (@ka->sa.sa_mask
|
||||
* delivered. It updates the blocked signals accordingly (@ksig->ka.sa.sa_mask
|
||||
* is always blocked, and the signal itself is blocked unless %SA_NODEFER
|
||||
* is set in @ka->sa.sa_flags. Tracing is notified.
|
||||
* is set in @ksig->ka.sa.sa_flags. Tracing is notified.
|
||||
*/
|
||||
void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka,
|
||||
struct pt_regs *regs, int stepping)
|
||||
static void signal_delivered(struct ksignal *ksig, int stepping)
|
||||
{
|
||||
sigset_t blocked;
|
||||
|
||||
@@ -2379,11 +2376,11 @@ void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka,
|
||||
simply clear the restore sigmask flag. */
|
||||
clear_restore_sigmask();
|
||||
|
||||
sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(&blocked, sig);
|
||||
sigorsets(&blocked, ¤t->blocked, &ksig->ka.sa.sa_mask);
|
||||
if (!(ksig->ka.sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(&blocked, ksig->sig);
|
||||
set_current_blocked(&blocked);
|
||||
tracehook_signal_handler(sig, info, ka, regs, stepping);
|
||||
tracehook_signal_handler(stepping);
|
||||
}
|
||||
|
||||
void signal_setup_done(int failed, struct ksignal *ksig, int stepping)
|
||||
@@ -2391,8 +2388,7 @@ void signal_setup_done(int failed, struct ksignal *ksig, int stepping)
|
||||
if (failed)
|
||||
force_sigsegv(ksig->sig, current);
|
||||
else
|
||||
signal_delivered(ksig->sig, &ksig->info, &ksig->ka,
|
||||
signal_pt_regs(), stepping);
|
||||
signal_delivered(ksig, stepping);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user