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 <ax...@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@lists.infradead.org > Signed-off-by: Jens Axboe <ax...@kernel.dk> Acked-by: Vineet Gupta <vgu...@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 */ > _______________________________________________ linux-snps-arc mailing list linux-snps-arc@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-snps-arc