diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c index a578ecce0376..ab0262b1e97e 100644 --- a/kernel/sched/walt/walt.c +++ b/kernel/sched/walt/walt.c @@ -4334,7 +4334,7 @@ static void walt_do_sched_yield(void *unused, struct rq *rq) if (mvp_prio != WALT_NOT_MVP) walt_cfs_deactivate_mvp_task(curr); - if (rt_task(curr)) + if (per_cpu(rt_task_arrival_time, cpu_of(rq))) per_cpu(rt_task_arrival_time, cpu_of(rq)) = 0; } diff --git a/kernel/sched/walt/walt.h b/kernel/sched/walt/walt.h index df1307b45ed4..03253a23cea9 100644 --- a/kernel/sched/walt/walt.h +++ b/kernel/sched/walt/walt.h @@ -886,11 +886,6 @@ static inline bool walt_fair_task(struct task_struct *p) return p->prio >= MAX_RT_PRIO && !is_idle_task(p); } -extern void rt_task_arrival_marker(void *unused, bool preempt, - struct task_struct *prev, struct task_struct *next); - -extern void long_running_rt_task_notifier(void *unused, struct rq *rq); - extern int sched_long_running_rt_task_ms_handler(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos); @@ -936,7 +931,7 @@ extern int in_sched_bug; extern struct rq *__migrate_task(struct rq *rq, struct rq_flags *rf, struct task_struct *p, int dest_cpu); -extern DEFINE_PER_CPU(u64, rt_task_arrival_time); +DECLARE_PER_CPU(u64, rt_task_arrival_time); extern int walt_get_mvp_task_prio(struct task_struct *p); extern void walt_cfs_deactivate_mvp_task(struct task_struct *p); diff --git a/kernel/sched/walt/walt_rt.c b/kernel/sched/walt/walt_rt.c index a48f81b93c06..b245bca00ae4 100644 --- a/kernel/sched/walt/walt_rt.c +++ b/kernel/sched/walt/walt_rt.c @@ -12,10 +12,10 @@ #define MSEC_TO_NSEC (1000 * 1000) static DEFINE_PER_CPU(cpumask_var_t, walt_local_cpu_mask); -DEFINE_PER_CPU(u64, rt_task_arrival_time); +DEFINE_PER_CPU(u64, rt_task_arrival_time) = 0; static bool long_running_rt_task_trace_rgstrd; -void rt_task_arrival_marker(void *unused, bool preempt, +static void rt_task_arrival_marker(void *unused, bool preempt, struct task_struct *prev, struct task_struct *next) { unsigned int cpu = raw_smp_processor_id(); @@ -26,7 +26,7 @@ void rt_task_arrival_marker(void *unused, bool preempt, per_cpu(rt_task_arrival_time, cpu) = 0; } -void long_running_rt_task_notifier(void *unused, struct rq *rq) +static void long_running_rt_task_notifier(void *unused, struct rq *rq) { struct task_struct *curr = rq->curr; unsigned int cpu = raw_smp_processor_id(); @@ -37,6 +37,19 @@ void long_running_rt_task_notifier(void *unused, struct rq *rq) if (!per_cpu(rt_task_arrival_time, cpu)) return; + if (per_cpu(rt_task_arrival_time, cpu) && curr->policy != SCHED_FIFO) { + /* This should never happen, trying to avoid any false positives */ + printk_deferred("Long running RT false positive detected for task %s (%d) runtime > %u now=%llu task arrival time=%llu runtime=%llu\n", + curr->comm, curr->pid, + sysctl_sched_long_running_rt_task_ms * MSEC_TO_NSEC, + rq_clock_task(rq), + per_cpu(rt_task_arrival_time, cpu), + rq_clock_task(rq) - + per_cpu(rt_task_arrival_time, cpu)); + per_cpu(rt_task_arrival_time, cpu) = 0; + return; + } + if (rq_clock_task(rq) - per_cpu(rt_task_arrival_time, cpu) > sysctl_sched_long_running_rt_task_ms * MSEC_TO_NSEC) {