summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-06-01 01:53:22 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-06-01 01:53:21 -0700
commitf53ee91e04c504b4e3fde9a0b11c7c1cecc33f94 (patch)
treeeb131c15d868ebb5a16692c0a3ee9001c99d593e
parent64b788384bd7c30a24b91e8ca14009adf48eaa83 (diff)
parentf37f0680d728df428d75278597402c53b34366b0 (diff)
Merge "sched: Improve short sleeping tasks detection"
-rw-r--r--kernel/sched/hmp.c14
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