diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 917b62588bc5d9920fe46e2857e2342bd6fbe95f..52f3f9d3faa3f0f5b6e64e865e0005c2b9d5f66b 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3817,7 +3817,12 @@ ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags, } if (rq->idle_stamp) { - u64 delta = rq_clock(rq) - rq->idle_stamp; + u64 delta; + + if (sched_feat(IRQ_AVG)) + delta = rq_clock_task(rq) - rq->idle_stamp; + else + delta = rq_clock(rq) - rq->idle_stamp; u64 max = 2*rq->max_idle_balance_cost; update_avg(&rq->avg_idle, delta); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index bd2c450484fb4010b7fef5913d9f97e152cdbbed..21bd2ca4172d9a07babbefbe88fc8a7f98aa1eac 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5219,7 +5219,10 @@ static inline void update_misfit_status(struct task_struct *p, struct rq *rq) static inline void rq_idle_stamp_update(struct rq *rq) { - rq->idle_stamp = rq_clock(rq); + if (sched_feat(IRQ_AVG)) + rq->idle_stamp = rq_clock_task(rq); + else + rq->idle_stamp = rq_clock(rq); } static inline void rq_idle_stamp_clear(struct rq *rq) diff --git a/kernel/sched/features.h b/kernel/sched/features.h index 02577ddf10bd4a68d1b3c4f41c5299f5d8477abc..ea7ba74810e38b9b0f33c033a29674a5ff0f36fa 100644 --- a/kernel/sched/features.h +++ b/kernel/sched/features.h @@ -98,6 +98,7 @@ SCHED_FEAT(UTIL_EST_FASTUP, true) SCHED_FEAT(LATENCY_WARN, false) SCHED_FEAT(HZ_BW, true) +SCHED_FEAT(IRQ_AVG, false) #ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY /*