Commit e235f419 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'core-urgent-2022-04-03' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull RT signal fix from Thomas Gleixner:
 "Revert the RT related signal changes. They need to be reworked and
  generalized"

* tag 'core-urgent-2022-04-03' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  Revert "signal, x86: Delay calling signals in atomic on RT enabled kernels"
parents 63d12cc3 7dd5ad2d
...@@ -122,7 +122,6 @@ config X86 ...@@ -122,7 +122,6 @@ config X86
select ARCH_WANT_GENERAL_HUGETLB select ARCH_WANT_GENERAL_HUGETLB
select ARCH_WANT_HUGE_PMD_SHARE select ARCH_WANT_HUGE_PMD_SHARE
select ARCH_WANT_LD_ORPHAN_WARN select ARCH_WANT_LD_ORPHAN_WARN
select ARCH_WANTS_RT_DELAYED_SIGNALS
select ARCH_WANTS_THP_SWAP if X86_64 select ARCH_WANTS_THP_SWAP if X86_64
select ARCH_HAS_PARANOID_L1D_FLUSH select ARCH_HAS_PARANOID_L1D_FLUSH
select BUILDTIME_TABLE_SORT select BUILDTIME_TABLE_SORT
......
...@@ -1090,9 +1090,6 @@ struct task_struct { ...@@ -1090,9 +1090,6 @@ struct task_struct {
/* Restored if set_restore_sigmask() was used: */ /* Restored if set_restore_sigmask() was used: */
sigset_t saved_sigmask; sigset_t saved_sigmask;
struct sigpending pending; struct sigpending pending;
#ifdef CONFIG_RT_DELAYED_SIGNALS
struct kernel_siginfo forced_info;
#endif
unsigned long sas_ss_sp; unsigned long sas_ss_sp;
size_t sas_ss_size; size_t sas_ss_size;
unsigned int sas_ss_flags; unsigned int sas_ss_flags;
......
...@@ -133,14 +133,4 @@ config SCHED_CORE ...@@ -133,14 +133,4 @@ config SCHED_CORE
which is the likely usage by Linux distributions, there should which is the likely usage by Linux distributions, there should
be no measurable impact on performance. 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
...@@ -142,18 +142,6 @@ void noinstr exit_to_user_mode(void) ...@@ -142,18 +142,6 @@ void noinstr exit_to_user_mode(void)
/* Workaround to allow gradual conversion of architecture code */ /* Workaround to allow gradual conversion of architecture code */
void __weak arch_do_signal_or_restart(struct pt_regs *regs) { } 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, static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
unsigned long ti_work) unsigned long ti_work)
{ {
...@@ -168,8 +156,6 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs, ...@@ -168,8 +156,6 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
if (ti_work & _TIF_NEED_RESCHED) if (ti_work & _TIF_NEED_RESCHED)
schedule(); schedule();
raise_delayed_signal();
if (ti_work & _TIF_UPROBE) if (ti_work & _TIF_UPROBE)
uprobe_notify_resume(regs); uprobe_notify_resume(regs);
......
...@@ -1307,43 +1307,6 @@ enum sig_handler { ...@@ -1307,43 +1307,6 @@ enum sig_handler {
HANDLER_EXIT, /* Only visible as the process exit code */ HANDLER_EXIT, /* Only visible as the process exit code */
}; };
/*
* 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 * Force a signal that the process can't ignore: if necessary
* we unblock the signal and change any SIG_IGN to SIG_DFL. * 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, ...@@ -1364,9 +1327,6 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t,
struct k_sigaction *action; struct k_sigaction *action;
int sig = info->si_signo; int sig = info->si_signo;
if (force_sig_delayed(info, t))
return 0;
spin_lock_irqsave(&t->sighand->siglock, flags); spin_lock_irqsave(&t->sighand->siglock, flags);
action = &t->sighand->action[sig-1]; action = &t->sighand->action[sig-1];
ignored = action->sa.sa_handler == SIG_IGN; ignored = action->sa.sa_handler == SIG_IGN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment