]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
signal: Cleanup flush_sigqueue_mask()
authorThomas Gleixner <tglx@linutronix.de>
Tue, 1 Oct 2024 08:42:02 +0000 (10:42 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 29 Oct 2024 10:43:18 +0000 (11:43 +0100)
Mop up the stale return value comment and add a lockdep check instead of
commenting on the locking requirement.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/all/20241001083835.374933959@linutronix.de
kernel/signal.c

index b65cc1853a093c7c8dcbd2c8c90e75afda0a38d3..f420c430b24a554b8bb02075a3f4df683e3be8a5 100644 (file)
@@ -704,17 +704,14 @@ void signal_wake_up_state(struct task_struct *t, unsigned int state)
                kick_process(t);
 }
 
-/*
- * Remove signals in mask from the pending set and queue.
- * Returns 1 if any signals were found.
- *
- * All callers must be holding the siglock.
- */
-static void flush_sigqueue_mask(sigset_t *mask, struct sigpending *s)
+/* Remove signals in mask from the pending set and queue. */
+static void flush_sigqueue_mask(struct task_struct *p, sigset_t *mask, struct sigpending *s)
 {
        struct sigqueue *q, *n;
        sigset_t m;
 
+       lockdep_assert_held(&p->sighand->siglock);
+
        sigandsets(&m, mask, &s->signal);
        if (sigisemptyset(&m))
                return;
@@ -848,18 +845,18 @@ static bool prepare_signal(int sig, struct task_struct *p, bool force)
                 * This is a stop signal.  Remove SIGCONT from all queues.
                 */
                siginitset(&flush, sigmask(SIGCONT));
-               flush_sigqueue_mask(&flush, &signal->shared_pending);
+               flush_sigqueue_mask(p, &flush, &signal->shared_pending);
                for_each_thread(p, t)
-                       flush_sigqueue_mask(&flush, &t->pending);
+                       flush_sigqueue_mask(p, &flush, &t->pending);
        } else if (sig == SIGCONT) {
                unsigned int why;
                /*
                 * Remove all stop signals from all queues, wake all threads.
                 */
                siginitset(&flush, SIG_KERNEL_STOP_MASK);
-               flush_sigqueue_mask(&flush, &signal->shared_pending);
+               flush_sigqueue_mask(p, &flush, &signal->shared_pending);
                for_each_thread(p, t) {
-                       flush_sigqueue_mask(&flush, &t->pending);
+                       flush_sigqueue_mask(p, &flush, &t->pending);
                        task_clear_jobctl_pending(t, JOBCTL_STOP_PENDING);
                        if (likely(!(t->ptrace & PT_SEIZED))) {
                                t->jobctl &= ~JOBCTL_STOPPED;
@@ -4114,8 +4111,8 @@ void kernel_sigaction(int sig, __sighandler_t action)
                sigemptyset(&mask);
                sigaddset(&mask, sig);
 
-               flush_sigqueue_mask(&mask, &current->signal->shared_pending);
-               flush_sigqueue_mask(&mask, &current->pending);
+               flush_sigqueue_mask(current, &mask, &current->signal->shared_pending);
+               flush_sigqueue_mask(current, &mask, &current->pending);
                recalc_sigpending();
        }
        spin_unlock_irq(&current->sighand->siglock);
@@ -4182,9 +4179,9 @@ int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact)
                if (sig_handler_ignored(sig_handler(p, sig), sig)) {
                        sigemptyset(&mask);
                        sigaddset(&mask, sig);
-                       flush_sigqueue_mask(&mask, &p->signal->shared_pending);
+                       flush_sigqueue_mask(p, &mask, &p->signal->shared_pending);
                        for_each_thread(p, t)
-                               flush_sigqueue_mask(&mask, &t->pending);
+                               flush_sigqueue_mask(p, &mask, &t->pending);
                }
        }