All of lore.kernel.org
 help / color / mirror / Atom feed
* Global do_signal() cleanup
@ 2013-10-08 11:27 Richard Weinberger
  2013-10-08 11:27 ` [PATCH 01/29] arc: Use get_signal() signal_setup_done() Richard Weinberger
                   ` (5 more replies)
  0 siblings, 6 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 11:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, viro, vgupta, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

This patch series moves all remaining archs to the get_signal() and
signal_setup_done() functions. Currently these archs use open coded
variants of the said functions.  Further, unused parameters get removed
from get_signal_to_deliver(), tracehook_signal_handler() and signal_delivered().
After all we save around 350 lines of code. :-)

The following archs are _untested_: arc, c6x, hexagon, metag, score, unicore, sh64.
If someone points me to cross compilers for these arch I'll happily build test them too.

Thanks,
//richard

[PATCH 01/29] arc: Use get_signal() signal_setup_done()
[PATCH 02/29] arm64: Use get_signal() signal_setup_done()
[PATCH 03/29] avr32: Use get_signal() signal_setup_done()
[PATCH 04/29] blackfin: Use get_signal() signal_setup_done()
[PATCH 05/29] c6x: Use get_signal() signal_setup_done()
[PATCH 06/29] cris: Use get_signal() signal_setup_done()
[PATCH 07/29] frv: Use get_signal() signal_setup_done()
[PATCH 08/29] h8300: Use get_signal() signal_setup_done()
[PATCH 09/29] hexagon: Use get_signal() signal_setup_done()
[PATCH 10/29] ia64: Use get_signal() signal_setup_done()
[PATCH 11/29] m32r: Use get_signal() signal_setup_done()
[PATCH 12/29] m68k: Use get_signal() signal_setup_done()
[PATCH 13/29] metag: Use get_signal() signal_setup_done()
[PATCH 14/29] microblaze: Use get_signal() signal_setup_done()
[PATCH 15/29] mips: Use get_signal() signal_setup_done()
[PATCH 16/29] mn10300: Use get_signal() signal_setup_done()
[PATCH 17/29] openrisc: Use get_signal() signal_setup_done()
[PATCH 18/29] parisc: Use get_signal() signal_setup_done()
[PATCH 19/29] powerpc: Use get_signal() signal_setup_done()
[PATCH 20/29] s390: Use get_signal() signal_setup_done()
[PATCH 21/29] score: Use get_signal() signal_setup_done()
[PATCH 22/29] sh: Use get_signal() signal_setup_done()
[PATCH 23/29] tile: Use get_signal() signal_setup_done()
[PATCH 24/29] um: Use get_signal() signal_setup_done()
[PATCH 25/29] unicore32: Use get_signal() signal_setup_done()
[PATCH 26/29] xtensa: Use get_signal() signal_setup_done()
[PATCH 27/29] get_signal_to_deliver: remove regs and cookie args
[PATCH 28/29] tracehook_signal_handler: Remove sig, info, ka and regs
[PATCH 29/29] Clean up signal_delivered()

 arch/arc/kernel/signal.c            |   39 +++++---------
 arch/arm64/include/asm/signal32.h   |    7 +-
 arch/arm64/kernel/signal.c          |   48 +++++++----------
 arch/arm64/kernel/signal32.c        |    8 +-
 arch/avr32/kernel/signal.c          |   43 ++++++---------
 arch/blackfin/kernel/signal.c       |   39 ++++++--------
 arch/c6x/kernel/signal.c            |   43 ++++++---------
 arch/cris/arch-v10/kernel/signal.c  |   79 ++++++++++++----------------
 arch/cris/arch-v32/kernel/signal.c  |   77 ++++++++++------------------
 arch/frv/kernel/signal.c            |   99 ++++++++++++++----------------------
 arch/h8300/kernel/signal.c          |   81 ++++++++++++-----------------
 arch/hexagon/kernel/signal.c        |   45 ++++++----------
 arch/ia64/kernel/signal.c           |   42 ++++++---------
 arch/m32r/kernel/signal.c           |   47 +++++++----------
 arch/m68k/kernel/signal.c           |   63 ++++++++--------------
 arch/metag/kernel/signal.c          |   55 ++++++++------------
 arch/microblaze/kernel/signal.c     |   48 ++++++-----------
 arch/mips/include/asm/abi.h         |   10 +--
 arch/mips/kernel/signal.c           |   66 +++++++++---------------
 arch/mips/kernel/signal32.c         |   39 +++++---------
 arch/mips/kernel/signal_n32.c       |   20 ++-----
 arch/mn10300/kernel/signal.c        |   89 +++++++++++++-------------------
 arch/openrisc/kernel/signal.c       |   53 +++++++------------
 arch/parisc/kernel/signal.c         |   58 ++++++++-------------
 arch/powerpc/kernel/signal.c        |   31 ++++-------
 arch/powerpc/kernel/signal.h        |   12 +---
 arch/powerpc/kernel/signal_32.c     |   38 +++++--------
 arch/powerpc/kernel/signal_64.c     |   27 ++++-----
 arch/s390/kernel/compat_signal.c    |   77 ++++++++++++----------------
 arch/s390/kernel/entry.h            |    4 -
 arch/s390/kernel/signal.c           |   79 +++++++++++-----------------
 arch/score/kernel/signal.c          |   43 ++++++---------
 arch/sh/kernel/signal_32.c          |   79 +++++++++++-----------------
 arch/sh/kernel/signal_64.c          |   82 +++++++++++------------------
 arch/tile/include/asm/compat.h      |    3 -
 arch/tile/kernel/compat_signal.c    |   29 +++++-----
 arch/tile/kernel/signal.c           |   54 ++++++++-----------
 arch/um/include/shared/frame_kern.h |   12 +---
 arch/um/kernel/signal.c             |   27 ++++-----
 arch/unicore32/kernel/signal.c      |   48 +++++++----------
 arch/x86/um/signal.c                |   45 +++++++---------
 arch/xtensa/kernel/signal.c         |   43 +++++----------
 include/linux/signal.h              |    6 --
 include/linux/tracehook.h           |    8 --
 kernel/signal.c                     |   26 +++------
 45 files changed, 804 insertions(+), 1167 deletions(-)


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

* [PATCH 01/29] arc: Use get_signal() signal_setup_done()
  2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
@ 2013-10-08 11:27 ` Richard Weinberger
  2013-10-08 14:13     ` Vineet Gupta
  2013-10-08 11:27 ` [PATCH 02/29] arm64: " Richard Weinberger
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 11:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, viro, vgupta, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj,
	Richard Weinberger

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
 1 file changed, 15 insertions(+), 24 deletions(-)

diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
index 7e95e1a..c2031e2 100644
--- a/arch/arc/kernel/signal.c
+++ b/arch/arc/kernel/signal.c
@@ -179,14 +179,13 @@ static inline int map_sig(int sig)
 }
 
 static int
-setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
-	       sigset_t *set, struct pt_regs *regs)
+setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
 	struct rt_sigframe __user *sf;
 	unsigned int magic = 0;
 	int err = 0;
 
-	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
+	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));
 	if (!sf)
 		return 1;
 
@@ -205,8 +204,8 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
 	 *  #2: struct siginfo
 	 *  #3: struct ucontext (completely populated)
 	 */
-	if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) {
-		err |= copy_siginfo_to_user(&sf->info, info);
+	if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
+		err |= copy_siginfo_to_user(&sf->info, &ksig->info);
 		err |= __put_user(0, &sf->uc.uc_flags);
 		err |= __put_user(NULL, &sf->uc.uc_link);
 		err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
@@ -227,16 +226,16 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
 		return err;
 
 	/* #1 arg to the user Signal handler */
-	regs->r0 = map_sig(signo);
+	regs->r0 = map_sig(ksig->sig);
 
 	/* setup PC of user space signal handler */
-	regs->ret = (unsigned long)ka->sa.sa_handler;
+	regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
 
 	/*
 	 * handler returns using sigreturn stub provided already by userpsace
 	 */
-	BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
-	regs->blink = (unsigned long)ka->sa.sa_restorer;
+	BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER));
+	regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
 
 	/* User Stack for signal handler will be above the frame just carved */
 	regs->sp = (unsigned long)sf;
@@ -298,38 +297,30 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
  * OK, we're invoking a handler
  */
 static void
-handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
-	      struct pt_regs *regs)
+handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
 	sigset_t *oldset = sigmask_to_save();
 	int ret;
 
 	/* Set up the stack frame */
-	ret = setup_rt_frame(sig, ka, info, oldset, regs);
+	ret = setup_rt_frame(ksig, oldset, regs);
 
-	if (ret)
-		force_sigsegv(sig, current);
-	else
-		signal_delivered(sig, info, ka, regs, 0);
+	signal_setup_done(ret, ksig, 0);
 }
 
 void do_signal(struct pt_regs *regs)
 {
-	struct k_sigaction ka;
-	siginfo_t info;
-	int signr;
+	struct ksignal ksig;
 	int restart_scall;
 
-	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-
 	restart_scall = in_syscall(regs) && syscall_restartable(regs);
 
-	if (signr > 0) {
+	if (get_signal(&ksig)) {
 		if (restart_scall) {
-			arc_restart_syscall(&ka, regs);
+			arc_restart_syscall(&ksig.ka, regs);
 			syscall_wont_restart(regs);	/* No more restarts */
 		}
-		handle_signal(signr, &ka, &info, regs);
+		handle_signal(&ksig, regs);
 		return;
 	}
 
-- 
1.8.1.4


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

* [PATCH 02/29] arm64: Use get_signal() signal_setup_done()
  2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
  2013-10-08 11:27 ` [PATCH 01/29] arc: Use get_signal() signal_setup_done() Richard Weinberger
@ 2013-10-08 11:27 ` Richard Weinberger
  2013-10-08 11:27 ` [PATCH 03/29] avr32: " Richard Weinberger
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 11:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, viro, vgupta, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj,
	Richard Weinberger

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 arch/arm64/include/asm/signal32.h |  7 +++---
 arch/arm64/kernel/signal.c        | 48 ++++++++++++++++-----------------------
 arch/arm64/kernel/signal32.c      |  8 +++----
 3 files changed, 27 insertions(+), 36 deletions(-)

diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h
index 7c275e3..db544f1 100644
--- a/arch/arm64/include/asm/signal32.h
+++ b/arch/arm64/include/asm/signal32.h
@@ -26,8 +26,8 @@ extern const compat_ulong_t aarch32_sigret_code[6];
 
 int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
 		       struct pt_regs *regs);
-int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
-			  sigset_t *set, struct pt_regs *regs);
+int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
+			  struct pt_regs *regs);
 
 void compat_setup_restart_syscall(struct pt_regs *regs);
 #else
@@ -38,8 +38,7 @@ static inline int compat_setup_frame(int usid, struct k_sigaction *ka,
 	return -ENOSYS;
 }
 
-static inline int compat_setup_rt_frame(int usig, struct k_sigaction *ka,
-					siginfo_t *info, sigset_t *set,
+static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
 					struct pt_regs *regs)
 {
 	return -ENOSYS;
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index 890a591..f6f23dd 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -239,13 +239,13 @@ static void setup_return(struct pt_regs *regs, struct k_sigaction *ka,
 	regs->regs[30] = (unsigned long)sigtramp;
 }
 
-static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
-			  sigset_t *set, struct pt_regs *regs)
+static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
+			  struct pt_regs *regs)
 {
 	struct rt_sigframe __user *frame;
 	int err = 0;
 
-	frame = get_sigframe(ka, regs);
+	frame = get_sigframe(&ksig->ka, regs);
 	if (!frame)
 		return 1;
 
@@ -255,9 +255,9 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
 	err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
 	err |= setup_sigframe(frame, regs, set);
 	if (err == 0) {
-		setup_return(regs, ka, frame, usig);
-		if (ka->sa.sa_flags & SA_SIGINFO) {
-			err |= copy_siginfo_to_user(&frame->info, info);
+		setup_return(regs, &ksig->ka, frame, usig);
+		if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
+			err |= copy_siginfo_to_user(&frame->info, &ksig->info);
 			regs->regs[1] = (unsigned long)&frame->info;
 			regs->regs[2] = (unsigned long)&frame->uc;
 		}
@@ -277,13 +277,12 @@ static void setup_restart_syscall(struct pt_regs *regs)
 /*
  * OK, we're invoking a handler
  */
-static void handle_signal(unsigned long sig, struct k_sigaction *ka,
-			  siginfo_t *info, struct pt_regs *regs)
+static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
 	struct thread_info *thread = current_thread_info();
 	struct task_struct *tsk = current;
 	sigset_t *oldset = sigmask_to_save();
-	int usig = sig;
+	int usig = ksig->sig;
 	int ret;
 
 	/*
@@ -296,13 +295,12 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
 	 * Set up the stack frame
 	 */
 	if (is_compat_task()) {
-		if (ka->sa.sa_flags & SA_SIGINFO)
-			ret = compat_setup_rt_frame(usig, ka, info, oldset,
-						    regs);
+		if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+			ret = compat_setup_rt_frame(usig, ksig, oldset, regs);
 		else
-			ret = compat_setup_frame(usig, ka, oldset, regs);
+			ret = compat_setup_frame(usig, &ksig->ka, oldset, regs);
 	} else {
-		ret = setup_rt_frame(usig, ka, info, oldset, regs);
+		ret = setup_rt_frame(usig, ksig, oldset, regs);
 	}
 
 	/*
@@ -310,18 +308,14 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
 	 */
 	ret |= !valid_user_regs(&regs->user_regs);
 
-	if (ret != 0) {
-		force_sigsegv(sig, tsk);
-		return;
-	}
-
 	/*
 	 * Fast forward the stepping logic so we step into the signal
 	 * handler.
 	 */
-	user_fastforward_single_step(tsk);
+	if (!ret)
+		user_fastforward_single_step(tsk);
 
-	signal_delivered(sig, info, ka, regs, 0);
+	signal_setup_done(ret, ksig, 0);
 }
 
 /*
@@ -336,10 +330,9 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
 static void do_signal(struct pt_regs *regs)
 {
 	unsigned long continue_addr = 0, restart_addr = 0;
-	struct k_sigaction ka;
-	siginfo_t info;
-	int signr, retval = 0;
+	int retval = 0;
 	int syscall = (int)regs->syscallno;
+	struct ksignal ksig;
 
 	/*
 	 * If we were from a system call, check for system call restarting...
@@ -373,8 +366,7 @@ static void do_signal(struct pt_regs *regs)
 	 * Get the signal to deliver. When running under ptrace, at this point
 	 * the debugger may change all of our registers.
 	 */
-	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-	if (signr > 0) {
+	if (get_signal(&ksig)) {
 		/*
 		 * Depending on the signal settings, we may need to revert the
 		 * decision to restart the system call, but skip this if a
@@ -384,12 +376,12 @@ static void do_signal(struct pt_regs *regs)
 		    (retval == -ERESTARTNOHAND ||
 		     retval == -ERESTART_RESTARTBLOCK ||
 		     (retval == -ERESTARTSYS &&
-		      !(ka.sa.sa_flags & SA_RESTART)))) {
+		      !(ksig.ka.sa.sa_flags & SA_RESTART)))) {
 			regs->regs[0] = -EINTR;
 			regs->pc = continue_addr;
 		}
 
-		handle_signal(signr, &ka, &info, regs);
+		handle_signal(&ksig, regs);
 		return;
 	}
 
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index e393174..a577f88 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -545,18 +545,18 @@ static int compat_setup_sigframe(struct compat_sigframe __user *sf,
 /*
  * 32-bit signal handling routines called from signal.c
  */
-int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
+int compat_setup_rt_frame(int usig, struct ksignal *ksig,
 			  sigset_t *set, struct pt_regs *regs)
 {
 	struct compat_rt_sigframe __user *frame;
 	int err = 0;
 
-	frame = compat_get_sigframe(ka, regs, sizeof(*frame));
+	frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame));
 
 	if (!frame)
 		return 1;
 
-	err |= copy_siginfo_to_user32(&frame->info, info);
+	err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
 
 	__put_user_error(0, &frame->sig.uc.uc_flags, err);
 	__put_user_error(0, &frame->sig.uc.uc_link, err);
@@ -566,7 +566,7 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
 	err |= compat_setup_sigframe(&frame->sig, regs, set);
 
 	if (err == 0) {
-		compat_setup_return(regs, ka, frame->sig.retcode, frame, usig);
+		compat_setup_return(regs, &ksig->ka, frame->sig.retcode, frame, usig);
 		regs->regs[1] = (compat_ulong_t)(unsigned long)&frame->info;
 		regs->regs[2] = (compat_ulong_t)(unsigned long)&frame->sig.uc;
 	}
-- 
1.8.1.4


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

* [PATCH 03/29] avr32: Use get_signal() signal_setup_done()
  2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
  2013-10-08 11:27 ` [PATCH 01/29] arc: Use get_signal() signal_setup_done() Richard Weinberger
  2013-10-08 11:27 ` [PATCH 02/29] arm64: " Richard Weinberger
@ 2013-10-08 11:27 ` Richard Weinberger
  2013-10-08 11:27 ` [PATCH 04/29] blackfin: " Richard Weinberger
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 11:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, viro, vgupta, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj,
	Richard Weinberger

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 arch/avr32/kernel/signal.c | 43 ++++++++++++++++++-------------------------
 1 file changed, 18 insertions(+), 25 deletions(-)

diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c
index b80c0b3..dda150f 100644
--- a/arch/avr32/kernel/signal.c
+++ b/arch/avr32/kernel/signal.c
@@ -138,13 +138,12 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
 }
 
 static int
-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-	       sigset_t *set, struct pt_regs *regs)
+setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
 	struct rt_sigframe __user *frame;
 	int err = 0;
 
-	frame = get_sigframe(ka, regs, sizeof(*frame));
+	frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
 	err = -EFAULT;
 	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
 		goto out;
@@ -164,7 +163,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 	err = __put_user(0x3008d733 | (__NR_rt_sigreturn << 20),
 			 &frame->retcode);
 
-	err |= copy_siginfo_to_user(&frame->info, info);
+	err |= copy_siginfo_to_user(&frame->info, &ksig->info);
 
 	/* Set up the ucontext */
 	err |= __put_user(0, &frame->uc.uc_flags);
@@ -176,12 +175,12 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 	if (err)
 		goto out;
 
-	regs->r12 = sig;
+	regs->r12 = ksig->sig;
 	regs->r11 = (unsigned long) &frame->info;
 	regs->r10 = (unsigned long) &frame->uc;
 	regs->sp = (unsigned long) frame;
-	if (ka->sa.sa_flags & SA_RESTORER)
-		regs->lr = (unsigned long)ka->sa.sa_restorer;
+	if (ksig->ka.sa.sa_flags & SA_RESTORER)
+		regs->lr = (unsigned long)ksig->ka.sa.sa_restorer;
 	else {
 		printk(KERN_NOTICE "[%s:%d] did not set SA_RESTORER\n",
 		       current->comm, current->pid);
@@ -189,10 +188,10 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 	}
 
 	pr_debug("SIG deliver [%s:%d]: sig=%d sp=0x%lx pc=0x%lx->0x%p lr=0x%lx\n",
-		 current->comm, current->pid, sig, regs->sp,
-		 regs->pc, ka->sa.sa_handler, regs->lr);
+		 current->comm, current->pid, ksig->sig, regs->sp,
+		 regs->pc, ksig->ka.sa.sa_handler, regs->lr);
 
-	regs->pc = (unsigned long) ka->sa.sa_handler;
+	regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
 
 out:
 	return err;
@@ -208,15 +207,14 @@ static inline void setup_syscall_restart(struct pt_regs *regs)
 }
 
 static inline void
-handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
-	      struct pt_regs *regs, int syscall)
+handle_signal(struct ksignal *ksig, struct pt_regs *regs, int syscall)
 {
 	int ret;
 
 	/*
 	 * Set up the stack frame
 	 */
-	ret = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs);
+	ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
 
 	/*
 	 * Check that the resulting registers are sane
@@ -226,10 +224,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
 	/*
 	 * Block the signal if we were successful.
 	 */
-	if (ret != 0)
-		force_sigsegv(sig, current);
-	else
-		signal_delivered(sig, info, ka, regs, 0);
+	signal_setup_done(ret, ksig, 0);
 }
 
 /*
@@ -239,9 +234,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
  */
 static void do_signal(struct pt_regs *regs, int syscall)
 {
-	siginfo_t info;
-	int signr;
-	struct k_sigaction ka;
+	struct ksignal ksig;
 
 	/*
 	 * We want the common case to go fast, which is why we may in
@@ -251,18 +244,18 @@ static void do_signal(struct pt_regs *regs, int syscall)
 	if (!user_mode(regs))
 		return;
 
-	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+	get_signal(&ksig);
 	if (syscall) {
 		switch (regs->r12) {
 		case -ERESTART_RESTARTBLOCK:
 		case -ERESTARTNOHAND:
-			if (signr > 0) {
+			if (ksig.sig > 0) {
 				regs->r12 = -EINTR;
 				break;
 			}
 			/* fall through */
 		case -ERESTARTSYS:
-			if (signr > 0 && !(ka.sa.sa_flags & SA_RESTART)) {
+			if (ksig.sig > 0 && !(ksig.ka.sa.sa_flags & SA_RESTART)) {
 				regs->r12 = -EINTR;
 				break;
 			}
@@ -272,13 +265,13 @@ static void do_signal(struct pt_regs *regs, int syscall)
 		}
 	}
 
-	if (signr == 0) {
+	if (!ksig.sig) {
 		/* No signal to deliver -- put the saved sigmask back */
 		restore_saved_sigmask();
 		return;
 	}
 
-	handle_signal(signr, &ka, &info, regs, syscall);
+	handle_signal(&ksig, regs, syscall);
 }
 
 asmlinkage void do_notify_resume(struct pt_regs *regs, struct thread_info *ti)
-- 
1.8.1.4


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

* [PATCH 04/29] blackfin: Use get_signal() signal_setup_done()
  2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
                   ` (2 preceding siblings ...)
  2013-10-08 11:27 ` [PATCH 03/29] avr32: " Richard Weinberger
@ 2013-10-08 11:27 ` Richard Weinberger
  2013-10-08 11:27 ` [PATCH 05/29] c6x: " Richard Weinberger
  2013-10-08 13:38 ` Global do_signal() cleanup Michal Simek
  5 siblings, 0 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 11:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, viro, vgupta, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj,
	Richard Weinberger

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 arch/blackfin/kernel/signal.c | 39 +++++++++++++++++----------------------
 1 file changed, 17 insertions(+), 22 deletions(-)

diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c
index b022af6..1389cd3 100644
--- a/arch/blackfin/kernel/signal.c
+++ b/arch/blackfin/kernel/signal.c
@@ -152,23 +152,22 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
 }
 
 static int
-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info,
-	       sigset_t * set, struct pt_regs *regs)
+setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
 	struct rt_sigframe *frame;
 	int err = 0;
 
-	frame = get_sigframe(ka, regs, sizeof(*frame));
+	frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
 
 	err |= __put_user((current_thread_info()->exec_domain
 			   && current_thread_info()->exec_domain->signal_invmap
-			   && sig < 32
+			   && ksig->sig < 32
 			   ? current_thread_info()->exec_domain->
-			   signal_invmap[sig] : sig), &frame->sig);
+			   signal_invmap[ksig->sig] : ksig->sig), &frame->sig);
 
 	err |= __put_user(&frame->info, &frame->pinfo);
 	err |= __put_user(&frame->uc, &frame->puc);
-	err |= copy_siginfo_to_user(&frame->info, info);
+	err |= copy_siginfo_to_user(&frame->info, &ksig->info);
 
 	/* Create the ucontext.  */
 	err |= __put_user(0, &frame->uc.uc_flags);
@@ -183,7 +182,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info,
 	/* Set up registers for signal handler */
 	if (current->personality & FDPIC_FUNCPTRS) {
 		struct fdpic_func_descriptor __user *funcptr =
-			(struct fdpic_func_descriptor *) ka->sa.sa_handler;
+			(struct fdpic_func_descriptor *) ksig->ka.sa.sa_handler;
 		u32 pc, p3;
 		err |= __get_user(pc, &funcptr->text);
 		err |= __get_user(p3, &funcptr->GOT);
@@ -192,7 +191,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info,
 		regs->pc = pc;
 		regs->p3 = p3;
 	} else
-		regs->pc = (unsigned long)ka->sa.sa_handler;
+		regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
 	wrusp((unsigned long)frame);
 	regs->rets = SIGRETURN_STUB;
 
@@ -237,20 +236,19 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
  * OK, we're invoking a handler
  */
 static void
-handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
-	      struct pt_regs *regs)
+handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
+	int ret;
+
 	/* are we from a system call? to see pt_regs->orig_p0 */
 	if (regs->orig_p0 >= 0)
 		/* If so, check system call restarting.. */
-		handle_restart(regs, ka, 1);
+		handle_restart(regs, &ksig->ka, 1);
 
 	/* set up the stack frame */
-	if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0)
-		force_sigsegv(sig, current);
-	else 
-		signal_delivered(sig, info, ka, regs,
-				test_thread_flag(TIF_SINGLESTEP));
+	ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
+
+	signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
 }
 
 /*
@@ -264,16 +262,13 @@ handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
  */
 asmlinkage void do_signal(struct pt_regs *regs)
 {
-	siginfo_t info;
-	int signr;
-	struct k_sigaction ka;
+	struct ksignal ksig;
 
 	current->thread.esp0 = (unsigned long)regs;
 
-	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-	if (signr > 0) {
+	if (get_signal(&ksig)) {
 		/* Whee!  Actually deliver the signal.  */
-		handle_signal(signr, &info, &ka, regs);
+		handle_signal(&ksig, regs);
 		return;
 	}
 
-- 
1.8.1.4


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

* [PATCH 05/29] c6x: Use get_signal() signal_setup_done()
  2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
                   ` (3 preceding siblings ...)
  2013-10-08 11:27 ` [PATCH 04/29] blackfin: " Richard Weinberger
@ 2013-10-08 11:27 ` Richard Weinberger
  2013-10-08 18:38   ` Mark Salter
  2013-10-08 13:38 ` Global do_signal() cleanup Michal Simek
  5 siblings, 1 reply; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 11:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-arch, viro, vgupta, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj,
	Richard Weinberger

Use the more generic functions get_signal() signal_setup_done()
for signal delivery.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 arch/c6x/kernel/signal.c | 43 ++++++++++++++++++-------------------------
 1 file changed, 18 insertions(+), 25 deletions(-)

diff --git a/arch/c6x/kernel/signal.c b/arch/c6x/kernel/signal.c
index 3998b24..8bf9aad 100644
--- a/arch/c6x/kernel/signal.c
+++ b/arch/c6x/kernel/signal.c
@@ -146,21 +146,21 @@ static inline void __user *get_sigframe(struct k_sigaction *ka,
 	return (void __user *)((sp - framesize) & ~7);
 }
 
-static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
-			   sigset_t *set, struct pt_regs *regs)
+static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
+			  struct pt_regs *regs)
 {
 	struct rt_sigframe __user *frame;
 	unsigned long __user *retcode;
 	int err = 0;
 
-	frame = get_sigframe(ka, regs, sizeof(*frame));
+	frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
 
 	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
-		goto segv_and_exit;
+		return -EFAULT;
 
 	err |= __put_user(&frame->info, &frame->pinfo);
 	err |= __put_user(&frame->uc, &frame->puc);
-	err |= copy_siginfo_to_user(&frame->info, info);
+	err |= copy_siginfo_to_user(&frame->info, &ksig->info);
 
 	/* Clear all the bits of the ucontext we don't use.  */
 	err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
@@ -188,7 +188,7 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
 #undef COPY
 
 	if (err)
-		goto segv_and_exit;
+		return -EFAULT;
 
 	flush_icache_range((unsigned long) &frame->retcode,
 			   (unsigned long) &frame->retcode + RETCODE_SIZE);
@@ -198,10 +198,10 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
 	/* Change user context to branch to signal handler */
 	regs->sp = (unsigned long) frame - 8;
 	regs->b3 = (unsigned long) retcode;
-	regs->pc = (unsigned long) ka->sa.sa_handler;
+	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
 
 	/* Give the signal number to the handler */
-	regs->a4 = signr;
+	regs->a4 = ksig->sig;
 
 	/*
 	 * For realtime signals we must also set the second and third
@@ -212,10 +212,6 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
 	regs->a6 = (unsigned long)&frame->uc;
 
 	return 0;
-
-segv_and_exit:
-	force_sigsegv(signr, current);
-	return -EFAULT;
 }
 
 static inline void
@@ -245,10 +241,11 @@ do_restart:
 /*
  * handle the actual delivery of a signal to userspace
  */
-static void handle_signal(int sig,
-			 siginfo_t *info, struct k_sigaction *ka,
-			 struct pt_regs *regs, int syscall)
+static void handle_signal(struct ksignal *ksig, struct pt_regs *regs,
+			  int syscall)
 {
+	int ret;
+
 	/* Are we from a system call? */
 	if (syscall) {
 		/* If so, check system call restarting.. */
@@ -259,7 +256,7 @@ static void handle_signal(int sig,
 			break;
 
 		case -ERESTARTSYS:
-			if (!(ka->sa.sa_flags & SA_RESTART)) {
+			if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
 				regs->a4 = -EINTR;
 				break;
 			}
@@ -272,9 +269,8 @@ static void handle_signal(int sig,
 	}
 
 	/* Set up the stack frame */
-	if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0)
-		return;
-	signal_delivered(sig, info, ka, regs, 0);
+	ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
+	signal_setup_done(ret, ksig, 0);
 }
 
 /*
@@ -282,18 +278,15 @@ static void handle_signal(int sig,
  */
 static void do_signal(struct pt_regs *regs, int syscall)
 {
-	struct k_sigaction ka;
-	siginfo_t info;
-	int signr;
+	struct ksignal ksig;
 
 	/* we want the common case to go fast, which is why we may in certain
 	 * cases get here from kernel mode */
 	if (!user_mode(regs))
 		return;
 
-	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-	if (signr > 0) {
-		handle_signal(signr, &info, &ka, regs, syscall);
+	if (get_signal(&ksig)) {
+		handle_signal(&ksig, regs, syscall);
 		return;
 	}
 
-- 
1.8.1.4


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

* Re: Global do_signal() cleanup
  2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
                   ` (4 preceding siblings ...)
  2013-10-08 11:27 ` [PATCH 05/29] c6x: " Richard Weinberger
@ 2013-10-08 13:38 ` Michal Simek
  2013-10-08 15:53   ` Richard Weinberger
  5 siblings, 1 reply; 15+ messages in thread
From: Michal Simek @ 2013-10-08 13:38 UTC (permalink / raw)
  To: Richard Weinberger
  Cc: linux-kernel, linux-arch, viro, vgupta, catalin.marinas,
	will.deacon, hskinnemoen, egtvedt, vapier, msalter, a-jacquiot,
	starvik, jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu,
	takata, geert, james.hogan, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

[-- Attachment #1: Type: text/plain, Size: 990 bytes --]

On 10/08/2013 01:27 PM, Richard Weinberger wrote:
> This patch series moves all remaining archs to the get_signal() and
> signal_setup_done() functions. Currently these archs use open coded
> variants of the said functions.  Further, unused parameters get removed
> from get_signal_to_deliver(), tracehook_signal_handler() and signal_delivered().
> After all we save around 350 lines of code. :-)
> 
> The following archs are _untested_: arc, c6x, hexagon, metag, score, unicore, sh64.
> If someone points me to cross compilers for these arch I'll happily build test them too.

Any link to the repo and branch with all these patches will be helpful.

Thanks,
Michal

-- 
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 263 bytes --]

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

* Re: [PATCH 01/29] arc: Use get_signal() signal_setup_done()
  2013-10-08 11:27 ` [PATCH 01/29] arc: Use get_signal() signal_setup_done() Richard Weinberger
  2013-10-08 14:13     ` Vineet Gupta
  (?)
@ 2013-10-08 14:13     ` Vineet Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Vineet Gupta @ 2013-10-08 14:13 UTC (permalink / raw)
  To: Richard Weinberger, linux-kernel
  Cc: linux-arch, viro, catalin.marinas, will.deacon, hskinnemoen,
	egtvedt, vapier, msalter, a-jacquiot, starvik, jesper.nilsson,
	dhowells, rkuo, tony.luck, fenghua.yu, takata, geert,
	james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb, deller,
	benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, linux-sh, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

Hi Richard/all,

Sorry if this is repost - it seems the bounce back from Paul Mundt caused my
earlier reply to not be posted to list. I wonder how other are managing to reply
to thread or is that a Synopsys email server quirk.

Anyways,

On 10/08/2013 04:57 PM, Richard Weinberger wrote:
> Use the more generic functions get_signal() signal_setup_done()
> for signal delivery.

I never realized Al has added the infrastructure already (back when ARC port was
being discussed for mainlining)

Since you are touching all arches, it might make sense to also throw in sigsp()
replacement too.

Something like below:

-    if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
-        sp = current->sas_ss_sp + current->sas_ss_size;


> 
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
>  arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
>  1 file changed, 15 insertions(+), 24 deletions(-)
> 
> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
> index 7e95e1a..c2031e2 100644
> --- a/arch/arc/kernel/signal.c
> +++ b/arch/arc/kernel/signal.c
> @@ -179,14 +179,13 @@ static inline int map_sig(int sig)
>  }
>  
>  static int
> -setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
> -	       sigset_t *set, struct pt_regs *regs)
> +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
>  {
>  	struct rt_sigframe __user *sf;
>  	unsigned int magic = 0;
>  	int err = 0;
>  
> -	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
> +	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));

At least for ARC, it is possible to change get_sigframe() first arg to be ksignal
as well. Rest of changes look good.

Thanks for the series !

P.S. I wonder how u r going to achieve closure on this since SH folks have not
been responding. A patch series of mine is stuck in mid air due to lack of ACK/NAK
from them.

-Vineet

>  	if (!sf)
>  		return 1;
>  
> @@ -205,8 +204,8 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  	 *  #2: struct siginfo
>  	 *  #3: struct ucontext (completely populated)
>  	 */
> -	if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) {
> -		err |= copy_siginfo_to_user(&sf->info, info);
> +	if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
> +		err |= copy_siginfo_to_user(&sf->info, &ksig->info);
>  		err |= __put_user(0, &sf->uc.uc_flags);
>  		err |= __put_user(NULL, &sf->uc.uc_link);
>  		err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
> @@ -227,16 +226,16 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  		return err;
>  
>  	/* #1 arg to the user Signal handler */
> -	regs->r0 = map_sig(signo);
> +	regs->r0 = map_sig(ksig->sig);
>  
>  	/* setup PC of user space signal handler */
> -	regs->ret = (unsigned long)ka->sa.sa_handler;
> +	regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
>  
>  	/*
>  	 * handler returns using sigreturn stub provided already by userpsace
>  	 */
> -	BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
> -	regs->blink = (unsigned long)ka->sa.sa_restorer;
> +	BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER));
> +	regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
>  
>  	/* User Stack for signal handler will be above the frame just carved */
>  	regs->sp = (unsigned long)sf;
> @@ -298,38 +297,30 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
>   * OK, we're invoking a handler
>   */
>  static void
> -handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
> -	      struct pt_regs *regs)
> +handle_signal(struct ksignal *ksig, struct pt_regs *regs)
>  {
>  	sigset_t *oldset = sigmask_to_save();
>  	int ret;
>  
>  	/* Set up the stack frame */
> -	ret = setup_rt_frame(sig, ka, info, oldset, regs);
> +	ret = setup_rt_frame(ksig, oldset, regs);
>  
> -	if (ret)
> -		force_sigsegv(sig, current);
> -	else
> -		signal_delivered(sig, info, ka, regs, 0);
> +	signal_setup_done(ret, ksig, 0);
>  }
>  
>  void do_signal(struct pt_regs *regs)
>  {
> -	struct k_sigaction ka;
> -	siginfo_t info;
> -	int signr;
> +	struct ksignal ksig;
>  	int restart_scall;
>  
> -	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
> -
>  	restart_scall = in_syscall(regs) && syscall_restartable(regs);
>  
> -	if (signr > 0) {
> +	if (get_signal(&ksig)) {
>  		if (restart_scall) {
> -			arc_restart_syscall(&ka, regs);
> +			arc_restart_syscall(&ksig.ka, regs);
>  			syscall_wont_restart(regs);	/* No more restarts */
>  		}
> -		handle_signal(signr, &ka, &info, regs);
> +		handle_signal(&ksig, regs);
>  		return;
>  	}
>  
> 


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

* Re: [PATCH 01/29] arc: Use get_signal() signal_setup_done()
@ 2013-10-08 14:13     ` Vineet Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Vineet Gupta @ 2013-10-08 14:13 UTC (permalink / raw)
  To: Richard Weinberger, linux-kernel
  Cc: linux-arch, viro, catalin.marinas, will.deacon, hskinnemoen,
	egtvedt, vapier, msalter, a-jacquiot, starvik, jesper.nilsson,
	dhowells, rkuo, tony.luck, fenghua.yu, takata, geert,
	james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb, deller,
	benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, linux-sh, cmetcalf, gxt, linux-xtensa, akpm, oleg

Hi Richard/all,

Sorry if this is repost - it seems the bounce back from Paul Mundt caused my
earlier reply to not be posted to list. I wonder how other are managing to reply
to thread or is that a Synopsys email server quirk.

Anyways,

On 10/08/2013 04:57 PM, Richard Weinberger wrote:
> Use the more generic functions get_signal() signal_setup_done()
> for signal delivery.

I never realized Al has added the infrastructure already (back when ARC port was
being discussed for mainlining)

Since you are touching all arches, it might make sense to also throw in sigsp()
replacement too.

Something like below:

-    if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
-        sp = current->sas_ss_sp + current->sas_ss_size;


> 
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
>  arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
>  1 file changed, 15 insertions(+), 24 deletions(-)
> 
> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
> index 7e95e1a..c2031e2 100644
> --- a/arch/arc/kernel/signal.c
> +++ b/arch/arc/kernel/signal.c
> @@ -179,14 +179,13 @@ static inline int map_sig(int sig)
>  }
>  
>  static int
> -setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
> -	       sigset_t *set, struct pt_regs *regs)
> +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
>  {
>  	struct rt_sigframe __user *sf;
>  	unsigned int magic = 0;
>  	int err = 0;
>  
> -	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
> +	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));

At least for ARC, it is possible to change get_sigframe() first arg to be ksignal
as well. Rest of changes look good.

Thanks for the series !

P.S. I wonder how u r going to achieve closure on this since SH folks have not
been responding. A patch series of mine is stuck in mid air due to lack of ACK/NAK
from them.

-Vineet

>  	if (!sf)
>  		return 1;
>  
> @@ -205,8 +204,8 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  	 *  #2: struct siginfo
>  	 *  #3: struct ucontext (completely populated)
>  	 */
> -	if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) {
> -		err |= copy_siginfo_to_user(&sf->info, info);
> +	if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
> +		err |= copy_siginfo_to_user(&sf->info, &ksig->info);
>  		err |= __put_user(0, &sf->uc.uc_flags);
>  		err |= __put_user(NULL, &sf->uc.uc_link);
>  		err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
> @@ -227,16 +226,16 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  		return err;
>  
>  	/* #1 arg to the user Signal handler */
> -	regs->r0 = map_sig(signo);
> +	regs->r0 = map_sig(ksig->sig);
>  
>  	/* setup PC of user space signal handler */
> -	regs->ret = (unsigned long)ka->sa.sa_handler;
> +	regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
>  
>  	/*
>  	 * handler returns using sigreturn stub provided already by userpsace
>  	 */
> -	BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
> -	regs->blink = (unsigned long)ka->sa.sa_restorer;
> +	BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER));
> +	regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
>  
>  	/* User Stack for signal handler will be above the frame just carved */
>  	regs->sp = (unsigned long)sf;
> @@ -298,38 +297,30 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
>   * OK, we're invoking a handler
>   */
>  static void
> -handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
> -	      struct pt_regs *regs)
> +handle_signal(struct ksignal *ksig, struct pt_regs *regs)
>  {
>  	sigset_t *oldset = sigmask_to_save();
>  	int ret;
>  
>  	/* Set up the stack frame */
> -	ret = setup_rt_frame(sig, ka, info, oldset, regs);
> +	ret = setup_rt_frame(ksig, oldset, regs);
>  
> -	if (ret)
> -		force_sigsegv(sig, current);
> -	else
> -		signal_delivered(sig, info, ka, regs, 0);
> +	signal_setup_done(ret, ksig, 0);
>  }
>  
>  void do_signal(struct pt_regs *regs)
>  {
> -	struct k_sigaction ka;
> -	siginfo_t info;
> -	int signr;
> +	struct ksignal ksig;
>  	int restart_scall;
>  
> -	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
> -
>  	restart_scall = in_syscall(regs) && syscall_restartable(regs);
>  
> -	if (signr > 0) {
> +	if (get_signal(&ksig)) {
>  		if (restart_scall) {
> -			arc_restart_syscall(&ka, regs);
> +			arc_restart_syscall(&ksig.ka, regs);
>  			syscall_wont_restart(regs);	/* No more restarts */
>  		}
> -		handle_signal(signr, &ka, &info, regs);
> +		handle_signal(&ksig, regs);
>  		return;
>  	}
>  
> 


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

* Re: [PATCH 01/29] arc: Use get_signal() signal_setup_done()
@ 2013-10-08 14:13     ` Vineet Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Vineet Gupta @ 2013-10-08 14:13 UTC (permalink / raw)
  To: Richard Weinberger, linux-kernel
  Cc: linux-arch, viro, catalin.marinas, will.deacon, hskinnemoen,
	egtvedt, vapier, msalter, a-jacquiot, starvik, jesper.nilsson,
	dhowells, rkuo, tony.luck, fenghua.yu, takata, geert,
	james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb, deller,
	benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, linux-sh, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

Hi Richard/all,

Sorry if this is repost - it seems the bounce back from Paul Mundt caused my
earlier reply to not be posted to list. I wonder how other are managing to reply
to thread or is that a Synopsys email server quirk.

Anyways,

On 10/08/2013 04:57 PM, Richard Weinberger wrote:
> Use the more generic functions get_signal() signal_setup_done()
> for signal delivery.

I never realized Al has added the infrastructure already (back when ARC port was
being discussed for mainlining)

Since you are touching all arches, it might make sense to also throw in sigsp()
replacement too.

Something like below:

-    if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
-        sp = current->sas_ss_sp + current->sas_ss_size;


> 
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
>  arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
>  1 file changed, 15 insertions(+), 24 deletions(-)
> 
> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
> index 7e95e1a..c2031e2 100644
> --- a/arch/arc/kernel/signal.c
> +++ b/arch/arc/kernel/signal.c
> @@ -179,14 +179,13 @@ static inline int map_sig(int sig)
>  }
>  
>  static int
> -setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
> -	       sigset_t *set, struct pt_regs *regs)
> +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
>  {
>  	struct rt_sigframe __user *sf;
>  	unsigned int magic = 0;
>  	int err = 0;
>  
> -	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
> +	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));

At least for ARC, it is possible to change get_sigframe() first arg to be ksignal
as well. Rest of changes look good.

Thanks for the series !

P.S. I wonder how u r going to achieve closure on this since SH folks have not
been responding. A patch series of mine is stuck in mid air due to lack of ACK/NAK
from them.

-Vineet

>  	if (!sf)
>  		return 1;
>  
> @@ -205,8 +204,8 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  	 *  #2: struct siginfo
>  	 *  #3: struct ucontext (completely populated)
>  	 */
> -	if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) {
> -		err |= copy_siginfo_to_user(&sf->info, info);
> +	if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
> +		err |= copy_siginfo_to_user(&sf->info, &ksig->info);
>  		err |= __put_user(0, &sf->uc.uc_flags);
>  		err |= __put_user(NULL, &sf->uc.uc_link);
>  		err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
> @@ -227,16 +226,16 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  		return err;
>  
>  	/* #1 arg to the user Signal handler */
> -	regs->r0 = map_sig(signo);
> +	regs->r0 = map_sig(ksig->sig);
>  
>  	/* setup PC of user space signal handler */
> -	regs->ret = (unsigned long)ka->sa.sa_handler;
> +	regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
>  
>  	/*
>  	 * handler returns using sigreturn stub provided already by userpsace
>  	 */
> -	BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
> -	regs->blink = (unsigned long)ka->sa.sa_restorer;
> +	BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER));
> +	regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
>  
>  	/* User Stack for signal handler will be above the frame just carved */
>  	regs->sp = (unsigned long)sf;
> @@ -298,38 +297,30 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
>   * OK, we're invoking a handler
>   */
>  static void
> -handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
> -	      struct pt_regs *regs)
> +handle_signal(struct ksignal *ksig, struct pt_regs *regs)
>  {
>  	sigset_t *oldset = sigmask_to_save();
>  	int ret;
>  
>  	/* Set up the stack frame */
> -	ret = setup_rt_frame(sig, ka, info, oldset, regs);
> +	ret = setup_rt_frame(ksig, oldset, regs);
>  
> -	if (ret)
> -		force_sigsegv(sig, current);
> -	else
> -		signal_delivered(sig, info, ka, regs, 0);
> +	signal_setup_done(ret, ksig, 0);
>  }
>  
>  void do_signal(struct pt_regs *regs)
>  {
> -	struct k_sigaction ka;
> -	siginfo_t info;
> -	int signr;
> +	struct ksignal ksig;
>  	int restart_scall;
>  
> -	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
> -
>  	restart_scall = in_syscall(regs) && syscall_restartable(regs);
>  
> -	if (signr > 0) {
> +	if (get_signal(&ksig)) {
>  		if (restart_scall) {
> -			arc_restart_syscall(&ka, regs);
> +			arc_restart_syscall(&ksig.ka, regs);
>  			syscall_wont_restart(regs);	/* No more restarts */
>  		}
> -		handle_signal(signr, &ka, &info, regs);
> +		handle_signal(&ksig, regs);
>  		return;
>  	}
>  
> 


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

* Re: [PATCH 01/29] arc: Use get_signal() signal_setup_done()
@ 2013-10-08 14:13     ` Vineet Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Vineet Gupta @ 2013-10-08 14:25 UTC (permalink / raw)
  To: Richard Weinberger, linux-kernel
  Cc: linux-arch, viro, catalin.marinas, will.deacon, hskinnemoen,
	egtvedt, vapier, msalter, a-jacquiot, starvik, jesper.nilsson,
	dhowells, rkuo, tony.luck, fenghua.yu, takata, geert,
	james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb, deller,
	benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, linux-sh, cmetcalf, gxt, linux-xtensa, akpm, oleg

Hi Richard/all,

Sorry if this is repost - it seems the bounce back from Paul Mundt caused my
earlier reply to not be posted to list. I wonder how other are managing to reply
to thread or is that a Synopsys email server quirk.

Anyways,

On 10/08/2013 04:57 PM, Richard Weinberger wrote:
> Use the more generic functions get_signal() signal_setup_done()
> for signal delivery.

I never realized Al has added the infrastructure already (back when ARC port was
being discussed for mainlining)

Since you are touching all arches, it might make sense to also throw in sigsp()
replacement too.

Something like below:

-    if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
-        sp = current->sas_ss_sp + current->sas_ss_size;


> 
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
>  arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
>  1 file changed, 15 insertions(+), 24 deletions(-)
> 
> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
> index 7e95e1a..c2031e2 100644
> --- a/arch/arc/kernel/signal.c
> +++ b/arch/arc/kernel/signal.c
> @@ -179,14 +179,13 @@ static inline int map_sig(int sig)
>  }
>  
>  static int
> -setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
> -	       sigset_t *set, struct pt_regs *regs)
> +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
>  {
>  	struct rt_sigframe __user *sf;
>  	unsigned int magic = 0;
>  	int err = 0;
>  
> -	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
> +	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));

At least for ARC, it is possible to change get_sigframe() first arg to be ksignal
as well. Rest of changes look good.

Thanks for the series !

P.S. I wonder how u r going to achieve closure on this since SH folks have not
been responding. A patch series of mine is stuck in mid air due to lack of ACK/NAK
from them.

-Vineet

>  	if (!sf)
>  		return 1;
>  
> @@ -205,8 +204,8 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  	 *  #2: struct siginfo
>  	 *  #3: struct ucontext (completely populated)
>  	 */
> -	if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) {
> -		err |= copy_siginfo_to_user(&sf->info, info);
> +	if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
> +		err |= copy_siginfo_to_user(&sf->info, &ksig->info);
>  		err |= __put_user(0, &sf->uc.uc_flags);
>  		err |= __put_user(NULL, &sf->uc.uc_link);
>  		err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
> @@ -227,16 +226,16 @@ setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>  		return err;
>  
>  	/* #1 arg to the user Signal handler */
> -	regs->r0 = map_sig(signo);
> +	regs->r0 = map_sig(ksig->sig);
>  
>  	/* setup PC of user space signal handler */
> -	regs->ret = (unsigned long)ka->sa.sa_handler;
> +	regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
>  
>  	/*
>  	 * handler returns using sigreturn stub provided already by userpsace
>  	 */
> -	BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
> -	regs->blink = (unsigned long)ka->sa.sa_restorer;
> +	BUG_ON(!(ksig->ka.sa.sa_flags & SA_RESTORER));
> +	regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
>  
>  	/* User Stack for signal handler will be above the frame just carved */
>  	regs->sp = (unsigned long)sf;
> @@ -298,38 +297,30 @@ static void arc_restart_syscall(struct k_sigaction *ka, struct pt_regs *regs)
>   * OK, we're invoking a handler
>   */
>  static void
> -handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
> -	      struct pt_regs *regs)
> +handle_signal(struct ksignal *ksig, struct pt_regs *regs)
>  {
>  	sigset_t *oldset = sigmask_to_save();
>  	int ret;
>  
>  	/* Set up the stack frame */
> -	ret = setup_rt_frame(sig, ka, info, oldset, regs);
> +	ret = setup_rt_frame(ksig, oldset, regs);
>  
> -	if (ret)
> -		force_sigsegv(sig, current);
> -	else
> -		signal_delivered(sig, info, ka, regs, 0);
> +	signal_setup_done(ret, ksig, 0);
>  }
>  
>  void do_signal(struct pt_regs *regs)
>  {
> -	struct k_sigaction ka;
> -	siginfo_t info;
> -	int signr;
> +	struct ksignal ksig;
>  	int restart_scall;
>  
> -	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
> -
>  	restart_scall = in_syscall(regs) && syscall_restartable(regs);
>  
> -	if (signr > 0) {
> +	if (get_signal(&ksig)) {
>  		if (restart_scall) {
> -			arc_restart_syscall(&ka, regs);
> +			arc_restart_syscall(&ksig.ka, regs);
>  			syscall_wont_restart(regs);	/* No more restarts */
>  		}
> -		handle_signal(signr, &ka, &info, regs);
> +		handle_signal(&ksig, regs);
>  		return;
>  	}
>  
> 


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

* Re: Global do_signal() cleanup
  2013-10-08 13:38 ` Global do_signal() cleanup Michal Simek
@ 2013-10-08 15:53   ` Richard Weinberger
  0 siblings, 0 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 15:53 UTC (permalink / raw)
  To: monstr
  Cc: linux-kernel, linux-arch, viro, vgupta, catalin.marinas,
	will.deacon, hskinnemoen, egtvedt, vapier, msalter, a-jacquiot,
	starvik, jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu,
	takata, geert, james.hogan, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, lethal, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

Am 08.10.2013 15:38, schrieb Michal Simek:
> On 10/08/2013 01:27 PM, Richard Weinberger wrote:
>> This patch series moves all remaining archs to the get_signal() and
>> signal_setup_done() functions. Currently these archs use open coded
>> variants of the said functions.  Further, unused parameters get removed
>> from get_signal_to_deliver(), tracehook_signal_handler() and signal_delivered().
>> After all we save around 350 lines of code. :-)
>>
>> The following archs are _untested_: arc, c6x, hexagon, metag, score, unicore, sh64.
>> If someone points me to cross compilers for these arch I'll happily build test them too.
> 
> Any link to the repo and branch with all these patches will be helpful.

Pushed it into:
git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml.git signal_v1

Thanks,
//richard

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

* Re: [PATCH 01/29] arc: Use get_signal() signal_setup_done()
  2013-10-08 14:13     ` Vineet Gupta
@ 2013-10-08 15:59       ` Richard Weinberger
  -1 siblings, 0 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 15:59 UTC (permalink / raw)
  To: Vineet Gupta
  Cc: linux-kernel, linux-arch, viro, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, linux-sh, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

Hi Vineet,

Am 08.10.2013 16:13, schrieb Vineet Gupta:
> Hi Richard/all,
> 
> Sorry if this is repost - it seems the bounce back from Paul Mundt caused my
> earlier reply to not be posted to list. I wonder how other are managing to reply
> to thread or is that a Synopsys email server quirk.

/me got your first mail.

> Anyways,
> 
> On 10/08/2013 04:57 PM, Richard Weinberger wrote:
>> Use the more generic functions get_signal() signal_setup_done()
>> for signal delivery.
> 
> I never realized Al has added the infrastructure already (back when ARC port was
> being discussed for mainlining)
> 
> Since you are touching all arches, it might make sense to also throw in sigsp()
> replacement too.
> 
> Something like below:
> 
> -    if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
> -        sp = current->sas_ss_sp + current->sas_ss_size;
> 
> 

Good idea. I can think of more sure helpers.

>
>> Signed-off-by: Richard Weinberger <richard@nod.at>
>> ---
>>  arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
>>  1 file changed, 15 insertions(+), 24 deletions(-)
>>
>> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
>> index 7e95e1a..c2031e2 100644
>> --- a/arch/arc/kernel/signal.c
>> +++ b/arch/arc/kernel/signal.c
>> @@ -179,14 +179,13 @@ static inline int map_sig(int sig)
>>  }
>>  
>>  static int
>> -setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>> -	       sigset_t *set, struct pt_regs *regs)
>> +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
>>  {
>>  	struct rt_sigframe __user *sf;
>>  	unsigned int magic = 0;
>>  	int err = 0;
>>  
>> -	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
>> +	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));
> 
> At least for ARC, it is possible to change get_sigframe() first arg to be ksignal
> as well. Rest of changes look good.
> 
> Thanks for the series !
> 
> P.S. I wonder how u r going to achieve closure on this since SH folks have not
> been responding. A patch series of mine is stuck in mid air due to lack of ACK/NAK
> from them.

I hope that the series can be merged via Al Viro's signal tree or so.
Moving single patches through X arch tree would be a PITA.
Especially because not all maintainers are reactive.

Thanks,
//richard

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

* Re: [PATCH 01/29] arc: Use get_signal() signal_setup_done()
@ 2013-10-08 15:59       ` Richard Weinberger
  0 siblings, 0 replies; 15+ messages in thread
From: Richard Weinberger @ 2013-10-08 15:59 UTC (permalink / raw)
  To: Vineet Gupta
  Cc: linux-kernel, linux-arch, viro, catalin.marinas, will.deacon,
	hskinnemoen, egtvedt, vapier, msalter, a-jacquiot, starvik,
	jesper.nilsson, dhowells, rkuo, tony.luck, fenghua.yu, takata,
	geert, james.hogan, monstr, yasutake.koichi, ralf, jonas, jejb,
	deller, benh, paulus, schwidefsky, heiko.carstens, liqin.linux,
	lennox.wu, linux-sh, cmetcalf, gxt, linux-xtensa, akpm, oleg, tj

Hi Vineet,

Am 08.10.2013 16:13, schrieb Vineet Gupta:
> Hi Richard/all,
> 
> Sorry if this is repost - it seems the bounce back from Paul Mundt caused my
> earlier reply to not be posted to list. I wonder how other are managing to reply
> to thread or is that a Synopsys email server quirk.

/me got your first mail.

> Anyways,
> 
> On 10/08/2013 04:57 PM, Richard Weinberger wrote:
>> Use the more generic functions get_signal() signal_setup_done()
>> for signal delivery.
> 
> I never realized Al has added the infrastructure already (back when ARC port was
> being discussed for mainlining)
> 
> Since you are touching all arches, it might make sense to also throw in sigsp()
> replacement too.
> 
> Something like below:
> 
> -    if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
> -        sp = current->sas_ss_sp + current->sas_ss_size;
> 
> 

Good idea. I can think of more sure helpers.

>
>> Signed-off-by: Richard Weinberger <richard@nod.at>
>> ---
>>  arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
>>  1 file changed, 15 insertions(+), 24 deletions(-)
>>
>> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
>> index 7e95e1a..c2031e2 100644
>> --- a/arch/arc/kernel/signal.c
>> +++ b/arch/arc/kernel/signal.c
>> @@ -179,14 +179,13 @@ static inline int map_sig(int sig)
>>  }
>>  
>>  static int
>> -setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
>> -	       sigset_t *set, struct pt_regs *regs)
>> +setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
>>  {
>>  	struct rt_sigframe __user *sf;
>>  	unsigned int magic = 0;
>>  	int err = 0;
>>  
>> -	sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
>> +	sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));
> 
> At least for ARC, it is possible to change get_sigframe() first arg to be ksignal
> as well. Rest of changes look good.
> 
> Thanks for the series !
> 
> P.S. I wonder how u r going to achieve closure on this since SH folks have not
> been responding. A patch series of mine is stuck in mid air due to lack of ACK/NAK
> from them.

I hope that the series can be merged via Al Viro's signal tree or so.
Moving single patches through X arch tree would be a PITA.
Especially because not all maintainers are reactive.

Thanks,
//richard

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

* Re: [PATCH 05/29] c6x: Use get_signal() signal_setup_done()
  2013-10-08 11:27 ` [PATCH 05/29] c6x: " Richard Weinberger
@ 2013-10-08 18:38   ` Mark Salter
  0 siblings, 0 replies; 15+ messages in thread
From: Mark Salter @ 2013-10-08 18:38 UTC (permalink / raw)
  To: Richard Weinberger; +Cc: linux-kernel

On Tue, 2013-10-08 at 13:27 +0200, Richard Weinberger wrote:
> Use the more generic functions get_signal() signal_setup_done()
> for signal delivery.
> 
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
>  arch/c6x/kernel/signal.c | 43
> ++++++++++++++++++-------------------------
>  1 file changed, 18 insertions(+), 25 deletions(-)

Tested-by: Mark Salter <msalter@redhat.com>
Acked-by: Mark Salter <msalter@redhat.com>



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

end of thread, other threads:[~2013-10-08 18:38 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-08 11:27 Global do_signal() cleanup Richard Weinberger
2013-10-08 11:27 ` [PATCH 01/29] arc: Use get_signal() signal_setup_done() Richard Weinberger
2013-10-08 14:13   ` Vineet Gupta
2013-10-08 14:25     ` Vineet Gupta
2013-10-08 14:13     ` Vineet Gupta
2013-10-08 14:13     ` Vineet Gupta
2013-10-08 15:59     ` Richard Weinberger
2013-10-08 15:59       ` Richard Weinberger
2013-10-08 11:27 ` [PATCH 02/29] arm64: " Richard Weinberger
2013-10-08 11:27 ` [PATCH 03/29] avr32: " Richard Weinberger
2013-10-08 11:27 ` [PATCH 04/29] blackfin: " Richard Weinberger
2013-10-08 11:27 ` [PATCH 05/29] c6x: " Richard Weinberger
2013-10-08 18:38   ` Mark Salter
2013-10-08 13:38 ` Global do_signal() cleanup Michal Simek
2013-10-08 15:53   ` Richard Weinberger

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.