sparc: add support for TIF_NOTIFY_SIGNAL
authorJens Axboe <axboe@kernel.dk>
Fri, 9 Oct 2020 21:44:37 +0000 (15:44 -0600)
committerJens Axboe <axboe@kernel.dk>
Sat, 12 Dec 2020 16:17:38 +0000 (09:17 -0700)
Wire up TIF_NOTIFY_SIGNAL handling for sparc.

Cc: sparclinux@vger.kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
arch/sparc/include/asm/thread_info_32.h
arch/sparc/include/asm/thread_info_64.h
arch/sparc/kernel/signal_32.c
arch/sparc/kernel/signal_64.c

index 548b366..45b4955 100644 (file)
@@ -104,6 +104,7 @@ register struct thread_info *current_thread_info_reg asm("g6");
 #define TIF_SIGPENDING         2       /* signal pending */
 #define TIF_NEED_RESCHED       3       /* rescheduling necessary */
 #define TIF_RESTORE_SIGMASK    4       /* restore signal mask in do_signal() */
+#define TIF_NOTIFY_SIGNAL      5       /* signal notifications exist */
 #define TIF_USEDFPU            8       /* FPU was used by this task
                                         * this quantum (SMP) */
 #define TIF_POLLING_NRFLAG     9       /* true if poll_idle() is polling
@@ -115,11 +116,12 @@ register struct thread_info *current_thread_info_reg asm("g6");
 #define _TIF_NOTIFY_RESUME     (1<<TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
+#define _TIF_NOTIFY_SIGNAL     (1<<TIF_NOTIFY_SIGNAL)
 #define _TIF_USEDFPU           (1<<TIF_USEDFPU)
 #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
 
 #define _TIF_DO_NOTIFY_RESUME_MASK     (_TIF_NOTIFY_RESUME | \
-                                        _TIF_SIGPENDING)
+                                        _TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)
 
 #define is_32bit_task()        (1)
 
index 2025547..42cd4cd 100644 (file)
@@ -180,7 +180,7 @@ extern struct thread_info *current_thread_info(void);
 #define TIF_NOTIFY_RESUME      1       /* callback before returning to user */
 #define TIF_SIGPENDING         2       /* signal pending */
 #define TIF_NEED_RESCHED       3       /* rescheduling necessary */
-/* flag bit 4 is available */
+#define TIF_NOTIFY_SIGNAL      4       /* signal notifications exist */
 #define TIF_UNALIGNED          5       /* allowed to do unaligned accesses */
 #define TIF_UPROBE             6       /* breakpointed or singlestepped */
 #define TIF_32BIT              7       /* 32-bit binary */
@@ -200,6 +200,7 @@ extern struct thread_info *current_thread_info(void);
 #define _TIF_NOTIFY_RESUME     (1<<TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
+#define _TIF_NOTIFY_SIGNAL     (1<<TIF_NOTIFY_SIGNAL)
 #define _TIF_UNALIGNED         (1<<TIF_UNALIGNED)
 #define _TIF_UPROBE            (1<<TIF_UPROBE)
 #define _TIF_32BIT             (1<<TIF_32BIT)
@@ -213,7 +214,8 @@ extern struct thread_info *current_thread_info(void);
                                 _TIF_DO_NOTIFY_RESUME_MASK | \
                                 _TIF_NEED_RESCHED)
 #define _TIF_DO_NOTIFY_RESUME_MASK     (_TIF_NOTIFY_RESUME | \
-                                        _TIF_SIGPENDING | _TIF_UPROBE)
+                                        _TIF_SIGPENDING | _TIF_UPROBE | \
+                                        _TIF_NOTIFY_SIGNAL)
 
 #define is_32bit_task()        (test_thread_flag(TIF_32BIT))
 
index 741d070..11cf228 100644 (file)
@@ -521,7 +521,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
 void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0,
                      unsigned long thread_info_flags)
 {
-       if (thread_info_flags & _TIF_SIGPENDING)
+       if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
                do_signal(regs, orig_i0);
        if (thread_info_flags & _TIF_NOTIFY_RESUME)
                tracehook_notify_resume(regs);
index f7ef7ed..a0eec62 100644 (file)
@@ -549,7 +549,7 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long
        user_exit();
        if (thread_info_flags & _TIF_UPROBE)
                uprobe_notify_resume(regs);
-       if (thread_info_flags & _TIF_SIGPENDING)
+       if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
                do_signal(regs, orig_i0);
        if (thread_info_flags & _TIF_NOTIFY_RESUME)
                tracehook_notify_resume(regs);