[PATCH] arc: add support for TIF_NOTIFY_SIGNAL

Vineet Gupta Vineet.Gupta1 at synopsys.com
Fri Oct 30 16:08:06 EDT 2020


On 10/30/20 11:53 AM, Jens Axboe wrote:
>
> Ah thanks, I'll make that change. Hard for me to test a lot of these, so
> I really appreciate someone knowledgable taking a look at it.

Sure, glad to help, thx to you for writing the arch patches in first 
place. It takes a bit of daring to venture in unchartered waters ;-)

These days it is super easy to get your hands on a ARC cross toolchain. 
We don't have them shipping as regular distro packages just yet, but you 
can download a prebuilt @
https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/releases/download/arc-2020.09-release/arc_gnu_2020.09_prebuilt_glibc_le_archs_linux_install.tar.gz

Or you can just build upstream gcc + binutils for ARC if you so prefer.


>>>    
>>>    	; Normal Trap/IRQ entry only saves Scratch (caller-saved) regs
>>>    	; in pt_reg since the "C" ABI (kernel code) will automatically
>>> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
>>> index 2be55fb96d87..a78d8f745a67 100644
>>> --- a/arch/arc/kernel/signal.c
>>> +++ b/arch/arc/kernel/signal.c
>>> @@ -362,7 +362,7 @@ void do_signal(struct pt_regs *regs)
>>>    
>>>    	restart_scall = in_syscall(regs) && syscall_restartable(regs);
>>>    
>>> -	if (get_signal(&ksig)) {
>>> +	if (test_thread_flag(TIF_SIGPENDING) && get_signal(&ksig)) {
>>>    		if (restart_scall) {
>>>    			arc_restart_syscall(&ksig.ka, regs);
>>>    			syscall_wont_restart(regs);	/* No more restarts */
>>
>> I've not seen your entire patchset, but it seems we are now hitting
>> do_signal() for either of TIF_{SIGPENDING|NOTIFY_SIGNAL} but then only
>> handling signal for TIF_SIGPENDING, so why even bother to come here. Do
>> you plan to add additional arch handling later ?
> Nope, that's all that's needed for each arch. The behavior you describe
> is how it works. It makes it so that TIF_SIGPENDING will do the signal
> delivery and syscall restart as it always has done, but
> TIF_NOTIFY_SIGNAL will only do the syscall restart. The latter is the
> intent, hence TIF_NOTIFY_SIGNAL provides a way to interrupt a process
> and have it process task_work without going through signal delivery like
> task_work with TWA_SIGNAL does today.

Nice, thx for explaining that.

>
> Updated version below:
>
>
> commit 3c6239647d95d03d1436bc826a004791c3f04617
> Author: Jens Axboe <axboe at kernel.dk>
> Date:   Mon Oct 12 07:15:37 2020 -0600
>
>      arc: add support for TIF_NOTIFY_SIGNAL
>      
>      Wire up TIF_NOTIFY_SIGNAL handling for arc.
>      
>      Cc: linux-snps-arc at lists.infradead.org
>      Signed-off-by: Jens Axboe <axboe at kernel.dk>

Acked-by: Vineet Gupta <vgupta at synopsys.com>

>
> diff --git a/arch/arc/include/asm/thread_info.h b/arch/arc/include/asm/thread_info.h
> index f9eef0e8f0b7..c0942c24d401 100644
> --- a/arch/arc/include/asm/thread_info.h
> +++ b/arch/arc/include/asm/thread_info.h
> @@ -79,6 +79,7 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void)
>   #define TIF_SIGPENDING		2	/* signal pending */
>   #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
>   #define TIF_SYSCALL_AUDIT	4	/* syscall auditing active */
> +#define TIF_NOTIFY_SIGNAL	5	/* signal notifications exist */
>   #define TIF_SYSCALL_TRACE	15	/* syscall trace active */
>   
>   /* true if poll_idle() is polling TIF_NEED_RESCHED */
> @@ -89,11 +90,12 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void)
>   #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
>   #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
>   #define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
> +#define _TIF_NOTIFY_SIGNAL	(1<<TIF_NOTIFY_SIGNAL)
>   #define _TIF_MEMDIE		(1<<TIF_MEMDIE)
>   
>   /* work to do on interrupt/exception return */
>   #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
> -				 _TIF_NOTIFY_RESUME)
> +				 _TIF_NOTIFY_RESUME | _TIF_NOTIFY_SIGNAL)
>   
>   /*
>    * _TIF_ALLWORK_MASK includes SYSCALL_TRACE, but we don't need it.
> diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
> index ea00c8a17f07..1f5308abf36d 100644
> --- a/arch/arc/kernel/entry.S
> +++ b/arch/arc/kernel/entry.S
> @@ -307,7 +307,8 @@ resume_user_mode_begin:
>   	mov r0, sp	; pt_regs for arg to do_signal()/do_notify_resume()
>   
>   	GET_CURR_THR_INFO_FLAGS   r9
> -	bbit0  r9, TIF_SIGPENDING, .Lchk_notify_resume
> +	and.f  0,  r9, TIF_SIGPENDING|TIF_NOTIFY_SIGNAL
> +	bz .Lchk_notify_resume
>   
>   	; Normal Trap/IRQ entry only saves Scratch (caller-saved) regs
>   	; in pt_reg since the "C" ABI (kernel code) will automatically
> diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
> index 2be55fb96d87..a78d8f745a67 100644
> --- a/arch/arc/kernel/signal.c
> +++ b/arch/arc/kernel/signal.c
> @@ -362,7 +362,7 @@ void do_signal(struct pt_regs *regs)
>   
>   	restart_scall = in_syscall(regs) && syscall_restartable(regs);
>   
> -	if (get_signal(&ksig)) {
> +	if (test_thread_flag(TIF_SIGPENDING) && get_signal(&ksig)) {
>   		if (restart_scall) {
>   			arc_restart_syscall(&ksig.ka, regs);
>   			syscall_wont_restart(regs);	/* No more restarts */
>



More information about the linux-snps-arc mailing list