diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index f0d68a636da1..e2ab638162b9 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4947,7 +4947,13 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) s64 delta; bool skip_preempt = false; - ideal_runtime = sched_slice(cfs_rq, curr); + /* + * When many tasks blow up the sched_period; it is possible that + * sched_slice() reports unusually large results (when many tasks are + * very light for example). Therefore impose a maximum. + */ + ideal_runtime = min_t(u64, sched_slice(cfs_rq, curr), sysctl_sched_latency); + delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; trace_android_rvh_check_preempt_tick(current, &ideal_runtime, &skip_preempt, delta_exec, cfs_rq, curr, sysctl_sched_min_granularity);