diff mbox series

arm: add support for TIF_NOTIFY_SIGNAL

Message ID 3c1ebfa5-38d9-e6b2-fcf7-d8b17c0fa515@kernel.dk (mailing list archive)
State New, archived
Headers show
Series arm: add support for TIF_NOTIFY_SIGNAL | expand

Commit Message

Jens Axboe Oct. 29, 2020, 4:11 p.m. UTC
Wire up TIF_NOTIFY_SIGNAL handling for arm.

Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---

5.11 has support queued up for TIF_NOTIFY_SIGNAL, see this posting
for details:

https://lore.kernel.org/io-uring/20201026203230.386348-1-axboe@kernel.dk/

As part of that work, I'm adding TIF_NOTIFY_SIGNAL support to all archs,
as that will enable a set of cleanups once all of them support it.

This needs a bit of asm help, immediate doesn't like anything outside
of 1 byte, it seems. Any clues?

 arch/arm/include/asm/thread_info.h | 5 ++++-
 arch/arm/kernel/entry-common.S     | 9 ++++++---
 arch/arm/kernel/signal.c           | 2 +-
 3 files changed, 11 insertions(+), 5 deletions(-)

Comments

Russell King (Oracle) Oct. 29, 2020, 4:29 p.m. UTC | #1
On Thu, Oct 29, 2020 at 10:11:07AM -0600, Jens Axboe wrote:
> Wire up TIF_NOTIFY_SIGNAL handling for arm.
> 
> Cc: linux-arm-kernel@lists.infradead.org
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> ---
> 
> 5.11 has support queued up for TIF_NOTIFY_SIGNAL, see this posting
> for details:
> 
> https://lore.kernel.org/io-uring/20201026203230.386348-1-axboe@kernel.dk/
> 
> As part of that work, I'm adding TIF_NOTIFY_SIGNAL support to all archs,
> as that will enable a set of cleanups once all of them support it.
> 
> This needs a bit of asm help, immediate doesn't like anything outside
> of 1 byte, it seems. Any clues?

Correct - immediates take an 8 bit value shifted by an even number of
bits.

I'm tempted to suggest that we simplify things by making TIF bits 0..15
invoke do_work_pending() no matter what - which will require a comment
in thread_info.h that all those bits will have that effect. The
resulting assembly would be:

 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	movs	r1, r1, lsl #16

which avoids the additional load caused by "ldr r2, =..."

It's not like we're desperate for bits here.

Further comments below if we don't decide on that approach...

> 
>  arch/arm/include/asm/thread_info.h | 5 ++++-
>  arch/arm/kernel/entry-common.S     | 9 ++++++---
>  arch/arm/kernel/signal.c           | 2 +-
>  3 files changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
> index 536b6b979f63..fec16d770180 100644
> --- a/arch/arm/include/asm/thread_info.h
> +++ b/arch/arm/include/asm/thread_info.h
> @@ -135,6 +135,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>  
>  #define TIF_USING_IWMMXT	17
>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
> @@ -148,6 +149,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>  
>  /* Checks for any syscall work in entry-common.S */
> @@ -158,7 +160,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>   * Change these and you break ASM code in entry-common.S
>   */
>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
> +				 _TIF_NOTIFY_SIGNAL)
>  
>  #endif /* __KERNEL__ */
>  #endif /* __ASM_ARM_THREAD_INFO_H */
> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
> index 271cb8a1eba1..7485b58673b4 100644
> --- a/arch/arm/kernel/entry-common.S
> +++ b/arch/arm/kernel/entry-common.S
> @@ -53,7 +53,8 @@ __ret_fast_syscall:
>  	cmp	r2, #TASK_SIZE
>  	blne	addr_limit_check_failed
>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> +	ldr	r2, =#_TIF_SYSCALL_WORK | _TIF_WORK_MASK

No # required.

> +	tst	r1, r2
>  	bne	fast_work_pending
>  
>  
> @@ -90,7 +91,8 @@ __ret_fast_syscall:
>  	cmp	r2, #TASK_SIZE
>  	blne	addr_limit_check_failed
>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> +	ldr	r2, =#_TIF_SYSCALL_WORK | _TIF_WORK_MASK

Ditto.

> +	tst	r1, r2
>  	beq	no_work_pending
>   UNWIND(.fnend		)
>  ENDPROC(ret_fast_syscall)
> @@ -131,7 +133,8 @@ ENTRY(ret_to_user_from_irq)
>  	cmp	r2, #TASK_SIZE
>  	blne	addr_limit_check_failed
>  	ldr	r1, [tsk, #TI_FLAGS]
> -	tst	r1, #_TIF_WORK_MASK
> +	ldr	r2, =#_TIF_WORK_MASK

Ditto.
Jens Axboe Oct. 29, 2020, 4:35 p.m. UTC | #2
On 10/29/20 10:29 AM, Russell King - ARM Linux admin wrote:
> On Thu, Oct 29, 2020 at 10:11:07AM -0600, Jens Axboe wrote:
>> Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>
>> Cc: linux-arm-kernel@lists.infradead.org
>> Signed-off-by: Jens Axboe <axboe@kernel.dk>
>> ---
>>
>> 5.11 has support queued up for TIF_NOTIFY_SIGNAL, see this posting
>> for details:
>>
>> https://lore.kernel.org/io-uring/20201026203230.386348-1-axboe@kernel.dk/
>>
>> As part of that work, I'm adding TIF_NOTIFY_SIGNAL support to all archs,
>> as that will enable a set of cleanups once all of them support it.
>>
>> This needs a bit of asm help, immediate doesn't like anything outside
>> of 1 byte, it seems. Any clues?
> 
> Correct - immediates take an 8 bit value shifted by an even number of
> bits.
> 
> I'm tempted to suggest that we simplify things by making TIF bits 0..15
> invoke do_work_pending() no matter what - which will require a comment
> in thread_info.h that all those bits will have that effect. The
> resulting assembly would be:
> 
>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> +	movs	r1, r1, lsl #16
> 
> which avoids the additional load caused by "ldr r2, =..."
> 
> It's not like we're desperate for bits here.

So renumber TIF bits that don't need to worry about do_work_pending() >
15 then? I agree, there's plenty of bits available, so seems reasonable
to me. But probably more work in terms of other bits being tested with
tstcurrently - at least when I looked, I could not find any of them I
could successfully remap from < 8 to > 8.

Any chance I can talk you into hacking that up?

> Further comments below if we don't decide on that approach...

Totally up to you, of course. I'm fine with shifting the bits around.
Russell King (Oracle) Oct. 29, 2020, 5:01 p.m. UTC | #3
On Thu, Oct 29, 2020 at 10:35:54AM -0600, Jens Axboe wrote:
> On 10/29/20 10:29 AM, Russell King - ARM Linux admin wrote:
> > On Thu, Oct 29, 2020 at 10:11:07AM -0600, Jens Axboe wrote:
> >> Wire up TIF_NOTIFY_SIGNAL handling for arm.
> >>
> >> Cc: linux-arm-kernel@lists.infradead.org
> >> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> >> ---
> >>
> >> 5.11 has support queued up for TIF_NOTIFY_SIGNAL, see this posting
> >> for details:
> >>
> >> https://lore.kernel.org/io-uring/20201026203230.386348-1-axboe@kernel.dk/
> >>
> >> As part of that work, I'm adding TIF_NOTIFY_SIGNAL support to all archs,
> >> as that will enable a set of cleanups once all of them support it.
> >>
> >> This needs a bit of asm help, immediate doesn't like anything outside
> >> of 1 byte, it seems. Any clues?
> > 
> > Correct - immediates take an 8 bit value shifted by an even number of
> > bits.
> > 
> > I'm tempted to suggest that we simplify things by making TIF bits 0..15
> > invoke do_work_pending() no matter what - which will require a comment
> > in thread_info.h that all those bits will have that effect. The
> > resulting assembly would be:
> > 
> >  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> > -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> > +	movs	r1, r1, lsl #16
> > 
> > which avoids the additional load caused by "ldr r2, =..."
> > 
> > It's not like we're desperate for bits here.
> 
> So renumber TIF bits that don't need to worry about do_work_pending() >
> 15 then? I agree, there's plenty of bits available, so seems reasonable
> to me. But probably more work in terms of other bits being tested with
> tstcurrently - at least when I looked, I could not find any of them I
> could successfully remap from < 8 to > 8.
> 
> Any chance I can talk you into hacking that up?

I don't believe that there's any need to do any renumbering.

_TIF_WORK_MASK covers bits 0-3. _TIF_SYSCALL_WORK covers bits 4-7.
Then we have 17, 18, and 20 which are not used to trigger the
do_work_pending().

So, I think it's just a case of changing what you're doing in the
assembly to my suggestion, and adding a comment to thread_info.h
noting that bits 0-15 will trigger a call into do_work_pending()
when returning to userspace.
Jens Axboe Oct. 29, 2020, 5:15 p.m. UTC | #4
On 10/29/20 11:01 AM, Russell King - ARM Linux admin wrote:
> On Thu, Oct 29, 2020 at 10:35:54AM -0600, Jens Axboe wrote:
>> On 10/29/20 10:29 AM, Russell King - ARM Linux admin wrote:
>>> On Thu, Oct 29, 2020 at 10:11:07AM -0600, Jens Axboe wrote:
>>>> Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>>>
>>>> Cc: linux-arm-kernel@lists.infradead.org
>>>> Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>>> ---
>>>>
>>>> 5.11 has support queued up for TIF_NOTIFY_SIGNAL, see this posting
>>>> for details:
>>>>
>>>> https://lore.kernel.org/io-uring/20201026203230.386348-1-axboe@kernel.dk/
>>>>
>>>> As part of that work, I'm adding TIF_NOTIFY_SIGNAL support to all archs,
>>>> as that will enable a set of cleanups once all of them support it.
>>>>
>>>> This needs a bit of asm help, immediate doesn't like anything outside
>>>> of 1 byte, it seems. Any clues?
>>>
>>> Correct - immediates take an 8 bit value shifted by an even number of
>>> bits.
>>>
>>> I'm tempted to suggest that we simplify things by making TIF bits 0..15
>>> invoke do_work_pending() no matter what - which will require a comment
>>> in thread_info.h that all those bits will have that effect. The
>>> resulting assembly would be:
>>>
>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>> +	movs	r1, r1, lsl #16
>>>
>>> which avoids the additional load caused by "ldr r2, =..."
>>>
>>> It's not like we're desperate for bits here.
>>
>> So renumber TIF bits that don't need to worry about do_work_pending() >
>> 15 then? I agree, there's plenty of bits available, so seems reasonable
>> to me. But probably more work in terms of other bits being tested with
>> tstcurrently - at least when I looked, I could not find any of them I
>> could successfully remap from < 8 to > 8.
>>
>> Any chance I can talk you into hacking that up?
> 
> I don't believe that there's any need to do any renumbering.

You are right!

> _TIF_WORK_MASK covers bits 0-3. _TIF_SYSCALL_WORK covers bits 4-7.
> Then we have 17, 18, and 20 which are not used to trigger the
> do_work_pending().
> 
> So, I think it's just a case of changing what you're doing in the
> assembly to my suggestion, and adding a comment to thread_info.h
> noting that bits 0-15 will trigger a call into do_work_pending()
> when returning to userspace.

How about this?


commit c03932936d8f99ff7c1c6c7d984e7a457284396c
Author: Jens Axboe <axboe@kernel.dk>
Date:   Fri Oct 9 16:00:49 2020 -0600

    arm: add support for TIF_NOTIFY_SIGNAL
    
    Wire up TIF_NOTIFY_SIGNAL handling for arm.
    
    Cc: linux-arm-kernel@lists.infradead.org
    Signed-off-by: Jens Axboe <axboe@kernel.dk>

diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
index 536b6b979f63..eb7ce2747eb0 100644
--- a/arch/arm/include/asm/thread_info.h
+++ b/arch/arm/include/asm/thread_info.h
@@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
  * thread information flags:
  *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
  *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
+ *
+ * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
  */
 #define TIF_SIGPENDING		0	/* signal pending */
 #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
@@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
 #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
 #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
 #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
+#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
 
 #define TIF_USING_IWMMXT	17
 #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
@@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
 #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
 #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
 #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
+#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
 #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
 
 /* Checks for any syscall work in entry-common.S */
@@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
  * Change these and you break ASM code in entry-common.S
  */
 #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
-				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
+				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
+				 _TIF_NOTIFY_SIGNAL)
 
 #endif /* __KERNEL__ */
 #endif /* __ASM_ARM_THREAD_INFO_H */
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 271cb8a1eba1..77d16390a524 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -53,7 +53,7 @@ __ret_fast_syscall:
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	movs	r1, r1, lsl #16
 	bne	fast_work_pending
 
 
@@ -90,7 +90,7 @@ __ret_fast_syscall:
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	movs	r1, r1, lsl #16
 	beq	no_work_pending
  UNWIND(.fnend		)
 ENDPROC(ret_fast_syscall)
@@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]
-	tst	r1, #_TIF_WORK_MASK
+	movs	r1, r1, lsl #16
 	bne	slow_work_pending
 no_work_pending:
 	asm_trace_hardirqs_on save = 0
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
index de1f20624be1..d0e898608d30 100644
--- a/arch/arm/kernel/entry-v7m.S
+++ b/arch/arm/kernel/entry-v7m.S
@@ -59,7 +59,7 @@ __irq_entry:
 
 	get_thread_info tsk
 	ldr	r2, [tsk, #TI_FLAGS]
-	tst	r2, #_TIF_WORK_MASK
+	movs	r2, r2, lsl #16
 	beq	2f			@ no work pending
 	mov	r0, #V7M_SCB_ICSR_PENDSVSET
 	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index 585edbfccf6d..9d2e916121be 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
 			if (unlikely(!user_mode(regs)))
 				return 0;
 			local_irq_enable();
-			if (thread_flags & _TIF_SIGPENDING) {
+			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
 				int restart = do_signal(regs, syscall);
 				if (unlikely(restart)) {
 					/*
Russell King (Oracle) Oct. 29, 2020, 5:17 p.m. UTC | #5
On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
> How about this?
> 
> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
> Author: Jens Axboe <axboe@kernel.dk>
> Date:   Fri Oct 9 16:00:49 2020 -0600
> 
>     arm: add support for TIF_NOTIFY_SIGNAL
>     
>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
>     
>     Cc: linux-arm-kernel@lists.infradead.org
>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
> 
> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
> index 536b6b979f63..eb7ce2747eb0 100644
> --- a/arch/arm/include/asm/thread_info.h
> +++ b/arch/arm/include/asm/thread_info.h
> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>   * thread information flags:
>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
> + *
> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
>   */
>  #define TIF_SIGPENDING		0	/* signal pending */
>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>  
>  #define TIF_USING_IWMMXT	17
>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>  
>  /* Checks for any syscall work in entry-common.S */
> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>   * Change these and you break ASM code in entry-common.S
>   */
>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
> +				 _TIF_NOTIFY_SIGNAL)
>  
>  #endif /* __KERNEL__ */
>  #endif /* __ASM_ARM_THREAD_INFO_H */
> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
> index 271cb8a1eba1..77d16390a524 100644
> --- a/arch/arm/kernel/entry-common.S
> +++ b/arch/arm/kernel/entry-common.S
> @@ -53,7 +53,7 @@ __ret_fast_syscall:
>  	cmp	r2, #TASK_SIZE
>  	blne	addr_limit_check_failed
>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> +	movs	r1, r1, lsl #16
>  	bne	fast_work_pending
>  
>  
> @@ -90,7 +90,7 @@ __ret_fast_syscall:
>  	cmp	r2, #TASK_SIZE
>  	blne	addr_limit_check_failed
>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> +	movs	r1, r1, lsl #16
>  	beq	no_work_pending
>   UNWIND(.fnend		)
>  ENDPROC(ret_fast_syscall)
> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
>  	cmp	r2, #TASK_SIZE
>  	blne	addr_limit_check_failed
>  	ldr	r1, [tsk, #TI_FLAGS]
> -	tst	r1, #_TIF_WORK_MASK
> +	movs	r1, r1, lsl #16
>  	bne	slow_work_pending
>  no_work_pending:
>  	asm_trace_hardirqs_on save = 0
> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
> index de1f20624be1..d0e898608d30 100644
> --- a/arch/arm/kernel/entry-v7m.S
> +++ b/arch/arm/kernel/entry-v7m.S
> @@ -59,7 +59,7 @@ __irq_entry:
>  
>  	get_thread_info tsk
>  	ldr	r2, [tsk, #TI_FLAGS]
> -	tst	r2, #_TIF_WORK_MASK
> +	movs	r2, r2, lsl #16
>  	beq	2f			@ no work pending
>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
> index 585edbfccf6d..9d2e916121be 100644
> --- a/arch/arm/kernel/signal.c
> +++ b/arch/arm/kernel/signal.c
> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
>  			if (unlikely(!user_mode(regs)))
>  				return 0;
>  			local_irq_enable();
> -			if (thread_flags & _TIF_SIGPENDING) {
> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
>  				int restart = do_signal(regs, syscall);
>  				if (unlikely(restart)) {
>  					/*
> 

Looks perfect to me, thanks! I assume the pre-requisits for this are
already in mainline or linux-next?
Jens Axboe Oct. 29, 2020, 5:20 p.m. UTC | #6
On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
>> How about this?
>>
>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
>> Author: Jens Axboe <axboe@kernel.dk>
>> Date:   Fri Oct 9 16:00:49 2020 -0600
>>
>>     arm: add support for TIF_NOTIFY_SIGNAL
>>     
>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>     
>>     Cc: linux-arm-kernel@lists.infradead.org
>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>
>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
>> index 536b6b979f63..eb7ce2747eb0 100644
>> --- a/arch/arm/include/asm/thread_info.h
>> +++ b/arch/arm/include/asm/thread_info.h
>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>   * thread information flags:
>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
>> + *
>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
>>   */
>>  #define TIF_SIGPENDING		0	/* signal pending */
>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>>  
>>  #define TIF_USING_IWMMXT	17
>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>>  
>>  /* Checks for any syscall work in entry-common.S */
>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>   * Change these and you break ASM code in entry-common.S
>>   */
>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
>> +				 _TIF_NOTIFY_SIGNAL)
>>  
>>  #endif /* __KERNEL__ */
>>  #endif /* __ASM_ARM_THREAD_INFO_H */
>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>> index 271cb8a1eba1..77d16390a524 100644
>> --- a/arch/arm/kernel/entry-common.S
>> +++ b/arch/arm/kernel/entry-common.S
>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
>>  	cmp	r2, #TASK_SIZE
>>  	blne	addr_limit_check_failed
>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>> +	movs	r1, r1, lsl #16
>>  	bne	fast_work_pending
>>  
>>  
>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
>>  	cmp	r2, #TASK_SIZE
>>  	blne	addr_limit_check_failed
>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>> +	movs	r1, r1, lsl #16
>>  	beq	no_work_pending
>>   UNWIND(.fnend		)
>>  ENDPROC(ret_fast_syscall)
>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
>>  	cmp	r2, #TASK_SIZE
>>  	blne	addr_limit_check_failed
>>  	ldr	r1, [tsk, #TI_FLAGS]
>> -	tst	r1, #_TIF_WORK_MASK
>> +	movs	r1, r1, lsl #16
>>  	bne	slow_work_pending
>>  no_work_pending:
>>  	asm_trace_hardirqs_on save = 0
>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
>> index de1f20624be1..d0e898608d30 100644
>> --- a/arch/arm/kernel/entry-v7m.S
>> +++ b/arch/arm/kernel/entry-v7m.S
>> @@ -59,7 +59,7 @@ __irq_entry:
>>  
>>  	get_thread_info tsk
>>  	ldr	r2, [tsk, #TI_FLAGS]
>> -	tst	r2, #_TIF_WORK_MASK
>> +	movs	r2, r2, lsl #16
>>  	beq	2f			@ no work pending
>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
>> index 585edbfccf6d..9d2e916121be 100644
>> --- a/arch/arm/kernel/signal.c
>> +++ b/arch/arm/kernel/signal.c
>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
>>  			if (unlikely(!user_mode(regs)))
>>  				return 0;
>>  			local_irq_enable();
>> -			if (thread_flags & _TIF_SIGPENDING) {
>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
>>  				int restart = do_signal(regs, syscall);
>>  				if (unlikely(restart)) {
>>  					/*
>>
> 
> Looks perfect to me, thanks! I assume the pre-requisits for this are
> already in mainline or linux-next?

Great! Thanks for your expedient attention and help.

The bits using this are queued in tip for 5.11, so not in mainline yet,
but should be in linux-next tomorrow I guess. But it was done such that
arch patches could be queued up independently, so we didn't have weird
cross dependencies.
Russell King (Oracle) Oct. 29, 2020, 5:42 p.m. UTC | #7
On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
> > On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
> >> How about this?
> >>
> >> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
> >> Author: Jens Axboe <axboe@kernel.dk>
> >> Date:   Fri Oct 9 16:00:49 2020 -0600
> >>
> >>     arm: add support for TIF_NOTIFY_SIGNAL
> >>     
> >>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
> >>     
> >>     Cc: linux-arm-kernel@lists.infradead.org
> >>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
> >>
> >> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
> >> index 536b6b979f63..eb7ce2747eb0 100644
> >> --- a/arch/arm/include/asm/thread_info.h
> >> +++ b/arch/arm/include/asm/thread_info.h
> >> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>   * thread information flags:
> >>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
> >>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
> >> + *
> >> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
> >>   */
> >>  #define TIF_SIGPENDING		0	/* signal pending */
> >>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
> >> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
> >>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
> >>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
> >> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
> >>  
> >>  #define TIF_USING_IWMMXT	17
> >>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
> >> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
> >>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
> >>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
> >> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
> >>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
> >>  
> >>  /* Checks for any syscall work in entry-common.S */
> >> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>   * Change these and you break ASM code in entry-common.S
> >>   */
> >>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
> >> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
> >> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
> >> +				 _TIF_NOTIFY_SIGNAL)
> >>  
> >>  #endif /* __KERNEL__ */
> >>  #endif /* __ASM_ARM_THREAD_INFO_H */
> >> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
> >> index 271cb8a1eba1..77d16390a524 100644
> >> --- a/arch/arm/kernel/entry-common.S
> >> +++ b/arch/arm/kernel/entry-common.S
> >> @@ -53,7 +53,7 @@ __ret_fast_syscall:
> >>  	cmp	r2, #TASK_SIZE
> >>  	blne	addr_limit_check_failed
> >>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> >> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> >> +	movs	r1, r1, lsl #16
> >>  	bne	fast_work_pending
> >>  
> >>  
> >> @@ -90,7 +90,7 @@ __ret_fast_syscall:
> >>  	cmp	r2, #TASK_SIZE
> >>  	blne	addr_limit_check_failed
> >>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> >> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> >> +	movs	r1, r1, lsl #16
> >>  	beq	no_work_pending
> >>   UNWIND(.fnend		)
> >>  ENDPROC(ret_fast_syscall)
> >> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
> >>  	cmp	r2, #TASK_SIZE
> >>  	blne	addr_limit_check_failed
> >>  	ldr	r1, [tsk, #TI_FLAGS]
> >> -	tst	r1, #_TIF_WORK_MASK
> >> +	movs	r1, r1, lsl #16
> >>  	bne	slow_work_pending
> >>  no_work_pending:
> >>  	asm_trace_hardirqs_on save = 0
> >> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
> >> index de1f20624be1..d0e898608d30 100644
> >> --- a/arch/arm/kernel/entry-v7m.S
> >> +++ b/arch/arm/kernel/entry-v7m.S
> >> @@ -59,7 +59,7 @@ __irq_entry:
> >>  
> >>  	get_thread_info tsk
> >>  	ldr	r2, [tsk, #TI_FLAGS]
> >> -	tst	r2, #_TIF_WORK_MASK
> >> +	movs	r2, r2, lsl #16
> >>  	beq	2f			@ no work pending
> >>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
> >>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
> >> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
> >> index 585edbfccf6d..9d2e916121be 100644
> >> --- a/arch/arm/kernel/signal.c
> >> +++ b/arch/arm/kernel/signal.c
> >> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
> >>  			if (unlikely(!user_mode(regs)))
> >>  				return 0;
> >>  			local_irq_enable();
> >> -			if (thread_flags & _TIF_SIGPENDING) {
> >> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
> >>  				int restart = do_signal(regs, syscall);
> >>  				if (unlikely(restart)) {
> >>  					/*
> >>
> > 
> > Looks perfect to me, thanks! I assume the pre-requisits for this are
> > already in mainline or linux-next?
> 
> Great! Thanks for your expedient attention and help.
> 
> The bits using this are queued in tip for 5.11, so not in mainline yet,
> but should be in linux-next tomorrow I guess. But it was done such that
> arch patches could be queued up independently, so we didn't have weird
> cross dependencies.

Okay, I'll wait a few days and see about temporarily dumping it in
my for-next branch so it gets a spin through kernelci next week.
I'm not anticipating any breakage, so (if I remember) I'll give you
a reviewed-by next week once it seems good. As I say, if I remember.

Thanks.
Jens Axboe Oct. 29, 2020, 5:50 p.m. UTC | #8
On 10/29/20 11:42 AM, Russell King - ARM Linux admin wrote:
> On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
>> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
>>> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
>>>> How about this?
>>>>
>>>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
>>>> Author: Jens Axboe <axboe@kernel.dk>
>>>> Date:   Fri Oct 9 16:00:49 2020 -0600
>>>>
>>>>     arm: add support for TIF_NOTIFY_SIGNAL
>>>>     
>>>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>>>     
>>>>     Cc: linux-arm-kernel@lists.infradead.org
>>>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>>>
>>>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
>>>> index 536b6b979f63..eb7ce2747eb0 100644
>>>> --- a/arch/arm/include/asm/thread_info.h
>>>> +++ b/arch/arm/include/asm/thread_info.h
>>>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>   * thread information flags:
>>>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
>>>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
>>>> + *
>>>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
>>>>   */
>>>>  #define TIF_SIGPENDING		0	/* signal pending */
>>>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
>>>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>>>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>>>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
>>>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>>>>  
>>>>  #define TIF_USING_IWMMXT	17
>>>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
>>>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>>>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>>>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
>>>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>>>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>>>>  
>>>>  /* Checks for any syscall work in entry-common.S */
>>>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>   * Change these and you break ASM code in entry-common.S
>>>>   */
>>>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
>>>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
>>>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
>>>> +				 _TIF_NOTIFY_SIGNAL)
>>>>  
>>>>  #endif /* __KERNEL__ */
>>>>  #endif /* __ASM_ARM_THREAD_INFO_H */
>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>>>> index 271cb8a1eba1..77d16390a524 100644
>>>> --- a/arch/arm/kernel/entry-common.S
>>>> +++ b/arch/arm/kernel/entry-common.S
>>>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
>>>>  	cmp	r2, #TASK_SIZE
>>>>  	blne	addr_limit_check_failed
>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>> +	movs	r1, r1, lsl #16
>>>>  	bne	fast_work_pending
>>>>  
>>>>  
>>>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
>>>>  	cmp	r2, #TASK_SIZE
>>>>  	blne	addr_limit_check_failed
>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>> +	movs	r1, r1, lsl #16
>>>>  	beq	no_work_pending
>>>>   UNWIND(.fnend		)
>>>>  ENDPROC(ret_fast_syscall)
>>>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
>>>>  	cmp	r2, #TASK_SIZE
>>>>  	blne	addr_limit_check_failed
>>>>  	ldr	r1, [tsk, #TI_FLAGS]
>>>> -	tst	r1, #_TIF_WORK_MASK
>>>> +	movs	r1, r1, lsl #16
>>>>  	bne	slow_work_pending
>>>>  no_work_pending:
>>>>  	asm_trace_hardirqs_on save = 0
>>>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
>>>> index de1f20624be1..d0e898608d30 100644
>>>> --- a/arch/arm/kernel/entry-v7m.S
>>>> +++ b/arch/arm/kernel/entry-v7m.S
>>>> @@ -59,7 +59,7 @@ __irq_entry:
>>>>  
>>>>  	get_thread_info tsk
>>>>  	ldr	r2, [tsk, #TI_FLAGS]
>>>> -	tst	r2, #_TIF_WORK_MASK
>>>> +	movs	r2, r2, lsl #16
>>>>  	beq	2f			@ no work pending
>>>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
>>>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
>>>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
>>>> index 585edbfccf6d..9d2e916121be 100644
>>>> --- a/arch/arm/kernel/signal.c
>>>> +++ b/arch/arm/kernel/signal.c
>>>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
>>>>  			if (unlikely(!user_mode(regs)))
>>>>  				return 0;
>>>>  			local_irq_enable();
>>>> -			if (thread_flags & _TIF_SIGPENDING) {
>>>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
>>>>  				int restart = do_signal(regs, syscall);
>>>>  				if (unlikely(restart)) {
>>>>  					/*
>>>>
>>>
>>> Looks perfect to me, thanks! I assume the pre-requisits for this are
>>> already in mainline or linux-next?
>>
>> Great! Thanks for your expedient attention and help.
>>
>> The bits using this are queued in tip for 5.11, so not in mainline yet,
>> but should be in linux-next tomorrow I guess. But it was done such that
>> arch patches could be queued up independently, so we didn't have weird
>> cross dependencies.
> 
> Okay, I'll wait a few days and see about temporarily dumping it in
> my for-next branch so it gets a spin through kernelci next week.
> I'm not anticipating any breakage, so (if I remember) I'll give you
> a reviewed-by next week once it seems good. As I say, if I remember.

Thanks! I sent out 23 of these today, I'll do some followup next week
if need be :-)
Jens Axboe Nov. 3, 2020, 3:11 p.m. UTC | #9
On 10/29/20 11:42 AM, Russell King - ARM Linux admin wrote:
> On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
>> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
>>> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
>>>> How about this?
>>>>
>>>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
>>>> Author: Jens Axboe <axboe@kernel.dk>
>>>> Date:   Fri Oct 9 16:00:49 2020 -0600
>>>>
>>>>     arm: add support for TIF_NOTIFY_SIGNAL
>>>>     
>>>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>>>     
>>>>     Cc: linux-arm-kernel@lists.infradead.org
>>>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>>>
>>>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
>>>> index 536b6b979f63..eb7ce2747eb0 100644
>>>> --- a/arch/arm/include/asm/thread_info.h
>>>> +++ b/arch/arm/include/asm/thread_info.h
>>>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>   * thread information flags:
>>>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
>>>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
>>>> + *
>>>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
>>>>   */
>>>>  #define TIF_SIGPENDING		0	/* signal pending */
>>>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
>>>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>>>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>>>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
>>>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>>>>  
>>>>  #define TIF_USING_IWMMXT	17
>>>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
>>>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>>>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>>>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
>>>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>>>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>>>>  
>>>>  /* Checks for any syscall work in entry-common.S */
>>>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>   * Change these and you break ASM code in entry-common.S
>>>>   */
>>>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
>>>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
>>>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
>>>> +				 _TIF_NOTIFY_SIGNAL)
>>>>  
>>>>  #endif /* __KERNEL__ */
>>>>  #endif /* __ASM_ARM_THREAD_INFO_H */
>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>>>> index 271cb8a1eba1..77d16390a524 100644
>>>> --- a/arch/arm/kernel/entry-common.S
>>>> +++ b/arch/arm/kernel/entry-common.S
>>>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
>>>>  	cmp	r2, #TASK_SIZE
>>>>  	blne	addr_limit_check_failed
>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>> +	movs	r1, r1, lsl #16
>>>>  	bne	fast_work_pending
>>>>  
>>>>  
>>>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
>>>>  	cmp	r2, #TASK_SIZE
>>>>  	blne	addr_limit_check_failed
>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>> +	movs	r1, r1, lsl #16
>>>>  	beq	no_work_pending
>>>>   UNWIND(.fnend		)
>>>>  ENDPROC(ret_fast_syscall)
>>>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
>>>>  	cmp	r2, #TASK_SIZE
>>>>  	blne	addr_limit_check_failed
>>>>  	ldr	r1, [tsk, #TI_FLAGS]
>>>> -	tst	r1, #_TIF_WORK_MASK
>>>> +	movs	r1, r1, lsl #16
>>>>  	bne	slow_work_pending
>>>>  no_work_pending:
>>>>  	asm_trace_hardirqs_on save = 0
>>>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
>>>> index de1f20624be1..d0e898608d30 100644
>>>> --- a/arch/arm/kernel/entry-v7m.S
>>>> +++ b/arch/arm/kernel/entry-v7m.S
>>>> @@ -59,7 +59,7 @@ __irq_entry:
>>>>  
>>>>  	get_thread_info tsk
>>>>  	ldr	r2, [tsk, #TI_FLAGS]
>>>> -	tst	r2, #_TIF_WORK_MASK
>>>> +	movs	r2, r2, lsl #16
>>>>  	beq	2f			@ no work pending
>>>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
>>>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
>>>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
>>>> index 585edbfccf6d..9d2e916121be 100644
>>>> --- a/arch/arm/kernel/signal.c
>>>> +++ b/arch/arm/kernel/signal.c
>>>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
>>>>  			if (unlikely(!user_mode(regs)))
>>>>  				return 0;
>>>>  			local_irq_enable();
>>>> -			if (thread_flags & _TIF_SIGPENDING) {
>>>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
>>>>  				int restart = do_signal(regs, syscall);
>>>>  				if (unlikely(restart)) {
>>>>  					/*
>>>>
>>>
>>> Looks perfect to me, thanks! I assume the pre-requisits for this are
>>> already in mainline or linux-next?
>>
>> Great! Thanks for your expedient attention and help.
>>
>> The bits using this are queued in tip for 5.11, so not in mainline yet,
>> but should be in linux-next tomorrow I guess. But it was done such that
>> arch patches could be queued up independently, so we didn't have weird
>> cross dependencies.
> 
> Okay, I'll wait a few days and see about temporarily dumping it in
> my for-next branch so it gets a spin through kernelci next week.
> I'm not anticipating any breakage, so (if I remember) I'll give you
> a reviewed-by next week once it seems good. As I say, if I remember.

Russell, did you have a chance to run it through the machinery?
Russell King (Oracle) Nov. 12, 2020, 3:32 p.m. UTC | #10
On Tue, Nov 03, 2020 at 08:11:49AM -0700, Jens Axboe wrote:
> On 10/29/20 11:42 AM, Russell King - ARM Linux admin wrote:
> > On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
> >> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
> >>> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
> >>>> How about this?
> >>>>
> >>>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
> >>>> Author: Jens Axboe <axboe@kernel.dk>
> >>>> Date:   Fri Oct 9 16:00:49 2020 -0600
> >>>>
> >>>>     arm: add support for TIF_NOTIFY_SIGNAL
> >>>>     
> >>>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
> >>>>     
> >>>>     Cc: linux-arm-kernel@lists.infradead.org
> >>>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
> >>>>
> >>>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
> >>>> index 536b6b979f63..eb7ce2747eb0 100644
> >>>> --- a/arch/arm/include/asm/thread_info.h
> >>>> +++ b/arch/arm/include/asm/thread_info.h
> >>>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>   * thread information flags:
> >>>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
> >>>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
> >>>> + *
> >>>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
> >>>>   */
> >>>>  #define TIF_SIGPENDING		0	/* signal pending */
> >>>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
> >>>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
> >>>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
> >>>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
> >>>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
> >>>>  
> >>>>  #define TIF_USING_IWMMXT	17
> >>>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
> >>>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
> >>>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
> >>>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
> >>>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
> >>>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
> >>>>  
> >>>>  /* Checks for any syscall work in entry-common.S */
> >>>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>   * Change these and you break ASM code in entry-common.S
> >>>>   */
> >>>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
> >>>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
> >>>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
> >>>> +				 _TIF_NOTIFY_SIGNAL)
> >>>>  
> >>>>  #endif /* __KERNEL__ */
> >>>>  #endif /* __ASM_ARM_THREAD_INFO_H */
> >>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
> >>>> index 271cb8a1eba1..77d16390a524 100644
> >>>> --- a/arch/arm/kernel/entry-common.S
> >>>> +++ b/arch/arm/kernel/entry-common.S
> >>>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
> >>>>  	cmp	r2, #TASK_SIZE
> >>>>  	blne	addr_limit_check_failed
> >>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> >>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> >>>> +	movs	r1, r1, lsl #16
> >>>>  	bne	fast_work_pending
> >>>>  
> >>>>  
> >>>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
> >>>>  	cmp	r2, #TASK_SIZE
> >>>>  	blne	addr_limit_check_failed
> >>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> >>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> >>>> +	movs	r1, r1, lsl #16
> >>>>  	beq	no_work_pending
> >>>>   UNWIND(.fnend		)
> >>>>  ENDPROC(ret_fast_syscall)
> >>>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
> >>>>  	cmp	r2, #TASK_SIZE
> >>>>  	blne	addr_limit_check_failed
> >>>>  	ldr	r1, [tsk, #TI_FLAGS]
> >>>> -	tst	r1, #_TIF_WORK_MASK
> >>>> +	movs	r1, r1, lsl #16
> >>>>  	bne	slow_work_pending
> >>>>  no_work_pending:
> >>>>  	asm_trace_hardirqs_on save = 0
> >>>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
> >>>> index de1f20624be1..d0e898608d30 100644
> >>>> --- a/arch/arm/kernel/entry-v7m.S
> >>>> +++ b/arch/arm/kernel/entry-v7m.S
> >>>> @@ -59,7 +59,7 @@ __irq_entry:
> >>>>  
> >>>>  	get_thread_info tsk
> >>>>  	ldr	r2, [tsk, #TI_FLAGS]
> >>>> -	tst	r2, #_TIF_WORK_MASK
> >>>> +	movs	r2, r2, lsl #16
> >>>>  	beq	2f			@ no work pending
> >>>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
> >>>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
> >>>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
> >>>> index 585edbfccf6d..9d2e916121be 100644
> >>>> --- a/arch/arm/kernel/signal.c
> >>>> +++ b/arch/arm/kernel/signal.c
> >>>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
> >>>>  			if (unlikely(!user_mode(regs)))
> >>>>  				return 0;
> >>>>  			local_irq_enable();
> >>>> -			if (thread_flags & _TIF_SIGPENDING) {
> >>>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
> >>>>  				int restart = do_signal(regs, syscall);
> >>>>  				if (unlikely(restart)) {
> >>>>  					/*
> >>>>
> >>>
> >>> Looks perfect to me, thanks! I assume the pre-requisits for this are
> >>> already in mainline or linux-next?
> >>
> >> Great! Thanks for your expedient attention and help.
> >>
> >> The bits using this are queued in tip for 5.11, so not in mainline yet,
> >> but should be in linux-next tomorrow I guess. But it was done such that
> >> arch patches could be queued up independently, so we didn't have weird
> >> cross dependencies.
> > 
> > Okay, I'll wait a few days and see about temporarily dumping it in
> > my for-next branch so it gets a spin through kernelci next week.
> > I'm not anticipating any breakage, so (if I remember) I'll give you
> > a reviewed-by next week once it seems good. As I say, if I remember.
> 
> Russell, did you have a chance to run it through the machinery?

I threw the patch on top of my for-next branch, and let the various
autobuilders chew on it for a few days. I haven't had any reports
back, not even of any breakage through me adding it to my tree.

I guess that's a positive indication.
Jens Axboe Nov. 12, 2020, 3:42 p.m. UTC | #11
On 11/12/20 8:32 AM, Russell King - ARM Linux admin wrote:
> On Tue, Nov 03, 2020 at 08:11:49AM -0700, Jens Axboe wrote:
>> On 10/29/20 11:42 AM, Russell King - ARM Linux admin wrote:
>>> On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
>>>> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
>>>>> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
>>>>>> How about this?
>>>>>>
>>>>>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
>>>>>> Author: Jens Axboe <axboe@kernel.dk>
>>>>>> Date:   Fri Oct 9 16:00:49 2020 -0600
>>>>>>
>>>>>>     arm: add support for TIF_NOTIFY_SIGNAL
>>>>>>     
>>>>>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>>>>>     
>>>>>>     Cc: linux-arm-kernel@lists.infradead.org
>>>>>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>>>>>
>>>>>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
>>>>>> index 536b6b979f63..eb7ce2747eb0 100644
>>>>>> --- a/arch/arm/include/asm/thread_info.h
>>>>>> +++ b/arch/arm/include/asm/thread_info.h
>>>>>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>   * thread information flags:
>>>>>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
>>>>>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
>>>>>> + *
>>>>>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
>>>>>>   */
>>>>>>  #define TIF_SIGPENDING		0	/* signal pending */
>>>>>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
>>>>>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>>>>>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>>>>>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
>>>>>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>>>>>>  
>>>>>>  #define TIF_USING_IWMMXT	17
>>>>>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
>>>>>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>>>>>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>>>>>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
>>>>>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>>>>>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>>>>>>  
>>>>>>  /* Checks for any syscall work in entry-common.S */
>>>>>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>   * Change these and you break ASM code in entry-common.S
>>>>>>   */
>>>>>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
>>>>>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
>>>>>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
>>>>>> +				 _TIF_NOTIFY_SIGNAL)
>>>>>>  
>>>>>>  #endif /* __KERNEL__ */
>>>>>>  #endif /* __ASM_ARM_THREAD_INFO_H */
>>>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>>>>>> index 271cb8a1eba1..77d16390a524 100644
>>>>>> --- a/arch/arm/kernel/entry-common.S
>>>>>> +++ b/arch/arm/kernel/entry-common.S
>>>>>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
>>>>>>  	cmp	r2, #TASK_SIZE
>>>>>>  	blne	addr_limit_check_failed
>>>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>>>> +	movs	r1, r1, lsl #16
>>>>>>  	bne	fast_work_pending
>>>>>>  
>>>>>>  
>>>>>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
>>>>>>  	cmp	r2, #TASK_SIZE
>>>>>>  	blne	addr_limit_check_failed
>>>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>>>> +	movs	r1, r1, lsl #16
>>>>>>  	beq	no_work_pending
>>>>>>   UNWIND(.fnend		)
>>>>>>  ENDPROC(ret_fast_syscall)
>>>>>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
>>>>>>  	cmp	r2, #TASK_SIZE
>>>>>>  	blne	addr_limit_check_failed
>>>>>>  	ldr	r1, [tsk, #TI_FLAGS]
>>>>>> -	tst	r1, #_TIF_WORK_MASK
>>>>>> +	movs	r1, r1, lsl #16
>>>>>>  	bne	slow_work_pending
>>>>>>  no_work_pending:
>>>>>>  	asm_trace_hardirqs_on save = 0
>>>>>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
>>>>>> index de1f20624be1..d0e898608d30 100644
>>>>>> --- a/arch/arm/kernel/entry-v7m.S
>>>>>> +++ b/arch/arm/kernel/entry-v7m.S
>>>>>> @@ -59,7 +59,7 @@ __irq_entry:
>>>>>>  
>>>>>>  	get_thread_info tsk
>>>>>>  	ldr	r2, [tsk, #TI_FLAGS]
>>>>>> -	tst	r2, #_TIF_WORK_MASK
>>>>>> +	movs	r2, r2, lsl #16
>>>>>>  	beq	2f			@ no work pending
>>>>>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
>>>>>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
>>>>>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
>>>>>> index 585edbfccf6d..9d2e916121be 100644
>>>>>> --- a/arch/arm/kernel/signal.c
>>>>>> +++ b/arch/arm/kernel/signal.c
>>>>>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
>>>>>>  			if (unlikely(!user_mode(regs)))
>>>>>>  				return 0;
>>>>>>  			local_irq_enable();
>>>>>> -			if (thread_flags & _TIF_SIGPENDING) {
>>>>>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
>>>>>>  				int restart = do_signal(regs, syscall);
>>>>>>  				if (unlikely(restart)) {
>>>>>>  					/*
>>>>>>
>>>>>
>>>>> Looks perfect to me, thanks! I assume the pre-requisits for this are
>>>>> already in mainline or linux-next?
>>>>
>>>> Great! Thanks for your expedient attention and help.
>>>>
>>>> The bits using this are queued in tip for 5.11, so not in mainline yet,
>>>> but should be in linux-next tomorrow I guess. But it was done such that
>>>> arch patches could be queued up independently, so we didn't have weird
>>>> cross dependencies.
>>>
>>> Okay, I'll wait a few days and see about temporarily dumping it in
>>> my for-next branch so it gets a spin through kernelci next week.
>>> I'm not anticipating any breakage, so (if I remember) I'll give you
>>> a reviewed-by next week once it seems good. As I say, if I remember.
>>
>> Russell, did you have a chance to run it through the machinery?
> 
> I threw the patch on top of my for-next branch, and let the various
> autobuilders chew on it for a few days. I haven't had any reports
> back, not even of any breakage through me adding it to my tree.
> 
> I guess that's a positive indication.

Good enough to add your acked-by?
Russell King (Oracle) Nov. 12, 2020, 3:44 p.m. UTC | #12
On Thu, Nov 12, 2020 at 08:42:55AM -0700, Jens Axboe wrote:
> On 11/12/20 8:32 AM, Russell King - ARM Linux admin wrote:
> > On Tue, Nov 03, 2020 at 08:11:49AM -0700, Jens Axboe wrote:
> >> On 10/29/20 11:42 AM, Russell King - ARM Linux admin wrote:
> >>> On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
> >>>> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
> >>>>> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
> >>>>>> How about this?
> >>>>>>
> >>>>>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
> >>>>>> Author: Jens Axboe <axboe@kernel.dk>
> >>>>>> Date:   Fri Oct 9 16:00:49 2020 -0600
> >>>>>>
> >>>>>>     arm: add support for TIF_NOTIFY_SIGNAL
> >>>>>>     
> >>>>>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
> >>>>>>     
> >>>>>>     Cc: linux-arm-kernel@lists.infradead.org
> >>>>>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
> >>>>>>
> >>>>>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
> >>>>>> index 536b6b979f63..eb7ce2747eb0 100644
> >>>>>> --- a/arch/arm/include/asm/thread_info.h
> >>>>>> +++ b/arch/arm/include/asm/thread_info.h
> >>>>>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>>>   * thread information flags:
> >>>>>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
> >>>>>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
> >>>>>> + *
> >>>>>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
> >>>>>>   */
> >>>>>>  #define TIF_SIGPENDING		0	/* signal pending */
> >>>>>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
> >>>>>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
> >>>>>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
> >>>>>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
> >>>>>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
> >>>>>>  
> >>>>>>  #define TIF_USING_IWMMXT	17
> >>>>>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
> >>>>>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
> >>>>>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
> >>>>>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
> >>>>>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
> >>>>>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
> >>>>>>  
> >>>>>>  /* Checks for any syscall work in entry-common.S */
> >>>>>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
> >>>>>>   * Change these and you break ASM code in entry-common.S
> >>>>>>   */
> >>>>>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
> >>>>>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
> >>>>>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
> >>>>>> +				 _TIF_NOTIFY_SIGNAL)
> >>>>>>  
> >>>>>>  #endif /* __KERNEL__ */
> >>>>>>  #endif /* __ASM_ARM_THREAD_INFO_H */
> >>>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
> >>>>>> index 271cb8a1eba1..77d16390a524 100644
> >>>>>> --- a/arch/arm/kernel/entry-common.S
> >>>>>> +++ b/arch/arm/kernel/entry-common.S
> >>>>>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
> >>>>>>  	cmp	r2, #TASK_SIZE
> >>>>>>  	blne	addr_limit_check_failed
> >>>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> >>>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> >>>>>> +	movs	r1, r1, lsl #16
> >>>>>>  	bne	fast_work_pending
> >>>>>>  
> >>>>>>  
> >>>>>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
> >>>>>>  	cmp	r2, #TASK_SIZE
> >>>>>>  	blne	addr_limit_check_failed
> >>>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
> >>>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
> >>>>>> +	movs	r1, r1, lsl #16
> >>>>>>  	beq	no_work_pending
> >>>>>>   UNWIND(.fnend		)
> >>>>>>  ENDPROC(ret_fast_syscall)
> >>>>>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
> >>>>>>  	cmp	r2, #TASK_SIZE
> >>>>>>  	blne	addr_limit_check_failed
> >>>>>>  	ldr	r1, [tsk, #TI_FLAGS]
> >>>>>> -	tst	r1, #_TIF_WORK_MASK
> >>>>>> +	movs	r1, r1, lsl #16
> >>>>>>  	bne	slow_work_pending
> >>>>>>  no_work_pending:
> >>>>>>  	asm_trace_hardirqs_on save = 0
> >>>>>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
> >>>>>> index de1f20624be1..d0e898608d30 100644
> >>>>>> --- a/arch/arm/kernel/entry-v7m.S
> >>>>>> +++ b/arch/arm/kernel/entry-v7m.S
> >>>>>> @@ -59,7 +59,7 @@ __irq_entry:
> >>>>>>  
> >>>>>>  	get_thread_info tsk
> >>>>>>  	ldr	r2, [tsk, #TI_FLAGS]
> >>>>>> -	tst	r2, #_TIF_WORK_MASK
> >>>>>> +	movs	r2, r2, lsl #16
> >>>>>>  	beq	2f			@ no work pending
> >>>>>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
> >>>>>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
> >>>>>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
> >>>>>> index 585edbfccf6d..9d2e916121be 100644
> >>>>>> --- a/arch/arm/kernel/signal.c
> >>>>>> +++ b/arch/arm/kernel/signal.c
> >>>>>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
> >>>>>>  			if (unlikely(!user_mode(regs)))
> >>>>>>  				return 0;
> >>>>>>  			local_irq_enable();
> >>>>>> -			if (thread_flags & _TIF_SIGPENDING) {
> >>>>>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
> >>>>>>  				int restart = do_signal(regs, syscall);
> >>>>>>  				if (unlikely(restart)) {
> >>>>>>  					/*
> >>>>>>
> >>>>>
> >>>>> Looks perfect to me, thanks! I assume the pre-requisits for this are
> >>>>> already in mainline or linux-next?
> >>>>
> >>>> Great! Thanks for your expedient attention and help.
> >>>>
> >>>> The bits using this are queued in tip for 5.11, so not in mainline yet,
> >>>> but should be in linux-next tomorrow I guess. But it was done such that
> >>>> arch patches could be queued up independently, so we didn't have weird
> >>>> cross dependencies.
> >>>
> >>> Okay, I'll wait a few days and see about temporarily dumping it in
> >>> my for-next branch so it gets a spin through kernelci next week.
> >>> I'm not anticipating any breakage, so (if I remember) I'll give you
> >>> a reviewed-by next week once it seems good. As I say, if I remember.
> >>
> >> Russell, did you have a chance to run it through the machinery?
> > 
> > I threw the patch on top of my for-next branch, and let the various
> > autobuilders chew on it for a few days. I haven't had any reports
> > back, not even of any breakage through me adding it to my tree.
> > 
> > I guess that's a positive indication.
> 
> Good enough to add your acked-by?

I guess.

Acked-by: Russell King <rmk+kernel@armlinux.org.uk>

Thanks.
Jens Axboe Nov. 12, 2020, 3:51 p.m. UTC | #13
On 11/12/20 8:44 AM, Russell King - ARM Linux admin wrote:
> On Thu, Nov 12, 2020 at 08:42:55AM -0700, Jens Axboe wrote:
>> On 11/12/20 8:32 AM, Russell King - ARM Linux admin wrote:
>>> On Tue, Nov 03, 2020 at 08:11:49AM -0700, Jens Axboe wrote:
>>>> On 10/29/20 11:42 AM, Russell King - ARM Linux admin wrote:
>>>>> On Thu, Oct 29, 2020 at 11:20:07AM -0600, Jens Axboe wrote:
>>>>>> On 10/29/20 11:17 AM, Russell King - ARM Linux admin wrote:
>>>>>>> On Thu, Oct 29, 2020 at 11:15:37AM -0600, Jens Axboe wrote:
>>>>>>>> How about this?
>>>>>>>>
>>>>>>>> commit c03932936d8f99ff7c1c6c7d984e7a457284396c
>>>>>>>> Author: Jens Axboe <axboe@kernel.dk>
>>>>>>>> Date:   Fri Oct 9 16:00:49 2020 -0600
>>>>>>>>
>>>>>>>>     arm: add support for TIF_NOTIFY_SIGNAL
>>>>>>>>     
>>>>>>>>     Wire up TIF_NOTIFY_SIGNAL handling for arm.
>>>>>>>>     
>>>>>>>>     Cc: linux-arm-kernel@lists.infradead.org
>>>>>>>>     Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>>>>>>>
>>>>>>>> diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
>>>>>>>> index 536b6b979f63..eb7ce2747eb0 100644
>>>>>>>> --- a/arch/arm/include/asm/thread_info.h
>>>>>>>> +++ b/arch/arm/include/asm/thread_info.h
>>>>>>>> @@ -126,6 +126,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>>>   * thread information flags:
>>>>>>>>   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)
>>>>>>>>   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED
>>>>>>>> + *
>>>>>>>> + * Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
>>>>>>>>   */
>>>>>>>>  #define TIF_SIGPENDING		0	/* signal pending */
>>>>>>>>  #define TIF_NEED_RESCHED	1	/* rescheduling necessary */
>>>>>>>> @@ -135,6 +137,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>>>  #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
>>>>>>>>  #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
>>>>>>>>  #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
>>>>>>>> +#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
>>>>>>>>  
>>>>>>>>  #define TIF_USING_IWMMXT	17
>>>>>>>>  #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
>>>>>>>> @@ -148,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>>>  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
>>>>>>>>  #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
>>>>>>>>  #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
>>>>>>>> +#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
>>>>>>>>  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
>>>>>>>>  
>>>>>>>>  /* Checks for any syscall work in entry-common.S */
>>>>>>>> @@ -158,7 +162,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
>>>>>>>>   * Change these and you break ASM code in entry-common.S
>>>>>>>>   */
>>>>>>>>  #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
>>>>>>>> -				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
>>>>>>>> +				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
>>>>>>>> +				 _TIF_NOTIFY_SIGNAL)
>>>>>>>>  
>>>>>>>>  #endif /* __KERNEL__ */
>>>>>>>>  #endif /* __ASM_ARM_THREAD_INFO_H */
>>>>>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>>>>>>>> index 271cb8a1eba1..77d16390a524 100644
>>>>>>>> --- a/arch/arm/kernel/entry-common.S
>>>>>>>> +++ b/arch/arm/kernel/entry-common.S
>>>>>>>> @@ -53,7 +53,7 @@ __ret_fast_syscall:
>>>>>>>>  	cmp	r2, #TASK_SIZE
>>>>>>>>  	blne	addr_limit_check_failed
>>>>>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>>>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>>>>>> +	movs	r1, r1, lsl #16
>>>>>>>>  	bne	fast_work_pending
>>>>>>>>  
>>>>>>>>  
>>>>>>>> @@ -90,7 +90,7 @@ __ret_fast_syscall:
>>>>>>>>  	cmp	r2, #TASK_SIZE
>>>>>>>>  	blne	addr_limit_check_failed
>>>>>>>>  	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
>>>>>>>> -	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
>>>>>>>> +	movs	r1, r1, lsl #16
>>>>>>>>  	beq	no_work_pending
>>>>>>>>   UNWIND(.fnend		)
>>>>>>>>  ENDPROC(ret_fast_syscall)
>>>>>>>> @@ -131,7 +131,7 @@ ENTRY(ret_to_user_from_irq)
>>>>>>>>  	cmp	r2, #TASK_SIZE
>>>>>>>>  	blne	addr_limit_check_failed
>>>>>>>>  	ldr	r1, [tsk, #TI_FLAGS]
>>>>>>>> -	tst	r1, #_TIF_WORK_MASK
>>>>>>>> +	movs	r1, r1, lsl #16
>>>>>>>>  	bne	slow_work_pending
>>>>>>>>  no_work_pending:
>>>>>>>>  	asm_trace_hardirqs_on save = 0
>>>>>>>> diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
>>>>>>>> index de1f20624be1..d0e898608d30 100644
>>>>>>>> --- a/arch/arm/kernel/entry-v7m.S
>>>>>>>> +++ b/arch/arm/kernel/entry-v7m.S
>>>>>>>> @@ -59,7 +59,7 @@ __irq_entry:
>>>>>>>>  
>>>>>>>>  	get_thread_info tsk
>>>>>>>>  	ldr	r2, [tsk, #TI_FLAGS]
>>>>>>>> -	tst	r2, #_TIF_WORK_MASK
>>>>>>>> +	movs	r2, r2, lsl #16
>>>>>>>>  	beq	2f			@ no work pending
>>>>>>>>  	mov	r0, #V7M_SCB_ICSR_PENDSVSET
>>>>>>>>  	str	r0, [r1, V7M_SCB_ICSR]	@ raise PendSV
>>>>>>>> diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
>>>>>>>> index 585edbfccf6d..9d2e916121be 100644
>>>>>>>> --- a/arch/arm/kernel/signal.c
>>>>>>>> +++ b/arch/arm/kernel/signal.c
>>>>>>>> @@ -655,7 +655,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
>>>>>>>>  			if (unlikely(!user_mode(regs)))
>>>>>>>>  				return 0;
>>>>>>>>  			local_irq_enable();
>>>>>>>> -			if (thread_flags & _TIF_SIGPENDING) {
>>>>>>>> +			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
>>>>>>>>  				int restart = do_signal(regs, syscall);
>>>>>>>>  				if (unlikely(restart)) {
>>>>>>>>  					/*
>>>>>>>>
>>>>>>>
>>>>>>> Looks perfect to me, thanks! I assume the pre-requisits for this are
>>>>>>> already in mainline or linux-next?
>>>>>>
>>>>>> Great! Thanks for your expedient attention and help.
>>>>>>
>>>>>> The bits using this are queued in tip for 5.11, so not in mainline yet,
>>>>>> but should be in linux-next tomorrow I guess. But it was done such that
>>>>>> arch patches could be queued up independently, so we didn't have weird
>>>>>> cross dependencies.
>>>>>
>>>>> Okay, I'll wait a few days and see about temporarily dumping it in
>>>>> my for-next branch so it gets a spin through kernelci next week.
>>>>> I'm not anticipating any breakage, so (if I remember) I'll give you
>>>>> a reviewed-by next week once it seems good. As I say, if I remember.
>>>>
>>>> Russell, did you have a chance to run it through the machinery?
>>>
>>> I threw the patch on top of my for-next branch, and let the various
>>> autobuilders chew on it for a few days. I haven't had any reports
>>> back, not even of any breakage through me adding it to my tree.
>>>
>>> I guess that's a positive indication.
>>
>> Good enough to add your acked-by?
> 
> I guess.
> 
> Acked-by: Russell King <rmk+kernel@armlinux.org.uk>

Thanks Russell, added.
diff mbox series

Patch

diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
index 536b6b979f63..fec16d770180 100644
--- a/arch/arm/include/asm/thread_info.h
+++ b/arch/arm/include/asm/thread_info.h
@@ -135,6 +135,7 @@  extern int vfp_restore_user_hwstate(struct user_vfp *,
 #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
 #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
 #define TIF_SECCOMP		7	/* seccomp syscall filtering active */
+#define TIF_NOTIFY_SIGNAL	8	/* signal notifications exist */
 
 #define TIF_USING_IWMMXT	17
 #define TIF_MEMDIE		18	/* is terminating due to OOM killer */
@@ -148,6 +149,7 @@  extern int vfp_restore_user_hwstate(struct user_vfp *,
 #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
 #define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
 #define _TIF_SECCOMP		(1 << TIF_SECCOMP)
+#define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
 #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)
 
 /* Checks for any syscall work in entry-common.S */
@@ -158,7 +160,8 @@  extern int vfp_restore_user_hwstate(struct user_vfp *,
  * Change these and you break ASM code in entry-common.S
  */
 #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
-				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
+				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
+				 _TIF_NOTIFY_SIGNAL)
 
 #endif /* __KERNEL__ */
 #endif /* __ASM_ARM_THREAD_INFO_H */
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 271cb8a1eba1..7485b58673b4 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -53,7 +53,8 @@  __ret_fast_syscall:
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	ldr	r2, =#_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	tst	r1, r2
 	bne	fast_work_pending
 
 
@@ -90,7 +91,8 @@  __ret_fast_syscall:
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	ldr	r2, =#_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	tst	r1, r2
 	beq	no_work_pending
  UNWIND(.fnend		)
 ENDPROC(ret_fast_syscall)
@@ -131,7 +133,8 @@  ENTRY(ret_to_user_from_irq)
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]
-	tst	r1, #_TIF_WORK_MASK
+	ldr	r2, =#_TIF_WORK_MASK
+	tst	r1, r2
 	bne	slow_work_pending
 no_work_pending:
 	asm_trace_hardirqs_on save = 0
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index 585edbfccf6d..9d2e916121be 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -655,7 +655,7 @@  do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
 			if (unlikely(!user_mode(regs)))
 				return 0;
 			local_irq_enable();
-			if (thread_flags & _TIF_SIGPENDING) {
+			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
 				int restart = do_signal(regs, syscall);
 				if (unlikely(restart)) {
 					/*