Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm: add support for TIF_NOTIFY_SIGNAL

Wire up TIF_NOTIFY_SIGNAL handling for arm.

Cc: linux-arm-kernel@lists.infradead.org
Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

+11 -6
+6 -1
arch/arm/include/asm/thread_info.h
··· 126 126 * thread information flags: 127 127 * TIF_USEDFPU - FPU was used by this task this quantum (SMP) 128 128 * TIF_POLLING_NRFLAG - true if poll_idle() is polling TIF_NEED_RESCHED 129 + * 130 + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked. 129 131 */ 130 132 #define TIF_SIGPENDING 0 /* signal pending */ 131 133 #define TIF_NEED_RESCHED 1 /* rescheduling necessary */ ··· 137 135 #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ 138 136 #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ 139 137 #define TIF_SECCOMP 7 /* seccomp syscall filtering active */ 138 + #define TIF_NOTIFY_SIGNAL 8 /* signal notifications exist */ 140 139 141 140 #define TIF_USING_IWMMXT 17 142 141 #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ ··· 151 148 #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 152 149 #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) 153 150 #define _TIF_SECCOMP (1 << TIF_SECCOMP) 151 + #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) 154 152 #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) 155 153 156 154 /* Checks for any syscall work in entry-common.S */ ··· 162 158 * Change these and you break ASM code in entry-common.S 163 159 */ 164 160 #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ 165 - _TIF_NOTIFY_RESUME | _TIF_UPROBE) 161 + _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ 162 + _TIF_NOTIFY_SIGNAL) 166 163 167 164 #endif /* __KERNEL__ */ 168 165 #endif /* __ASM_ARM_THREAD_INFO_H */
+3 -3
arch/arm/kernel/entry-common.S
··· 53 53 cmp r2, #TASK_SIZE 54 54 blne addr_limit_check_failed 55 55 ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing 56 - tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK 56 + movs r1, r1, lsl #16 57 57 bne fast_work_pending 58 58 59 59 ··· 90 90 cmp r2, #TASK_SIZE 91 91 blne addr_limit_check_failed 92 92 ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing 93 - tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK 93 + movs r1, r1, lsl #16 94 94 beq no_work_pending 95 95 UNWIND(.fnend ) 96 96 ENDPROC(ret_fast_syscall) ··· 131 131 cmp r2, #TASK_SIZE 132 132 blne addr_limit_check_failed 133 133 ldr r1, [tsk, #TI_FLAGS] 134 - tst r1, #_TIF_WORK_MASK 134 + movs r1, r1, lsl #16 135 135 bne slow_work_pending 136 136 no_work_pending: 137 137 asm_trace_hardirqs_on save = 0
+1 -1
arch/arm/kernel/entry-v7m.S
··· 59 59 60 60 get_thread_info tsk 61 61 ldr r2, [tsk, #TI_FLAGS] 62 - tst r2, #_TIF_WORK_MASK 62 + movs r2, r2, lsl #16 63 63 beq 2f @ no work pending 64 64 mov r0, #V7M_SCB_ICSR_PENDSVSET 65 65 str r0, [r1, V7M_SCB_ICSR] @ raise PendSV
+1 -1
arch/arm/kernel/signal.c
··· 655 655 if (unlikely(!user_mode(regs))) 656 656 return 0; 657 657 local_irq_enable(); 658 - if (thread_flags & _TIF_SIGPENDING) { 658 + if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) { 659 659 int restart = do_signal(regs, syscall); 660 660 if (unlikely(restart)) { 661 661 /*