diff options
| author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-06-06 13:21:40 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-06-06 13:21:39 -0700 |
| commit | 0d1b465cb80a804cb36844ec94e079e3e5d55069 (patch) | |
| tree | 5a41095771174d4967085f7e219a3d543910b0a1 /kernel/sched/hmp.c | |
| parent | 1d0af2abf05eb3cfd4155e77d2468d04fa08582b (diff) | |
| parent | 5b138bd514a25350683f7b0bd874ab2b995b94e5 (diff) | |
Merge "sched: Fix load tracking bug to avoid adding phantom task demand"
Diffstat (limited to 'kernel/sched/hmp.c')
| -rw-r--r-- | kernel/sched/hmp.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/kernel/sched/hmp.c b/kernel/sched/hmp.c index 37d24bb17c76..4dd3d875c242 100644 --- a/kernel/sched/hmp.c +++ b/kernel/sched/hmp.c @@ -2579,7 +2579,8 @@ update_task_rq_cpu_cycles(struct task_struct *p, struct rq *rq, int event, trace_sched_get_task_cpu_cycles(cpu, event, rq->cc.cycles, rq->cc.time); } -static int account_busy_for_task_demand(struct task_struct *p, int event) +static int +account_busy_for_task_demand(struct rq *rq, struct task_struct *p, int event) { /* * No need to bother updating task demand for exiting tasks @@ -2598,6 +2599,17 @@ static int account_busy_for_task_demand(struct task_struct *p, int event) (event == PICK_NEXT_TASK || event == TASK_MIGRATE))) return 0; + /* + * TASK_UPDATE can be called on sleeping task, when its moved between + * related groups + */ + if (event == TASK_UPDATE) { + if (rq->curr == p) + return 1; + + return p->on_rq ? SCHED_ACCOUNT_WAIT_TIME : 0; + } + return 1; } @@ -2738,7 +2750,7 @@ static u64 update_task_demand(struct task_struct *p, struct rq *rq, u64 runtime; new_window = mark_start < window_start; - if (!account_busy_for_task_demand(p, event)) { + if (!account_busy_for_task_demand(rq, p, event)) { if (new_window) /* * If the time accounted isn't being accounted as |
