diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 82f4572c8ddf..9fc32366ac7e 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -20,6 +20,8 @@ #include #include +#include + #include #include #include @@ -1107,8 +1109,11 @@ static void do_signal(struct pt_regs *regs) void do_notify_resume(struct pt_regs *regs, unsigned long thread_flags) { + int thread_lazy_flag = 0; + do { - if (thread_flags & _TIF_NEED_RESCHED) { + trace_android_vh_read_lazy_flag(&thread_lazy_flag, &thread_flags); + if ((thread_flags & _TIF_NEED_RESCHED) || thread_lazy_flag) { /* Unmask Debug and SError for the next task */ local_daif_restore(DAIF_PROCCTX_NOIRQ); diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 7a600198d24b..675646d924e7 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -410,3 +410,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_hibernated_do_mem_alloc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_hibernate_save_cmp_len); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_read_lazy_flag); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_tsk_need_resched_lazy); diff --git a/include/trace/hooks/dtask.h b/include/trace/hooks/dtask.h index b51147089b2d..ecf3f4b03ab7 100644 --- a/include/trace/hooks/dtask.h +++ b/include/trace/hooks/dtask.h @@ -124,6 +124,14 @@ DECLARE_HOOK(android_vh_freeze_whether_wake, TP_PROTO(struct task_struct *t, bool *wake), TP_ARGS(t, wake)); +DECLARE_HOOK(android_vh_read_lazy_flag, + TP_PROTO(int *thread_lazy_flag, unsigned long *thread_flags), + TP_ARGS(thread_lazy_flag, thread_flags)); + +DECLARE_HOOK(android_vh_set_tsk_need_resched_lazy, + TP_PROTO(struct task_struct *p, struct rq *rq, int *need_lazy), + TP_ARGS(p, rq, need_lazy)); + #endif /* _TRACE_HOOK_DTASK_H */ /* This part must be outside protection */ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 922c52aeeeb7..20080b633588 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1043,13 +1043,17 @@ void wake_up_q(struct wake_q_head *head) void resched_curr(struct rq *rq) { struct task_struct *curr = rq->curr; - int cpu; + int cpu, need_lazy = 0; lockdep_assert_rq_held(rq); if (test_tsk_need_resched(curr)) return; + trace_android_vh_set_tsk_need_resched_lazy(curr, rq, &need_lazy); + if (need_lazy) + return; + cpu = cpu_of(rq); if (cpu == smp_processor_id()) {