From 14f07c1db0daa8dffab64ae08342ebbaf5828367 Mon Sep 17 00:00:00 2001 From: xieliujie Date: Fri, 26 Apr 2024 10:02:17 +0800 Subject: [PATCH] ANDROID: vendor_hooks: add two hooks for lazy preemption add some changes to achieve the lazy preemption feature in our baseline. - android_vh_read_lazy_flag - android_vh_set_tsk_need_resched_lazy Bug: 336982374 Change-Id: I09f1110a2a11da4dbf0d4d0cca3500d1a6ee6a74 Signed-off-by: xieliujie --- arch/arm64/kernel/signal.c | 7 ++++++- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/dtask.h | 8 ++++++++ kernel/sched/core.c | 6 +++++- 4 files changed, 21 insertions(+), 2 deletions(-) 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()) {