3.16.66-rc1 review patch.  If anyone has any objections, please let me know.

------------------

From: Richard Weinberger <rich...@nod.at>

commit 828b1f65d23cf8a68795739f6dd08fc8abd9ee64 upstream.

Now we can turn get_signal() to the main function.

Signed-off-by: Richard Weinberger <rich...@nod.at>
[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
 "signal: Always notice exiting tasks"]
Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 include/linux/signal.h | 14 +-------------
 kernel/signal.c        | 23 ++++++++++++-----------
 2 files changed, 13 insertions(+), 24 deletions(-)

--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -279,7 +279,7 @@ struct ksignal {
        int sig;
 };
 
-extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction 
*return_ka, struct pt_regs *regs, void *cookie);
+extern int get_signal(struct ksignal *ksig);
 extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
 extern void exit_signals(struct task_struct *tsk);
 extern void kernel_sigaction(int, __sighandler_t);
@@ -299,18 +299,6 @@ static inline void disallow_signal(int s
        kernel_sigaction(sig, SIG_IGN);
 }
 
-/*
- * Eventually that'll replace get_signal_to_deliver(); macro for now,
- * to avoid nastiness with include order.
- */
-#define get_signal(ksig)                                       \
-({                                                             \
-       struct ksignal *p = (ksig);                             \
-       p->sig = get_signal_to_deliver(&p->info, &p->ka,        \
-                                       signal_pt_regs(), NULL);\
-       p->sig > 0;                                             \
-})
-
 extern struct kmem_cache *sighand_cachep;
 
 int unhandled_signal(struct task_struct *tsk, int sig);
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2174,8 +2174,7 @@ static int ptrace_signal(int signr, sigi
        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;
@@ -2245,13 +2244,13 @@ relock:
                        goto relock;
                }
 
-               signr = dequeue_signal(current, &current->blocked, info);
+               signr = dequeue_signal(current, &current->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;
                }
@@ -2259,13 +2258,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;
@@ -2315,7 +2314,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;
                        }
@@ -2336,7 +2335,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
@@ -2346,17 +2345,19 @@ 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;
 }
 
 /**

Reply via email to