All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 00/20] signal: refactor some functions
@ 2018-06-01 13:22 Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 01/17] signal: make force_sigsegv() void Christian Brauner
                   ` (16 more replies)
  0 siblings, 17 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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, v2 drops all 3 commits that were pure coding-style
changes. The only other coding-style change is the simplification of
rt_sigaction which seemed to be worth keeping.
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 security_task_kill() return bool
  signal: make get_signal() return bool

 include/linux/sched/signal.h |   2 +-
 include/linux/signal.h       |   4 +-
 kernel/signal.c              | 200 +++++++++++++++++------------------
 3 files changed, 103 insertions(+), 103 deletions(-)

-- 
2.17.0

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v2 01/17] signal: make force_sigsegv() void
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 02/17] signal: make kill_as_cred_perm() return bool Christian Brauner
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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] 28+ messages in thread

* [PATCH v2 02/17] signal: make kill_as_cred_perm() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 01/17] signal: make force_sigsegv() void Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 03/17] signal: make may_ptrace_stop() " Christian Brauner
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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] 28+ messages in thread

* [PATCH v2 03/17] signal: make may_ptrace_stop() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 01/17] signal: make force_sigsegv() void Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 02/17] signal: make kill_as_cred_perm() return bool Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 15:56   ` Oleg Nesterov
  2018-06-01 13:22 ` [PATCH v2 04/17] signal: make do_sigpending() void Christian Brauner
                   ` (13 subsequent siblings)
  16 siblings, 1 reply; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
v1->v2:
* unchanged
v0->v1:
* unchanged
---
 kernel/signal.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/kernel/signal.c b/kernel/signal.c
index 6c71d6b8d2b8..bc750fb4ddcc 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
@@ -1906,11 +1906,11 @@ static inline int may_ptrace_stop(void)
 	 * block in TASK_TRACED. But PTRACE_EVENT_EXIT can be reported
 	 * after SIGKILL was already dequeued.
 	 */
-	if (unlikely(current->mm->core_state) &&
-	    unlikely(current->mm == current->parent->mm))
-		return 0;
+	if (likely(!current->mm->core_state ||
+		   current->mm != current->parent->mm))
+		return false;
 
-	return 1;
+	return true;
 }
 
 /*
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v2 04/17] signal: make do_sigpending() void
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (2 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 03/17] signal: make may_ptrace_stop() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 16:29   ` Oleg Nesterov
  2018-06-01 13:22 ` [PATCH v2 05/17] signal: simplify rt_sigaction() Christian Brauner
                   ` (12 subsequent siblings)
  16 siblings, 1 reply; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 bc750fb4ddcc..7c770556b085 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(&current->sighand->siglock);
 	sigorsets(set, &current->pending.signal,
@@ -2776,7 +2776,6 @@ static int do_sigpending(sigset_t *set)
 
 	/* Outside the lock because only this thread touches it.  */
 	sigandsets(set, &current->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] 28+ messages in thread

* [PATCH v2 05/17] signal: simplify rt_sigaction()
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (3 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 04/17] signal: make do_sigpending() void Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 16:04   ` Oleg Nesterov
  2018-06-01 13:22 ` [PATCH v2 06/17] signal: make kill_ok_by_cred() return bool Christian Brauner
                   ` (11 subsequent siblings)
  16 siblings, 1 reply; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 7c770556b085..00ed69d33282 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] 28+ messages in thread

* [PATCH v2 06/17] signal: make kill_ok_by_cred() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (4 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 05/17] signal: simplify rt_sigaction() Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 07/17] signal: make sig_handler_ignored() " Christian Brauner
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 00ed69d33282..bbd15e984a84 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] 28+ messages in thread

* [PATCH v2 07/17] signal: make sig_handler_ignored() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (5 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 06/17] signal: make kill_ok_by_cred() return bool Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 08/17] signal: make sig_task_ignored() " Christian Brauner
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 bbd15e984a84..62e2586f961e 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] 28+ messages in thread

* [PATCH v2 08/17] signal: make sig_task_ignored() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (6 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 07/17] signal: make sig_handler_ignored() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 09/17] signal: make sig_ignored() " Christian Brauner
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 62e2586f961e..208e99b57e6f 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] 28+ messages in thread

* [PATCH v2 09/17] signal: make sig_ignored() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (7 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 08/17] signal: make sig_task_ignored() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 10/17] signal: make has_pending_signals() " Christian Brauner
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 208e99b57e6f..e48675bd3be8 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] 28+ messages in thread

* [PATCH v2 10/17] signal: make has_pending_signals() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (8 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 09/17] signal: make sig_ignored() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 16:16   ` Oleg Nesterov
  2018-06-01 13:22 ` [PATCH v2 11/17] signal: make recalc_sigpending_tsk() " Christian Brauner
                   ` (6 subsequent siblings)
  16 siblings, 1 reply; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
v1->v2:
* unchanged
v0->v1:
* patch added
---
 kernel/signal.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/kernel/signal.c b/kernel/signal.c
index e48675bd3be8..faf38b46d124 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -110,30 +110,33 @@ 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;
 
 	switch (_NSIG_WORDS) {
 	default:
-		for (i = _NSIG_WORDS, ready = 0; --i >= 0 ;)
-			ready |= signal->sig[i] &~ blocked->sig[i];
+		for (i = _NSIG_WORDS, ready = 0; --i >= 0;)
+			ready |= signal->sig[i] & ~blocked->sig[i];
 		break;
 
-	case 4: ready  = signal->sig[3] &~ blocked->sig[3];
-		ready |= signal->sig[2] &~ blocked->sig[2];
-		ready |= signal->sig[1] &~ blocked->sig[1];
-		ready |= signal->sig[0] &~ blocked->sig[0];
+	case 4:
+		ready = signal->sig[3] & ~blocked->sig[3];
+		ready |= signal->sig[2] & ~blocked->sig[2];
+		ready |= signal->sig[1] & ~blocked->sig[1];
+		ready |= signal->sig[0] & ~blocked->sig[0];
 		break;
 
-	case 2: ready  = signal->sig[1] &~ blocked->sig[1];
-		ready |= signal->sig[0] &~ blocked->sig[0];
+	case 2:
+		ready = signal->sig[1] & ~blocked->sig[1];
+		ready |= signal->sig[0] & ~blocked->sig[0];
 		break;
 
-	case 1: ready  = signal->sig[0] &~ blocked->sig[0];
+	case 1:
+		ready = signal->sig[0] & ~blocked->sig[0];
 	}
-	return ready !=	0;
+	return ready != 0;
 }
 
 #define PENDING(p,b) has_pending_signals(&(p)->signal, (b))
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v2 11/17] signal: make recalc_sigpending_tsk() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (9 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 10/17] signal: make has_pending_signals() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 12/17] signal: make unhandled_signal() " Christian Brauner
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 faf38b46d124..d5a3b1ef775e 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -141,20 +141,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] 28+ messages in thread

* [PATCH v2 12/17] signal: make unhandled_signal() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (10 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 11/17] signal: make recalc_sigpending_tsk() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 13/17] signal: make flush_sigqueue_mask() void Christian Brauner
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
v1->v2:
* unchanged
v0->v1:
* patch added
---
 include/linux/signal.h |  2 +-
 kernel/signal.c        | 11 +++++++----
 2 files changed, 8 insertions(+), 5 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 d5a3b1ef775e..a41af5a7749f 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -508,13 +508,16 @@ 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;
+	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] 28+ messages in thread

* [PATCH v2 13/17] signal: make flush_sigqueue_mask() void
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (11 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 12/17] signal: make unhandled_signal() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 14/17] signal: make wants_signal() return bool Christian Brauner
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 a41af5a7749f..dd32a1ce58e2 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -691,14 +691,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) {
@@ -707,7 +707,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] 28+ messages in thread

* [PATCH v2 14/17] signal: make wants_signal() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (12 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 13/17] signal: make flush_sigqueue_mask() void Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 15/17] signal: make legacy_queue() " Christian Brauner
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 dd32a1ce58e2..8ee3e4a57117 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -883,16 +883,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] 28+ messages in thread

* [PATCH v2 15/17] signal: make legacy_queue() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (13 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 14/17] signal: make wants_signal() return bool Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 16/17] signal: make security_task_kill() " Christian Brauner
  2018-06-01 13:22 ` [PATCH v2 17/17] signal: make get_signal() " Christian Brauner
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 8ee3e4a57117..515fa59a0e9c 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -976,7 +976,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] 28+ messages in thread

* [PATCH v2 16/17] signal: make security_task_kill() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (14 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 15/17] signal: make legacy_queue() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  2018-06-01 16:26   ` Oleg Nesterov
  2018-06-01 13:22 ` [PATCH v2 17/17] signal: make get_signal() " Christian Brauner
  16 siblings, 1 reply; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: ebiederm, gregkh, mingo, james.morris, keescook, peterz, sds,
	viro, akpm, oleg, Christian Brauner

security_task_kill() already behaves like a boolean function. Let's
actually declare it as such too.

Signed-off-by: Christian Brauner <christian@brauner.io>
---
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 515fa59a0e9c..d5f9472a0935 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1922,10 +1922,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] 28+ messages in thread

* [PATCH v2 17/17] signal: make get_signal() return bool
  2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
                   ` (15 preceding siblings ...)
  2018-06-01 13:22 ` [PATCH v2 16/17] signal: make security_task_kill() " Christian Brauner
@ 2018-06-01 13:22 ` Christian Brauner
  16 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 13:22 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>
---
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 d5f9472a0935..be5b85567ca4 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2305,7 +2305,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;
@@ -2315,7 +2315,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] 28+ messages in thread

* Re: [PATCH v2 03/17] signal: make may_ptrace_stop() return bool
  2018-06-01 13:22 ` [PATCH v2 03/17] signal: make may_ptrace_stop() " Christian Brauner
@ 2018-06-01 15:56   ` Oleg Nesterov
  2018-06-01 16:00     ` Christian Brauner
  0 siblings, 1 reply; 28+ messages in thread
From: Oleg Nesterov @ 2018-06-01 15:56 UTC (permalink / raw)
  To: Christian Brauner
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On 06/01, Christian Brauner wrote:
>
> may_ptrace_stop() already behaves like a boolean function. Let's actually
> declare it as such too.

OK. Then probably this patch should only make it return bool and do nothing else?

> -	if (unlikely(current->mm->core_state) &&
> -	    unlikely(current->mm == current->parent->mm))
> -		return 0;
> +	if (likely(!current->mm->core_state ||
> +		   current->mm != current->parent->mm))
> +		return false;

this is wrong.

Oleg.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 03/17] signal: make may_ptrace_stop() return bool
  2018-06-01 15:56   ` Oleg Nesterov
@ 2018-06-01 16:00     ` Christian Brauner
  0 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 16:00 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On Fri, Jun 01, 2018 at 05:56:12PM +0200, Oleg Nesterov wrote:
> On 06/01, Christian Brauner wrote:
> >
> > may_ptrace_stop() already behaves like a boolean function. Let's actually
> > declare it as such too.
> 
> OK. Then probably this patch should only make it return bool and do nothing else?
> 
> > -	if (unlikely(current->mm->core_state) &&
> > -	    unlikely(current->mm == current->parent->mm))
> > -		return 0;
> > +	if (likely(!current->mm->core_state ||
> > +		   current->mm != current->parent->mm))
> > +		return false;
> 
> this is wrong.

This was a suggestion by Al. I just took it over and may have messed it
up while doing so. I'll remove this.

Christian

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 05/17] signal: simplify rt_sigaction()
  2018-06-01 13:22 ` [PATCH v2 05/17] signal: simplify rt_sigaction() Christian Brauner
@ 2018-06-01 16:04   ` Oleg Nesterov
  0 siblings, 0 replies; 28+ messages in thread
From: Oleg Nesterov @ 2018-06-01 16:04 UTC (permalink / raw)
  To: Christian Brauner
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On 06/01, Christian Brauner wrote:
>
> The goto is not needed and does not add any clarity. Simply return -EINVAL
> on unexpected sigset_t struct size directly.

Agreed, sys_rt_sigaction() looks just ugly and mixes goto/return on failure,

ACK

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 10/17] signal: make has_pending_signals() return bool
  2018-06-01 13:22 ` [PATCH v2 10/17] signal: make has_pending_signals() " Christian Brauner
@ 2018-06-01 16:16   ` Oleg Nesterov
  2018-06-01 17:45     ` Christian Brauner
  0 siblings, 1 reply; 28+ messages in thread
From: Oleg Nesterov @ 2018-06-01 16:16 UTC (permalink / raw)
  To: Christian Brauner
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On 06/01, Christian Brauner wrote:
>
> has_pending_signals() already behaves like a boolean function. Let's
> actually declare it as such too.

But this patch does more.

> -	case 4: ready  = signal->sig[3] &~ blocked->sig[3];
> -		ready |= signal->sig[2] &~ blocked->sig[2];
> -		ready |= signal->sig[1] &~ blocked->sig[1];
> -		ready |= signal->sig[0] &~ blocked->sig[0];
> +	case 4:
> +		ready = signal->sig[3] & ~blocked->sig[3];
> +		ready |= signal->sig[2] & ~blocked->sig[2];
> +		ready |= signal->sig[1] & ~blocked->sig[1];
> +		ready |= signal->sig[0] & ~blocked->sig[0];
>  		break;

Again, personally I do not care at all. But why do you think the code looks
better after re-formatting? This is subjective, but to me it does not.

In particular, note the extra space before "=" removed by this patch. I guess
it was added on purpose, and to me

	ready  = signal->sig[3] &~ blocked->sig[3];
	ready |= signal->sig[2] &~ blocked->sig[2];

actually looks better thab

	ready = signal->sig[3] &~ blocked->sig[3];
	ready |= signal->sig[2] &~ blocked->sig[2];

after your patch.

Oleg.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 16/17] signal: make security_task_kill() return bool
  2018-06-01 13:22 ` [PATCH v2 16/17] signal: make security_task_kill() " Christian Brauner
@ 2018-06-01 16:26   ` Oleg Nesterov
  2018-06-01 17:45     ` Christian Brauner
  2018-06-02  9:31     ` Christian Brauner
  0 siblings, 2 replies; 28+ messages in thread
From: Oleg Nesterov @ 2018-06-01 16:26 UTC (permalink / raw)
  To: Christian Brauner
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On 06/01, Christian Brauner wrote:
>
> security_task_kill() already behaves like a boolean function. Let's
> actually declare it as such too.

The subject/changelog is wrong, this patch changes sigkill_pending()

> Signed-off-by: Christian Brauner <christian@brauner.io>
> ---
> 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 515fa59a0e9c..d5f9472a0935 100644
> --- a/kernel/signal.c
> +++ b/kernel/signal.c
> @@ -1922,10 +1922,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	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 04/17] signal: make do_sigpending() void
  2018-06-01 13:22 ` [PATCH v2 04/17] signal: make do_sigpending() void Christian Brauner
@ 2018-06-01 16:29   ` Oleg Nesterov
  0 siblings, 0 replies; 28+ messages in thread
From: Oleg Nesterov @ 2018-06-01 16:29 UTC (permalink / raw)
  To: Christian Brauner
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On 06/01, Christian Brauner wrote:
>
> 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.

Agreed, ACK

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 16/17] signal: make security_task_kill() return bool
  2018-06-01 16:26   ` Oleg Nesterov
@ 2018-06-01 17:45     ` Christian Brauner
  2018-06-02  9:31     ` Christian Brauner
  1 sibling, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 17:45 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On Fri, Jun 01, 2018 at 06:26:25PM +0200, Oleg Nesterov wrote:
> On 06/01, Christian Brauner wrote:
> >
> > security_task_kill() already behaves like a boolean function. Let's
> > actually declare it as such too.
> 
> The subject/changelog is wrong, this patch changes sigkill_pending()

I'll add a note in the commit message that superfuous whitespace is
removed too.

Thanks!
Christian

> 
> > Signed-off-by: Christian Brauner <christian@brauner.io>
> > ---
> > 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 515fa59a0e9c..d5f9472a0935 100644
> > --- a/kernel/signal.c
> > +++ b/kernel/signal.c
> > @@ -1922,10 +1922,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	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 10/17] signal: make has_pending_signals() return bool
  2018-06-01 16:16   ` Oleg Nesterov
@ 2018-06-01 17:45     ` Christian Brauner
  0 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-01 17:45 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On Fri, Jun 01, 2018 at 06:16:58PM +0200, Oleg Nesterov wrote:
> On 06/01, Christian Brauner wrote:
> >
> > has_pending_signals() already behaves like a boolean function. Let's
> > actually declare it as such too.
> 
> But this patch does more.
> 
> > -	case 4: ready  = signal->sig[3] &~ blocked->sig[3];
> > -		ready |= signal->sig[2] &~ blocked->sig[2];
> > -		ready |= signal->sig[1] &~ blocked->sig[1];
> > -		ready |= signal->sig[0] &~ blocked->sig[0];
> > +	case 4:
> > +		ready = signal->sig[3] & ~blocked->sig[3];
> > +		ready |= signal->sig[2] & ~blocked->sig[2];
> > +		ready |= signal->sig[1] & ~blocked->sig[1];
> > +		ready |= signal->sig[0] & ~blocked->sig[0];
> >  		break;
> 
> Again, personally I do not care at all. But why do you think the code looks
> better after re-formatting? This is subjective, but to me it does not.
> 
> In particular, note the extra space before "=" removed by this patch. I guess
> it was added on purpose, and to me
> 
> 	ready  = signal->sig[3] &~ blocked->sig[3];
> 	ready |= signal->sig[2] &~ blocked->sig[2];
> 
> actually looks better thab
> 
> 	ready = signal->sig[3] &~ blocked->sig[3];
> 	ready |= signal->sig[2] &~ blocked->sig[2];
> 
> after your patch.

I can drop the changes in v3.

Thanks!
Christian

> 
> Oleg.
> 

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v2 16/17] signal: make security_task_kill() return bool
  2018-06-01 16:26   ` Oleg Nesterov
  2018-06-01 17:45     ` Christian Brauner
@ 2018-06-02  9:31     ` Christian Brauner
  1 sibling, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-06-02  9:31 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: linux-kernel, ebiederm, gregkh, mingo, james.morris, keescook,
	peterz, sds, viro, akpm

On Fri, Jun 01, 2018 at 06:26:25PM +0200, Oleg Nesterov wrote:
> On 06/01, Christian Brauner wrote:
> >
> > security_task_kill() already behaves like a boolean function. Let's
> > actually declare it as such too.
> 
> The subject/changelog is wrong, this patch changes sigkill_pending()

Ah yes, s/security_task_kill()/sigkill_pending()

Thanks!
Christian

> 
> > Signed-off-by: Christian Brauner <christian@brauner.io>
> > ---
> > 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 515fa59a0e9c..d5f9472a0935 100644
> > --- a/kernel/signal.c
> > +++ b/kernel/signal.c
> > @@ -1922,10 +1922,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	[flat|nested] 28+ messages in thread

* [PATCH v1 00/20] signal: refactor some functions
@ 2018-05-28 21:53 Christian Brauner
  0 siblings, 0 replies; 28+ messages in thread
From: Christian Brauner @ 2018-05-28 21:53 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.
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 (20):
  signal: make force_sigsegv() void
  signal: make kill_as_cred_perm() return bool
  signal: make may_ptrace_stop() return bool
  signal: add copy_pending() helper
  signal: flatten do_send_sig_info()
  signal: drop else branch in do_signal_stop()
  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 security_task_kill() return bool
  signal: make get_signal() return bool

 include/linux/sched/signal.h |   2 +-
 include/linux/signal.h       |   4 +-
 kernel/signal.c              | 269 ++++++++++++++++++-----------------
 3 files changed, 140 insertions(+), 135 deletions(-)

-- 
2.17.0

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2018-06-02  9:32 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-01 13:22 [PATCH v1 00/20] signal: refactor some functions Christian Brauner
2018-06-01 13:22 ` [PATCH v2 01/17] signal: make force_sigsegv() void Christian Brauner
2018-06-01 13:22 ` [PATCH v2 02/17] signal: make kill_as_cred_perm() return bool Christian Brauner
2018-06-01 13:22 ` [PATCH v2 03/17] signal: make may_ptrace_stop() " Christian Brauner
2018-06-01 15:56   ` Oleg Nesterov
2018-06-01 16:00     ` Christian Brauner
2018-06-01 13:22 ` [PATCH v2 04/17] signal: make do_sigpending() void Christian Brauner
2018-06-01 16:29   ` Oleg Nesterov
2018-06-01 13:22 ` [PATCH v2 05/17] signal: simplify rt_sigaction() Christian Brauner
2018-06-01 16:04   ` Oleg Nesterov
2018-06-01 13:22 ` [PATCH v2 06/17] signal: make kill_ok_by_cred() return bool Christian Brauner
2018-06-01 13:22 ` [PATCH v2 07/17] signal: make sig_handler_ignored() " Christian Brauner
2018-06-01 13:22 ` [PATCH v2 08/17] signal: make sig_task_ignored() " Christian Brauner
2018-06-01 13:22 ` [PATCH v2 09/17] signal: make sig_ignored() " Christian Brauner
2018-06-01 13:22 ` [PATCH v2 10/17] signal: make has_pending_signals() " Christian Brauner
2018-06-01 16:16   ` Oleg Nesterov
2018-06-01 17:45     ` Christian Brauner
2018-06-01 13:22 ` [PATCH v2 11/17] signal: make recalc_sigpending_tsk() " Christian Brauner
2018-06-01 13:22 ` [PATCH v2 12/17] signal: make unhandled_signal() " Christian Brauner
2018-06-01 13:22 ` [PATCH v2 13/17] signal: make flush_sigqueue_mask() void Christian Brauner
2018-06-01 13:22 ` [PATCH v2 14/17] signal: make wants_signal() return bool Christian Brauner
2018-06-01 13:22 ` [PATCH v2 15/17] signal: make legacy_queue() " Christian Brauner
2018-06-01 13:22 ` [PATCH v2 16/17] signal: make security_task_kill() " Christian Brauner
2018-06-01 16:26   ` Oleg Nesterov
2018-06-01 17:45     ` Christian Brauner
2018-06-02  9:31     ` Christian Brauner
2018-06-01 13:22 ` [PATCH v2 17/17] signal: make get_signal() " Christian Brauner
  -- strict thread matches above, loose matches on Subject: below --
2018-05-28 21:53 [PATCH v1 00/20] signal: refactor some functions 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.