diff options
| author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-06-01 01:53:22 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-06-01 01:53:21 -0700 |
| commit | f53ee91e04c504b4e3fde9a0b11c7c1cecc33f94 (patch) | |
| tree | eb131c15d868ebb5a16692c0a3ee9001c99d593e | |
| parent | 64b788384bd7c30a24b91e8ca14009adf48eaa83 (diff) | |
| parent | f37f0680d728df428d75278597402c53b34366b0 (diff) | |
Merge "sched: Improve short sleeping tasks detection"
| -rw-r--r-- | kernel/sched/hmp.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/kernel/sched/hmp.c b/kernel/sched/hmp.c index df47c26ab6d2..0591975de3bf 100644 --- a/kernel/sched/hmp.c +++ b/kernel/sched/hmp.c @@ -4303,8 +4303,20 @@ void note_task_waking(struct task_struct *p, u64 wallclock) { u64 sleep_time = wallclock - p->last_switch_out_ts; - p->last_wake_ts = wallclock; + /* + * When a short burst and short sleeping task goes for a long + * sleep, the task's avg_sleep_time gets boosted. It will not + * come below short_sleep threshold for a lot of time and it + * results in incorrect packing. The idead behind tracking + * avg_sleep_time is to detect if a task is short sleeping + * or not. So limit the sleep time to twice the short sleep + * threshold. For regular long sleeping tasks, the avg_sleep_time + * would be higher than threshold, and packing happens correctly. + */ + sleep_time = min_t(u64, sleep_time, 2 * sysctl_sched_short_sleep); update_avg(&p->ravg.avg_sleep_time, sleep_time); + + p->last_wake_ts = wallclock; } #ifdef CONFIG_CGROUP_SCHED |
