mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 18:55:12 +00:00
Revert "signal, x86: Delay calling signals in atomic on RT enabled kernels"
Revert commit bf9ad37dc8
. 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>
This commit is contained in:
parent
787af64d05
commit
7dd5ad2d3e
@ -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 {
|
|||||||
/* 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
|
|||||||
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)
|
|||||||
/* 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(¤t->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,
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user