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_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
        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;
        /* 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;
        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.
 
          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) { }
 
 /* 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)
 {
 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();
 
                if (ti_work & _TIF_NEED_RESCHED)
                        schedule();
 
-               raise_delayed_signal();
-
                if (ti_work & _TIF_UPROBE)
                        uprobe_notify_resume(regs);
 
                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.
  *
  * 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;
 
        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;
        spin_lock_irqsave(&t->sighand->siglock, flags);
        action = &t->sighand->action[sig-1];
        ignored = action->sa.sa_handler == SIG_IGN;