s390: add support for TIF_NOTIFY_SIGNAL
authorJens Axboe <axboe@kernel.dk>
Fri, 9 Oct 2020 21:34:12 +0000 (15:34 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Nov 2020 15:16:55 +0000 (08:16 -0700)
Wire up TIF_NOTIFY_SIGNAL handling for s390.

Cc: linux-s390@vger.kernel.org
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Acked-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
arch/s390/include/asm/thread_info.h
arch/s390/kernel/entry.S
arch/s390/kernel/signal.c

index 13a04fc..0045341 100644 (file)
@@ -65,6 +65,7 @@ void arch_setup_new_exec(void);
 #define TIF_GUARDED_STORAGE    4       /* load guarded storage control block */
 #define TIF_PATCH_PENDING      5       /* pending live patching update */
 #define TIF_PGSTE              6       /* New mm's will use 4K page tables */
+#define TIF_NOTIFY_SIGNAL      7       /* signal notifications exist */
 #define TIF_ISOLATE_BP         8       /* Run process with isolated BP */
 #define TIF_ISOLATE_BP_GUEST   9       /* Run KVM guests with isolated BP */
 
@@ -82,6 +83,7 @@ void arch_setup_new_exec(void);
 #define TIF_SYSCALL_TRACEPOINT 27      /* syscall tracepoint instrumentation */
 
 #define _TIF_NOTIFY_RESUME     BIT(TIF_NOTIFY_RESUME)
+#define _TIF_NOTIFY_SIGNAL     BIT(TIF_NOTIFY_SIGNAL)
 #define _TIF_SIGPENDING                BIT(TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      BIT(TIF_NEED_RESCHED)
 #define _TIF_UPROBE            BIT(TIF_UPROBE)
index 8623591..19a89f2 100644 (file)
@@ -52,7 +52,8 @@ STACK_SIZE  = 1 << STACK_SHIFT
 STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE
 
 _TIF_WORK      = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
-                  _TIF_UPROBE | _TIF_GUARDED_STORAGE | _TIF_PATCH_PENDING)
+                  _TIF_UPROBE | _TIF_GUARDED_STORAGE | _TIF_PATCH_PENDING | \
+                  _TIF_NOTIFY_SIGNAL)
 _TIF_TRACE     = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \
                   _TIF_SYSCALL_TRACEPOINT)
 _CIF_WORK      = (_CIF_ASCE_PRIMARY | _CIF_ASCE_SECONDARY | _CIF_FPU)
@@ -463,8 +464,8 @@ ENTRY(system_call)
 #endif
        TSTMSK  __PT_FLAGS(%r11),_PIF_SYSCALL_RESTART
        jo      .Lsysc_syscall_restart
-       TSTMSK  __TI_flags(%r12),_TIF_SIGPENDING
-       j     .Lsysc_sigpending
+       TSTMSK  __TI_flags(%r12),(_TIF_SIGPENDING|_TIF_NOTIFY_SIGNAL)
+       jnz     .Lsysc_sigpending
        TSTMSK  __TI_flags(%r12),_TIF_NOTIFY_RESUME
        jo      .Lsysc_notify_resume
        TSTMSK  __LC_CPU_FLAGS,(_CIF_ASCE_PRIMARY|_CIF_ASCE_SECONDARY)
@@ -855,8 +856,8 @@ ENTRY(io_int_handler)
        TSTMSK  __TI_flags(%r12),_TIF_PATCH_PENDING
        jo      .Lio_patch_pending
 #endif
-       TSTMSK  __TI_flags(%r12),_TIF_SIGPENDING
-       j     .Lio_sigpending
+       TSTMSK  __TI_flags(%r12),(_TIF_SIGPENDING|_TIF_NOTIFY_SIGNAL)
+       jnz     .Lio_sigpending
        TSTMSK  __TI_flags(%r12),_TIF_NOTIFY_RESUME
        jo      .Lio_notify_resume
        TSTMSK  __TI_flags(%r12),_TIF_GUARDED_STORAGE
index 9e900a8..b27b6c1 100644 (file)
@@ -472,7 +472,7 @@ void do_signal(struct pt_regs *regs)
        current->thread.system_call =
                test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0;
 
-       if (get_signal(&ksig)) {
+       if (test_thread_flag(TIF_SIGPENDING) && get_signal(&ksig)) {
                /* Whee!  Actually deliver the signal.  */
                if (current->thread.system_call) {
                        regs->int_code = current->thread.system_call;