Now TIF_NOTIFY_SIGNAL can mean not only normal task_work but also io_uring specific task requests. Make sure to run them when needed. TODO: add hot path when not having io_uring tw items Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> --- fs/io-wq.c | 1 + fs/io_uring.c | 1 + include/linux/task_work.h | 1 + kernel/entry/kvm.c | 1 + kernel/signal.c | 2 ++ 5 files changed, 6 insertions(+) diff --git a/fs/io-wq.c b/fs/io-wq.c index 32aeb2c581c5..35d8c2b46699 100644 --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -523,6 +523,7 @@ static bool io_flush_signals(void) if (unlikely(test_thread_flag(TIF_NOTIFY_SIGNAL))) { __set_current_state(TASK_RUNNING); clear_notify_signal(); + io_uring_task_work_run(); if (task_work_pending(current)) task_work_run(); return true; diff --git a/fs/io_uring.c b/fs/io_uring.c index 8d5aff1ecb4c..22dcd2fb9687 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2798,6 +2798,7 @@ static inline bool io_run_task_work(void) if (test_thread_flag(TIF_NOTIFY_SIGNAL) || task_work_pending(current)) { __set_current_state(TASK_RUNNING); clear_notify_signal(); + io_uring_task_work_run(); if (task_work_pending(current)) task_work_run(); return true; diff --git a/include/linux/task_work.h b/include/linux/task_work.h index 0c5fc557ecd9..66852f4a2ca0 100644 --- a/include/linux/task_work.h +++ b/include/linux/task_work.h @@ -4,6 +4,7 @@ #include <linux/list.h> #include <linux/sched.h> +#include <linux/io_uring.h> typedef void (*task_work_func_t)(struct callback_head *); diff --git a/kernel/entry/kvm.c b/kernel/entry/kvm.c index 9d09f489b60e..46d7d23d3cc6 100644 --- a/kernel/entry/kvm.c +++ b/kernel/entry/kvm.c @@ -10,6 +10,7 @@ static int xfer_to_guest_mode_work(struct kvm_vcpu *vcpu, unsigned long ti_work) if (ti_work & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) { clear_notify_signal(); + io_uring_task_work_run(); if (task_work_pending(current)) task_work_run(); } diff --git a/kernel/signal.c b/kernel/signal.c index 30cd1ca43bcd..8d46c4b63204 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2357,6 +2357,7 @@ int ptrace_notify(int exit_code, unsigned long message) int signr; BUG_ON((exit_code & (0x7f | ~0xffff)) != SIGTRAP); + io_uring_task_work_run(); if (unlikely(task_work_pending(current))) task_work_run(); @@ -2637,6 +2638,7 @@ bool get_signal(struct ksignal *ksig) int signr; clear_notify_signal(); + io_uring_task_work_run(); if (unlikely(task_work_pending(current))) task_work_run(); -- 2.36.0