Commit c37a33035720a0faf1f609dc7c2c07080ed83629
1 parent
52fda4870e
Exists in
master
and in
7 other branches
m32r: Update sys_rt_sigsuspend
Update sys_rt_sigsuspend() of arch/m32r/signal.c. This modification is derived from generic one of kernel/signal.c. Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Showing 2 changed files with 15 additions and 13 deletions Side-by-side Diff
arch/m32r/kernel/signal.c
... | ... | @@ -36,7 +36,7 @@ |
36 | 36 | unsigned long r2, unsigned long r3, unsigned long r4, |
37 | 37 | unsigned long r5, unsigned long r6, struct pt_regs *regs) |
38 | 38 | { |
39 | - sigset_t saveset, newset; | |
39 | + sigset_t newset; | |
40 | 40 | |
41 | 41 | /* XXX: Don't preclude handling different sized sigset_t's. */ |
42 | 42 | if (sigsetsize != sizeof(sigset_t)) |
43 | 43 | |
44 | 44 | |
... | ... | @@ -44,21 +44,18 @@ |
44 | 44 | |
45 | 45 | if (copy_from_user(&newset, unewset, sizeof(newset))) |
46 | 46 | return -EFAULT; |
47 | - sigdelsetmask(&newset, ~_BLOCKABLE); | |
47 | + sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); | |
48 | 48 | |
49 | 49 | spin_lock_irq(¤t->sighand->siglock); |
50 | - saveset = current->blocked; | |
50 | + current->saved_sigmask = current->blocked; | |
51 | 51 | current->blocked = newset; |
52 | 52 | recalc_sigpending(); |
53 | 53 | spin_unlock_irq(¤t->sighand->siglock); |
54 | 54 | |
55 | - regs->r0 = -EINTR; | |
56 | - while (1) { | |
57 | - current->state = TASK_INTERRUPTIBLE; | |
58 | - schedule(); | |
59 | - if (do_signal(regs, &saveset)) | |
60 | - return regs->r0; | |
61 | - } | |
55 | + current->state = TASK_INTERRUPTIBLE; | |
56 | + schedule(); | |
57 | + set_thread_flag(TIF_RESTORE_SIGMASK); | |
58 | + return -ERESTARTNOHAND; | |
62 | 59 | } |
63 | 60 | |
64 | 61 | asmlinkage int |
include/asm-m32r/thread_info.h
... | ... | @@ -149,16 +149,21 @@ |
149 | 149 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
150 | 150 | #define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ |
151 | 151 | #define TIF_IRET 4 /* return with iret */ |
152 | -#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | |
153 | - /* 31..28 fault code */ | |
154 | -#define TIF_MEMDIE 17 | |
152 | +#define TIF_RESTORE_SIGMASK 8 /* restore signal mask in do_signal() */ | |
153 | +#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ | |
154 | +#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | |
155 | +#define TIF_MEMDIE 18 /* OOM killer killed process */ | |
156 | +#define TIF_FREEZE 19 /* is freezing for suspend */ | |
155 | 157 | |
156 | 158 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
157 | 159 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
158 | 160 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
159 | 161 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) |
160 | 162 | #define _TIF_IRET (1<<TIF_IRET) |
163 | +#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | |
164 | +#define _TIF_USEDFPU (1<<TIF_USEDFPU) | |
161 | 165 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
166 | +#define _TIF_FREEZE (1<<TIF_FREEZE) | |
162 | 167 | |
163 | 168 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ |
164 | 169 | #define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ |