mirror of
https://github.com/torvalds/linux.git
synced 2026-01-24 23:16:46 +00:00
task_work: Call tracehook_notify_signal from get_signal on all architectures
Always handle TIF_NOTIFY_SIGNAL in get_signal. With commit 35d0b389f3
("task_work: unconditionally run task_work from get_signal()") always
calling task_work_run all of the work of tracehook_notify_signal is
already happening except clearing TIF_NOTIFY_SIGNAL.
Factor clear_notify_signal out of tracehook_notify_signal and use it in
get_signal so that get_signal only needs one call of task_work_run.
To keep the semantics in sync update xfer_to_guest_mode_work (which
does not call get_signal) to call tracehook_notify_signal if either
_TIF_SIGPENDING or _TIF_NOTIFY_SIGNAL.
Reviewed-by: Kees Cook <keescook@chromium.org>
Link: https://lkml.kernel.org/r/20220309162454.123006-8-ebiederm@xmission.com
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
@@ -139,15 +139,7 @@ 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, bool has_signal) { }
|
||||
|
||||
static void handle_signal_work(struct pt_regs *regs, unsigned long ti_work)
|
||||
{
|
||||
if (ti_work & _TIF_NOTIFY_SIGNAL)
|
||||
tracehook_notify_signal();
|
||||
|
||||
arch_do_signal_or_restart(regs, ti_work & _TIF_SIGPENDING);
|
||||
}
|
||||
void __weak arch_do_signal_or_restart(struct pt_regs *regs) { }
|
||||
|
||||
static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
|
||||
unsigned long ti_work)
|
||||
@@ -170,7 +162,7 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs,
|
||||
klp_update_patch_state(current);
|
||||
|
||||
if (ti_work & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
||||
handle_signal_work(regs, ti_work);
|
||||
arch_do_signal_or_restart(regs);
|
||||
|
||||
if (ti_work & _TIF_NOTIFY_RESUME)
|
||||
tracehook_notify_resume(regs);
|
||||
|
||||
@@ -8,7 +8,7 @@ static int xfer_to_guest_mode_work(struct kvm_vcpu *vcpu, unsigned long ti_work)
|
||||
do {
|
||||
int ret;
|
||||
|
||||
if (ti_work & _TIF_NOTIFY_SIGNAL)
|
||||
if (ti_work & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
|
||||
tracehook_notify_signal();
|
||||
|
||||
if (ti_work & _TIF_SIGPENDING) {
|
||||
|
||||
Reference in New Issue
Block a user