diff options
author | Roland McGrath <roland@redhat.com> | 2008-04-28 03:30:37 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-05-14 08:31:33 -0400 |
commit | 7a10174eeafe737f3ccfcece5bdff749c3b044e0 (patch) | |
tree | 96d3139ed19153e3369683d6b71cd74852fd1ef5 /arch | |
parent | 140b932f8cb6cced10b96860651a198b1b89cbb9 (diff) |
[POWERPC] Define and use TLF_RESTORE_SIGMASK
Replace TIF_RESTORE_SIGMASK with TLF_RESTORE_SIGMASK and define
our own set_restore_sigmask() function. This saves the costly
SMP-safe set_bit operation, which we do not need for the sigmask
flag since TIF_SIGPENDING always has to be set too.
Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/entry_32.S | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/signal.c | 12 | ||||
-rw-r--r-- | arch/powerpc/kernel/signal_32.c | 2 | ||||
-rw-r--r-- | arch/ppc/kernel/entry.S | 4 |
4 files changed, 11 insertions, 11 deletions
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 0c8614d9875c..3a05e9f93d42 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
@@ -668,7 +668,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */ | |||
668 | /* Check current_thread_info()->flags */ | 668 | /* Check current_thread_info()->flags */ |
669 | rlwinm r9,r1,0,0,(31-THREAD_SHIFT) | 669 | rlwinm r9,r1,0,0,(31-THREAD_SHIFT) |
670 | lwz r9,TI_FLAGS(r9) | 670 | lwz r9,TI_FLAGS(r9) |
671 | andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED) | 671 | andi. r0,r9,_TIF_USER_WORK_MASK |
672 | bne do_work | 672 | bne do_work |
673 | 673 | ||
674 | restore_user: | 674 | restore_user: |
@@ -925,7 +925,7 @@ recheck: | |||
925 | lwz r9,TI_FLAGS(r9) | 925 | lwz r9,TI_FLAGS(r9) |
926 | andi. r0,r9,_TIF_NEED_RESCHED | 926 | andi. r0,r9,_TIF_NEED_RESCHED |
927 | bne- do_resched | 927 | bne- do_resched |
928 | andi. r0,r9,_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK | 928 | andi. r0,r9,_TIF_USER_WORK_MASK |
929 | beq restore_user | 929 | beq restore_user |
930 | do_user_signal: /* r10 contains MSR_KERNEL here */ | 930 | do_user_signal: /* r10 contains MSR_KERNEL here */ |
931 | ori r10,r10,MSR_EE | 931 | ori r10,r10,MSR_EE |
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index a65a44fbe523..ad55488939c3 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
@@ -120,7 +120,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
120 | int ret; | 120 | int ret; |
121 | int is32 = is_32bit_task(); | 121 | int is32 = is_32bit_task(); |
122 | 122 | ||
123 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 123 | if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK) |
124 | oldset = ¤t->saved_sigmask; | 124 | oldset = ¤t->saved_sigmask; |
125 | else if (!oldset) | 125 | else if (!oldset) |
126 | oldset = ¤t->blocked; | 126 | oldset = ¤t->blocked; |
@@ -131,9 +131,10 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
131 | check_syscall_restart(regs, &ka, signr > 0); | 131 | check_syscall_restart(regs, &ka, signr > 0); |
132 | 132 | ||
133 | if (signr <= 0) { | 133 | if (signr <= 0) { |
134 | struct thread_info *ti = current_thread_info(); | ||
134 | /* No signal to deliver -- put the saved sigmask back */ | 135 | /* No signal to deliver -- put the saved sigmask back */ |
135 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 136 | if (ti->local_flags & _TLF_RESTORE_SIGMASK) { |
136 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 137 | ti->local_flags &= ~_TLF_RESTORE_SIGMASK; |
137 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 138 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); |
138 | } | 139 | } |
139 | return 0; /* no signals delivered */ | 140 | return 0; /* no signals delivered */ |
@@ -169,10 +170,9 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
169 | 170 | ||
170 | /* | 171 | /* |
171 | * A signal was successfully delivered; the saved sigmask is in | 172 | * A signal was successfully delivered; the saved sigmask is in |
172 | * its frame, and we can clear the TIF_RESTORE_SIGMASK flag. | 173 | * its frame, and we can clear the TLF_RESTORE_SIGMASK flag. |
173 | */ | 174 | */ |
174 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 175 | current_thread_info()->local_flags &= ~_TLF_RESTORE_SIGMASK; |
175 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
176 | } | 176 | } |
177 | 177 | ||
178 | return ret; | 178 | return ret; |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index ad6943468ee9..4ae16d179803 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -243,7 +243,7 @@ long sys_sigsuspend(old_sigset_t mask) | |||
243 | 243 | ||
244 | current->state = TASK_INTERRUPTIBLE; | 244 | current->state = TASK_INTERRUPTIBLE; |
245 | schedule(); | 245 | schedule(); |
246 | set_thread_flag(TIF_RESTORE_SIGMASK); | 246 | set_restore_sigmask(); |
247 | return -ERESTARTNOHAND; | 247 | return -ERESTARTNOHAND; |
248 | } | 248 | } |
249 | 249 | ||
diff --git a/arch/ppc/kernel/entry.S b/arch/ppc/kernel/entry.S index 5f3a5d068a5c..fcd830a292e2 100644 --- a/arch/ppc/kernel/entry.S +++ b/arch/ppc/kernel/entry.S | |||
@@ -647,7 +647,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */ | |||
647 | /* Check current_thread_info()->flags */ | 647 | /* Check current_thread_info()->flags */ |
648 | rlwinm r9,r1,0,0,18 | 648 | rlwinm r9,r1,0,0,18 |
649 | lwz r9,TI_FLAGS(r9) | 649 | lwz r9,TI_FLAGS(r9) |
650 | andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED) | 650 | andi. r0,r9,_TIF_USER_WORK_MASK |
651 | bne do_work | 651 | bne do_work |
652 | 652 | ||
653 | restore_user: | 653 | restore_user: |
@@ -898,7 +898,7 @@ recheck: | |||
898 | lwz r9,TI_FLAGS(r9) | 898 | lwz r9,TI_FLAGS(r9) |
899 | andi. r0,r9,_TIF_NEED_RESCHED | 899 | andi. r0,r9,_TIF_NEED_RESCHED |
900 | bne- do_resched | 900 | bne- do_resched |
901 | andi. r0,r9,_TIF_SIGPENDING | 901 | andi. r0,r9,_TIF_USER_WORK_MASK |
902 | beq restore_user | 902 | beq restore_user |
903 | do_user_signal: /* r10 contains MSR_KERNEL here */ | 903 | do_user_signal: /* r10 contains MSR_KERNEL here */ |
904 | ori r10,r10,MSR_EE | 904 | ori r10,r10,MSR_EE |