* [PATCH v3 00/17] signal: refactor some functions
@ 2018-06-02 10:36 Christian Brauner
2018-06-02 10:36 ` [PATCH v3 01/17] signal: make force_sigsegv() void Christian Brauner
` (16 more replies)
0 siblings, 17 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
Hey,
This series refactors a bunch of functions in signal.c to simplify parts
of the code.
As requested, v3 drops all 3 commits that were pure coding-style
changes.
The greatest single change is declaring the static do_sigpending()
helper as void which makes it possible to remove a bunch of unnecessary
checks in the syscalls later on.
Thanks!
Christian
Christian Brauner (17):
signal: make force_sigsegv() void
signal: make kill_as_cred_perm() return bool
signal: make may_ptrace_stop() return bool
signal: make do_sigpending() void
signal: simplify rt_sigaction()
signal: make kill_ok_by_cred() return bool
signal: make sig_handler_ignored() return bool
signal: make sig_task_ignored() return bool
signal: make sig_ignored() return bool
signal: make has_pending_signals() return bool
signal: make recalc_sigpending_tsk() return bool
signal: make unhandled_signal() return bool
signal: make flush_sigqueue_mask() void
signal: make wants_signal() return bool
signal: make legacy_queue() return bool
signal: make sigkill_pending() return bool
signal: make get_signal() return bool
include/linux/sched/signal.h | 2 +-
include/linux/signal.h | 4 +-
kernel/signal.c | 170 +++++++++++++++++------------------
3 files changed, 86 insertions(+), 90 deletions(-)
--
2.17.0
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 01/17] signal: make force_sigsegv() void
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 02/17] signal: make kill_as_cred_perm() return bool Christian Brauner
` (15 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
force_sigsegv() returned 0 unconditionally so it doesn't make sense to have
it return at all. In addition, there are no callers that check
force_sigsegv()'s return value.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* unchanged
---
include/linux/sched/signal.h | 2 +-
kernel/signal.c | 7 ++-----
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h
index 113d1ad1ced7..e138ac16c650 100644
--- a/include/linux/sched/signal.h
+++ b/include/linux/sched/signal.h
@@ -314,7 +314,7 @@ int force_sig_pkuerr(void __user *addr, u32 pkey);
int force_sig_ptrace_errno_trap(int errno, void __user *addr);
extern int send_sig_info(int, struct siginfo *, struct task_struct *);
-extern int force_sigsegv(int, struct task_struct *);
+extern void force_sigsegv(int sig, struct task_struct *p);
extern int force_sig_info(int, struct siginfo *, struct task_struct *);
extern int __kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp);
extern int kill_pid_info(int sig, struct siginfo *info, struct pid *pid);
diff --git a/kernel/signal.c b/kernel/signal.c
index 9c33163a6165..c756008d589e 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1468,8 +1468,7 @@ send_sig(int sig, struct task_struct *p, int priv)
return send_sig_info(sig, __si_special(priv), p);
}
-void
-force_sig(int sig, struct task_struct *p)
+void force_sig(int sig, struct task_struct *p)
{
force_sig_info(sig, SEND_SIG_PRIV, p);
}
@@ -1480,8 +1479,7 @@ force_sig(int sig, struct task_struct *p)
* the problem was already a SIGSEGV, we'll want to
* make sure we don't even try to deliver the signal..
*/
-int
-force_sigsegv(int sig, struct task_struct *p)
+void force_sigsegv(int sig, struct task_struct *p)
{
if (sig == SIGSEGV) {
unsigned long flags;
@@ -1490,7 +1488,6 @@ force_sigsegv(int sig, struct task_struct *p)
spin_unlock_irqrestore(&p->sighand->siglock, flags);
}
force_sig(SIGSEGV, p);
- return 0;
}
int force_sig_fault(int sig, int code, void __user *addr
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 02/17] signal: make kill_as_cred_perm() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
2018-06-02 10:36 ` [PATCH v3 01/17] signal: make force_sigsegv() void Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 03/17] signal: make may_ptrace_stop() " Christian Brauner
` (14 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
kill_as_cred_perm() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* simplify to use a single return
---
kernel/signal.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index c756008d589e..6c71d6b8d2b8 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1349,14 +1349,15 @@ static int kill_proc_info(int sig, struct siginfo *info, pid_t pid)
return error;
}
-static int kill_as_cred_perm(const struct cred *cred,
- struct task_struct *target)
+static inline bool kill_as_cred_perm(const struct cred *cred,
+ struct task_struct *target)
{
const struct cred *pcred = __task_cred(target);
- if (!uid_eq(cred->euid, pcred->suid) && !uid_eq(cred->euid, pcred->uid) &&
- !uid_eq(cred->uid, pcred->suid) && !uid_eq(cred->uid, pcred->uid))
- return 0;
- return 1;
+
+ return uid_eq(cred->euid, pcred->suid) ||
+ uid_eq(cred->euid, pcred->uid) ||
+ uid_eq(cred->uid, pcred->suid) ||
+ uid_eq(cred->uid, pcred->uid);
}
/* like kill_pid_info(), but doesn't use uid/euid of "current" */
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 03/17] signal: make may_ptrace_stop() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
2018-06-02 10:36 ` [PATCH v3 01/17] signal: make force_sigsegv() void Christian Brauner
2018-06-02 10:36 ` [PATCH v3 02/17] signal: make kill_as_cred_perm() return bool Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 04/17] signal: make do_sigpending() void Christian Brauner
` (13 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
may_ptrace_stop() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* [Oleg Nestorov] s/likely/unlikely logic
v1->v2:
* unchanged
v0->v1:
* unchanged
---
kernel/signal.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 6c71d6b8d2b8..1848959a3b72 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1889,10 +1889,10 @@ static void do_notify_parent_cldstop(struct task_struct *tsk,
spin_unlock_irqrestore(&sighand->siglock, flags);
}
-static inline int may_ptrace_stop(void)
+static inline bool may_ptrace_stop(void)
{
if (!likely(current->ptrace))
- return 0;
+ return false;
/*
* Are we in the middle of do_coredump?
* If so and our tracer is also part of the coredump stopping
@@ -1908,9 +1908,9 @@ static inline int may_ptrace_stop(void)
*/
if (unlikely(current->mm->core_state) &&
unlikely(current->mm == current->parent->mm))
- return 0;
+ return false;
- return 1;
+ return true;
}
/*
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 04/17] signal: make do_sigpending() void
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (2 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 03/17] signal: make may_ptrace_stop() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 05/17] signal: simplify rt_sigaction() Christian Brauner
` (12 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
do_sigpending() returned 0 unconditionally so it doesn't make sense to have
it return at all. This allows us to simplify a bunch of syscall callers.
Signed-off-by: Christian Brauner <christian@brauner.io>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Acked-by: Oleg Nesterov <oleg@redhat.com>
---
v2->v3:
* added Oleg's Acked-by
v1->v2:
* unchanged
v0->v1:
* unchanged
---
kernel/signal.c | 41 ++++++++++++++++++++---------------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 1848959a3b72..e17ae40ee6bd 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2767,7 +2767,7 @@ COMPAT_SYSCALL_DEFINE4(rt_sigprocmask, int, how, compat_sigset_t __user *, nset,
}
#endif
-static int do_sigpending(sigset_t *set)
+static void do_sigpending(sigset_t *set)
{
spin_lock_irq(¤t->sighand->siglock);
sigorsets(set, ¤t->pending.signal,
@@ -2776,7 +2776,6 @@ static int do_sigpending(sigset_t *set)
/* Outside the lock because only this thread touches it. */
sigandsets(set, ¤t->blocked, set);
- return 0;
}
/**
@@ -2788,15 +2787,16 @@ static int do_sigpending(sigset_t *set)
SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, uset, size_t, sigsetsize)
{
sigset_t set;
- int err;
if (sigsetsize > sizeof(*uset))
return -EINVAL;
- err = do_sigpending(&set);
- if (!err && copy_to_user(uset, &set, sigsetsize))
- err = -EFAULT;
- return err;
+ do_sigpending(&set);
+
+ if (copy_to_user(uset, &set, sigsetsize))
+ return -EFAULT;
+
+ return 0;
}
#ifdef CONFIG_COMPAT
@@ -2804,15 +2804,13 @@ COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset,
compat_size_t, sigsetsize)
{
sigset_t set;
- int err;
if (sigsetsize > sizeof(*uset))
return -EINVAL;
- err = do_sigpending(&set);
- if (!err)
- err = put_compat_sigset(uset, &set, sigsetsize);
- return err;
+ do_sigpending(&set);
+
+ return put_compat_sigset(uset, &set, sigsetsize);
}
#endif
@@ -3647,25 +3645,26 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp)
SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, uset)
{
sigset_t set;
- int err;
if (sizeof(old_sigset_t) > sizeof(*uset))
return -EINVAL;
- err = do_sigpending(&set);
- if (!err && copy_to_user(uset, &set, sizeof(old_sigset_t)))
- err = -EFAULT;
- return err;
+ do_sigpending(&set);
+
+ if (copy_to_user(uset, &set, sizeof(old_sigset_t)))
+ return -EFAULT;
+
+ return 0;
}
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE1(sigpending, compat_old_sigset_t __user *, set32)
{
sigset_t set;
- int err = do_sigpending(&set);
- if (!err)
- err = put_user(set.sig[0], set32);
- return err;
+
+ do_sigpending(&set);
+
+ return put_user(set.sig[0], set32);
}
#endif
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 05/17] signal: simplify rt_sigaction()
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (3 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 04/17] signal: make do_sigpending() void Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 06/17] signal: make kill_ok_by_cred() return bool Christian Brauner
` (11 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
The goto is not needed and does not add any clarity. Simply return -EINVAL
on unexpected sigset_t struct size directly.
Signed-off-by: Christian Brauner <christian@brauner.io>
Acked-by: Oleg Nesterov <oleg@redhat.com>
---
v2->v3:
* added Oleg's Acked-by
v1->v2:
* [Christoph Hellwig] additional cleanups
v0->v1:
* unchanged
---
kernel/signal.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index e17ae40ee6bd..21508900805b 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -3735,25 +3735,23 @@ SYSCALL_DEFINE4(rt_sigaction, int, sig,
size_t, sigsetsize)
{
struct k_sigaction new_sa, old_sa;
- int ret = -EINVAL;
+ int ret;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(sigset_t))
- goto out;
+ return -EINVAL;
- if (act) {
- if (copy_from_user(&new_sa.sa, act, sizeof(new_sa.sa)))
- return -EFAULT;
- }
+ if (act && copy_from_user(&new_sa.sa, act, sizeof(new_sa.sa)))
+ return -EFAULT;
ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
+ if (ret)
+ return ret;
- if (!ret && oact) {
- if (copy_to_user(oact, &old_sa.sa, sizeof(old_sa.sa)))
- return -EFAULT;
- }
-out:
- return ret;
+ if (oact && copy_to_user(oact, &old_sa.sa, sizeof(old_sa.sa)))
+ return -EFAULT;
+
+ return 0;
}
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(rt_sigaction, int, sig,
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 06/17] signal: make kill_ok_by_cred() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (4 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 05/17] signal: simplify rt_sigaction() Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 07/17] signal: make sig_handler_ignored() " Christian Brauner
` (10 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
kill_ok_by_cred() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* unchanged
---
kernel/signal.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 21508900805b..dd239a8d7d2c 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -717,21 +717,16 @@ static inline bool si_fromuser(const struct siginfo *info)
/*
* called with RCU read lock from check_kill_permission()
*/
-static int kill_ok_by_cred(struct task_struct *t)
+static bool kill_ok_by_cred(struct task_struct *t)
{
const struct cred *cred = current_cred();
const struct cred *tcred = __task_cred(t);
- if (uid_eq(cred->euid, tcred->suid) ||
- uid_eq(cred->euid, tcred->uid) ||
- uid_eq(cred->uid, tcred->suid) ||
- uid_eq(cred->uid, tcred->uid))
- return 1;
-
- if (ns_capable(tcred->user_ns, CAP_KILL))
- return 1;
-
- return 0;
+ return uid_eq(cred->euid, tcred->suid) ||
+ uid_eq(cred->euid, tcred->uid) ||
+ uid_eq(cred->uid, tcred->suid) ||
+ uid_eq(cred->uid, tcred->uid) ||
+ ns_capable(tcred->user_ns, CAP_KILL);
}
/*
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 07/17] signal: make sig_handler_ignored() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (5 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 06/17] signal: make kill_ok_by_cred() return bool Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 08/17] signal: make sig_task_ignored() " Christian Brauner
` (9 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
sig_handler_ignored() already behaves like a boolean function. Let's
actually declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index dd239a8d7d2c..13061f388042 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -65,11 +65,11 @@ static void __user *sig_handler(struct task_struct *t, int sig)
return t->sighand->action[sig - 1].sa.sa_handler;
}
-static int sig_handler_ignored(void __user *handler, int sig)
+static inline bool sig_handler_ignored(void __user *handler, int sig)
{
/* Is it explicitly or implicitly ignored? */
return handler == SIG_IGN ||
- (handler == SIG_DFL && sig_kernel_ignore(sig));
+ (handler == SIG_DFL && sig_kernel_ignore(sig));
}
static int sig_task_ignored(struct task_struct *t, int sig, bool force)
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 08/17] signal: make sig_task_ignored() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (6 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 07/17] signal: make sig_handler_ignored() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 09/17] signal: make sig_ignored() " Christian Brauner
` (8 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
sig_task_ignored() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 13061f388042..ff2ea82e376b 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -72,7 +72,7 @@ static inline bool sig_handler_ignored(void __user *handler, int sig)
(handler == SIG_DFL && sig_kernel_ignore(sig));
}
-static int sig_task_ignored(struct task_struct *t, int sig, bool force)
+static bool sig_task_ignored(struct task_struct *t, int sig, bool force)
{
void __user *handler;
@@ -80,7 +80,7 @@ static int sig_task_ignored(struct task_struct *t, int sig, bool force)
if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
handler == SIG_DFL && !(force && sig_kernel_only(sig)))
- return 1;
+ return true;
return sig_handler_ignored(handler, sig);
}
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 09/17] signal: make sig_ignored() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (7 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 08/17] signal: make sig_task_ignored() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 10/17] signal: make has_pending_signals() " Christian Brauner
` (7 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
sig_ignored() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index ff2ea82e376b..fed938c2e273 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -85,7 +85,7 @@ static bool sig_task_ignored(struct task_struct *t, int sig, bool force)
return sig_handler_ignored(handler, sig);
}
-static int sig_ignored(struct task_struct *t, int sig, bool force)
+static bool sig_ignored(struct task_struct *t, int sig, bool force)
{
/*
* Blocked signals are never ignored, since the
@@ -93,7 +93,7 @@ static int sig_ignored(struct task_struct *t, int sig, bool force)
* unblocked.
*/
if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
- return 0;
+ return false;
/*
* Tracers may want to know about even ignored signal unless it
@@ -101,7 +101,7 @@ static int sig_ignored(struct task_struct *t, int sig, bool force)
* by SIGNAL_UNKILLABLE task.
*/
if (t->ptrace && sig != SIGKILL)
- return 0;
+ return false;
return sig_task_ignored(t, sig, force);
}
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 10/17] signal: make has_pending_signals() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (8 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 09/17] signal: make sig_ignored() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 11/17] signal: make recalc_sigpending_tsk() " Christian Brauner
` (6 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
has_pending_signals() already behaves like a boolean function. Let's
actually declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* [Oleg Nestorov] remove other non-functional changes
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index fed938c2e273..c2af9a7f73b3 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -110,7 +110,7 @@ static bool sig_ignored(struct task_struct *t, int sig, bool force)
* Re-calculate pending state from the set of locally pending
* signals, globally pending signals, and blocked signals.
*/
-static inline int has_pending_signals(sigset_t *signal, sigset_t *blocked)
+static inline bool has_pending_signals(sigset_t *signal, sigset_t *blocked)
{
unsigned long ready;
long i;
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 11/17] signal: make recalc_sigpending_tsk() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (9 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 10/17] signal: make has_pending_signals() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 12/17] signal: make unhandled_signal() " Christian Brauner
` (5 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
recalc_sigpending_tsk() already behaves like a boolean function. Let's
actually declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index c2af9a7f73b3..41f9b91db209 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -138,20 +138,21 @@ static inline bool has_pending_signals(sigset_t *signal, sigset_t *blocked)
#define PENDING(p,b) has_pending_signals(&(p)->signal, (b))
-static int recalc_sigpending_tsk(struct task_struct *t)
+static bool recalc_sigpending_tsk(struct task_struct *t)
{
if ((t->jobctl & JOBCTL_PENDING_MASK) ||
PENDING(&t->pending, &t->blocked) ||
PENDING(&t->signal->shared_pending, &t->blocked)) {
set_tsk_thread_flag(t, TIF_SIGPENDING);
- return 1;
+ return true;
}
+
/*
* We must never clear the flag in another thread, or in current
* when it's possible the current syscall is returning -ERESTART*.
* So we don't clear it here, and only callers who know they should do.
*/
- return 0;
+ return false;
}
/*
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 12/17] signal: make unhandled_signal() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (10 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 11/17] signal: make recalc_sigpending_tsk() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 13/17] signal: make flush_sigqueue_mask() void Christian Brauner
` (4 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
unhandled_signal() already behaves like a boolean function. Let's actually
declare it as such too.
All callers treat it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
include/linux/signal.h | 2 +-
kernel/signal.c | 8 +++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/include/linux/signal.h b/include/linux/signal.h
index a9bc7e1b077e..1145d7061ed9 100644
--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -284,7 +284,7 @@ static inline void disallow_signal(int sig)
extern struct kmem_cache *sighand_cachep;
-int unhandled_signal(struct task_struct *tsk, int sig);
+extern bool unhandled_signal(struct task_struct *tsk, int sig);
/*
* In POSIX a signal is sent either to a specific thread (Linux task)
diff --git a/kernel/signal.c b/kernel/signal.c
index 41f9b91db209..70680dd8b588 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -505,13 +505,15 @@ flush_signal_handlers(struct task_struct *t, int force_default)
}
}
-int unhandled_signal(struct task_struct *tsk, int sig)
+bool unhandled_signal(struct task_struct *tsk, int sig)
{
void __user *handler = tsk->sighand->action[sig-1].sa.sa_handler;
if (is_global_init(tsk))
- return 1;
+ return true;
+
if (handler != SIG_IGN && handler != SIG_DFL)
- return 0;
+ return false;
+
/* if ptraced, let the tracer determine */
return !tsk->ptrace;
}
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 13/17] signal: make flush_sigqueue_mask() void
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (11 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 12/17] signal: make unhandled_signal() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 14/17] signal: make wants_signal() return bool Christian Brauner
` (3 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
The return value of flush_sigqueue_mask() is never checked anywhere.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 70680dd8b588..100f2cb29fd8 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -687,14 +687,14 @@ void signal_wake_up_state(struct task_struct *t, unsigned int state)
*
* All callers must be holding the siglock.
*/
-static int flush_sigqueue_mask(sigset_t *mask, struct sigpending *s)
+static void flush_sigqueue_mask(sigset_t *mask, struct sigpending *s)
{
struct sigqueue *q, *n;
sigset_t m;
sigandsets(&m, mask, &s->signal);
if (sigisemptyset(&m))
- return 0;
+ return;
sigandnsets(&s->signal, &s->signal, mask);
list_for_each_entry_safe(q, n, &s->list, list) {
@@ -703,7 +703,6 @@ static int flush_sigqueue_mask(sigset_t *mask, struct sigpending *s)
__sigqueue_free(q);
}
}
- return 1;
}
static inline int is_si_special(const struct siginfo *info)
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 14/17] signal: make wants_signal() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (12 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 13/17] signal: make flush_sigqueue_mask() void Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 15/17] signal: make legacy_queue() " Christian Brauner
` (2 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
wants_signal() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 100f2cb29fd8..3a12d3b25584 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -879,16 +879,20 @@ static bool prepare_signal(int sig, struct task_struct *p, bool force)
* as soon as they're available, so putting the signal on the shared queue
* will be equivalent to sending it to one such thread.
*/
-static inline int wants_signal(int sig, struct task_struct *p)
+static inline bool wants_signal(int sig, struct task_struct *p)
{
if (sigismember(&p->blocked, sig))
- return 0;
+ return false;
+
if (p->flags & PF_EXITING)
- return 0;
+ return false;
+
if (sig == SIGKILL)
- return 1;
+ return true;
+
if (task_is_stopped_or_traced(p))
- return 0;
+ return false;
+
return task_curr(p) || !signal_pending(p);
}
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 15/17] signal: make legacy_queue() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (13 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 14/17] signal: make wants_signal() return bool Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 16/17] signal: make sigkill_pending() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 17/17] signal: make get_signal() " Christian Brauner
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
legacy_queue() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 3a12d3b25584..50255b6a3124 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -972,7 +972,7 @@ static void complete_signal(int sig, struct task_struct *p, int group)
return;
}
-static inline int legacy_queue(struct sigpending *signals, int sig)
+static inline bool legacy_queue(struct sigpending *signals, int sig)
{
return (sig < SIGRTMIN) && sigismember(&signals->signal, sig);
}
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 16/17] signal: make sigkill_pending() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (14 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 15/17] signal: make legacy_queue() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
2018-06-02 10:36 ` [PATCH v3 17/17] signal: make get_signal() " Christian Brauner
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
sigkill_pending() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* [Oleg Nestorov] fix wrong function name in commit message
v1->v2:
* unchanged
v0->v1:
* patch added
---
kernel/signal.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/signal.c b/kernel/signal.c
index 50255b6a3124..8d57a64abe52 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1918,10 +1918,10 @@ static inline bool may_ptrace_stop(void)
* Return non-zero if there is a SIGKILL that should be waking us up.
* Called with the siglock held.
*/
-static int sigkill_pending(struct task_struct *tsk)
+static bool sigkill_pending(struct task_struct *tsk)
{
- return sigismember(&tsk->pending.signal, SIGKILL) ||
- sigismember(&tsk->signal->shared_pending.signal, SIGKILL);
+ return sigismember(&tsk->pending.signal, SIGKILL) ||
+ sigismember(&tsk->signal->shared_pending.signal, SIGKILL);
}
/*
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 17/17] signal: make get_signal() return bool
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
` (15 preceding siblings ...)
2018-06-02 10:36 ` [PATCH v3 16/17] signal: make sigkill_pending() " Christian Brauner
@ 2018-06-02 10:36 ` Christian Brauner
16 siblings, 0 replies; 18+ messages in thread
From: Christian Brauner @ 2018-06-02 10:36 UTC (permalink / raw)
To: linux-kernel
Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
viro, akpm, oleg, Christian Brauner
make get_signal() already behaves like a boolean function. Let's actually
declare it as such too.
Signed-off-by: Christian Brauner <christian@brauner.io>
---
v2->v3:
* unchanged
v1->v2:
* unchanged
v0->v1:
* patch added
---
include/linux/signal.h | 2 +-
kernel/signal.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/linux/signal.h b/include/linux/signal.h
index 1145d7061ed9..97d5ff809716 100644
--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -262,7 +262,7 @@ extern void set_current_blocked(sigset_t *);
extern void __set_current_blocked(const sigset_t *);
extern int show_unhandled_signals;
-extern int get_signal(struct ksignal *ksig);
+extern bool 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);
diff --git a/kernel/signal.c b/kernel/signal.c
index 8d57a64abe52..47d0e3a9b166 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2301,7 +2301,7 @@ static int ptrace_signal(int signr, siginfo_t *info)
return signr;
}
-int get_signal(struct ksignal *ksig)
+bool get_signal(struct ksignal *ksig)
{
struct sighand_struct *sighand = current->sighand;
struct signal_struct *signal = current->signal;
@@ -2311,7 +2311,7 @@ int get_signal(struct ksignal *ksig)
task_work_run();
if (unlikely(uprobe_deny_signal()))
- return 0;
+ return false;
/*
* Do this once, we can't return to user-mode if freezing() == T.
--
2.17.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2018-06-02 10:40 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-02 10:36 [PATCH v3 00/17] signal: refactor some functions Christian Brauner
2018-06-02 10:36 ` [PATCH v3 01/17] signal: make force_sigsegv() void Christian Brauner
2018-06-02 10:36 ` [PATCH v3 02/17] signal: make kill_as_cred_perm() return bool Christian Brauner
2018-06-02 10:36 ` [PATCH v3 03/17] signal: make may_ptrace_stop() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 04/17] signal: make do_sigpending() void Christian Brauner
2018-06-02 10:36 ` [PATCH v3 05/17] signal: simplify rt_sigaction() Christian Brauner
2018-06-02 10:36 ` [PATCH v3 06/17] signal: make kill_ok_by_cred() return bool Christian Brauner
2018-06-02 10:36 ` [PATCH v3 07/17] signal: make sig_handler_ignored() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 08/17] signal: make sig_task_ignored() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 09/17] signal: make sig_ignored() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 10/17] signal: make has_pending_signals() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 11/17] signal: make recalc_sigpending_tsk() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 12/17] signal: make unhandled_signal() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 13/17] signal: make flush_sigqueue_mask() void Christian Brauner
2018-06-02 10:36 ` [PATCH v3 14/17] signal: make wants_signal() return bool Christian Brauner
2018-06-02 10:36 ` [PATCH v3 15/17] signal: make legacy_queue() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 16/17] signal: make sigkill_pending() " Christian Brauner
2018-06-02 10:36 ` [PATCH v3 17/17] signal: make get_signal() " Christian Brauner
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.