Revert "signal, x86: Delay calling signals in atomic on RT enabled kernels"
authorThomas Gleixner <tglx@linutronix.de>
Thu, 31 Mar 2022 08:36:55 +0000 (10:36 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 31 Mar 2022 08:36:55 +0000 (10:36 +0200)
Revert commit bf9ad37dc8a. It needs to be better encapsulated and
generalized.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
arch/x86/Kconfig
include/linux/sched.h
kernel/Kconfig.preempt
kernel/entry/common.c
kernel/signal.c

index 7340d9f..442a426 100644 (file)
@@ -122,7 +122,6 @@ config X86
        select ARCH_WANT_GENERAL_HUGETLB
        select ARCH_WANT_HUGE_PMD_SHARE
        select ARCH_WANT_LD_ORPHAN_WARN
-       select ARCH_WANTS_RT_DELAYED_SIGNALS
        select ARCH_WANTS_THP_SWAP              if X86_64
        select ARCH_HAS_PARANOID_L1D_FLUSH
        select BUILDTIME_TABLE_SORT
index 4a6fdd2..d5e3c00 100644 (file)
@@ -1090,9 +1090,6 @@ struct task_struct {
        /* Restored if set_restore_sigmask() was used: */
        sigset_t                        saved_sigmask;
        struct sigpending               pending;
-#ifdef CONFIG_RT_DELAYED_SIGNALS
-       struct kernel_siginfo           forced_info;
-#endif
        unsigned long                   sas_ss_sp;
        size_t                          sas_ss_size;
        unsigned int                    sas_ss_flags;
index 8c6de5a..c2f1fd9 100644 (file)
@@ -133,14 +133,4 @@ config SCHED_CORE
          which is the likely usage by Linux distributions, there should
          be no measurable impact on performance.
 
-config ARCH_WANTS_RT_DELAYED_SIGNALS
-       bool
-       help
-         This option is selected by architectures where raising signals
-         can happen in atomic contexts on PREEMPT_RT enabled kernels. This
-         option delays raising the signal until the return to user space
-         loop where it is also delivered. X86 requires this to deliver
-         signals from trap handlers which run on IST stacks.
-
-config RT_DELAYED_SIGNALS
-       def_bool PREEMPT_RT && ARCH_WANTS_RT_DELAYED_SIGNALS
+
index ef8d94a..e57a224 100644 (file)
@@ -142,18 +142,6 @@ void noinstr exit_to_user_mode(void)
 /* Workaround to allow gradual conversion of architecture code */
 void __weak arch_do_signal_or_restart(struct pt_regs *regs) { }
 
-#ifdef CONFIG_RT_DELAYED_SIGNALS
-static inline void raise_delayed_signal(void)
-{
-       if (unlikely(current->forced_info.si_signo)) {
-               force_sig_info(&current->forced_info);
-               current->forced_info.si_signo = 0;
-       }
-}
-#else
-static inline void raise_delayed_signal(void) { }
-#endif
-
 static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
                                            unsigned long ti_work)
 {
@@ -168,8 +156,6 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
                if (ti_work & _TIF_NEED_RESCHED)
                        schedule();
 
-               raise_delayed_signal();
-
                if (ti_work & _TIF_UPROBE)
                        uprobe_notify_resume(regs);
 
index 368a34c..30cd1ca 100644 (file)
@@ -1308,43 +1308,6 @@ enum sig_handler {
 };
 
 /*
- * On some archictectures, PREEMPT_RT has to delay sending a signal from a
- * trap since it cannot enable preemption, and the signal code's
- * spin_locks turn into mutexes. Instead, it must set TIF_NOTIFY_RESUME
- * which will send the signal on exit of the trap.
- */
-#ifdef CONFIG_RT_DELAYED_SIGNALS
-static inline bool force_sig_delayed(struct kernel_siginfo *info,
-                                    struct task_struct *t)
-{
-       if (!in_atomic())
-               return false;
-
-       if (WARN_ON_ONCE(t->forced_info.si_signo))
-               return true;
-
-       if (is_si_special(info)) {
-               WARN_ON_ONCE(info != SEND_SIG_PRIV);
-               t->forced_info.si_signo = info->si_signo;
-               t->forced_info.si_errno = 0;
-               t->forced_info.si_code = SI_KERNEL;
-               t->forced_info.si_pid = 0;
-               t->forced_info.si_uid = 0;
-       } else {
-               t->forced_info = *info;
-       }
-       set_tsk_thread_flag(t, TIF_NOTIFY_RESUME);
-       return true;
-}
-#else
-static inline bool force_sig_delayed(struct kernel_siginfo *info,
-                                    struct task_struct *t)
-{
-       return false;
-}
-#endif
-
-/*
  * Force a signal that the process can't ignore: if necessary
  * we unblock the signal and change any SIG_IGN to SIG_DFL.
  *
@@ -1364,9 +1327,6 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t,
        struct k_sigaction *action;
        int sig = info->si_signo;
 
-       if (force_sig_delayed(info, t))
-               return 0;
-
        spin_lock_irqsave(&t->sighand->siglock, flags);
        action = &t->sighand->action[sig-1];
        ignored = action->sa.sa_handler == SIG_IGN;