diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-10-06 01:07:17 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-10-06 01:07:16 -0700 |
| commit | 631243822474c856084d149d9ff823b758f84046 (patch) | |
| tree | f82586b970f03cc2ee5750cdf52893bbfa524077 /kernel | |
| parent | 62a52467b588e341eeaa76301ed7a432af54bb86 (diff) | |
| parent | 7c3461a6acf2b2a36657215fd410f407e33862f2 (diff) | |
Merge "sched: Fix a division by zero bug in scale_exec_time()"
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/core.c | 8 | ||||
| -rw-r--r-- | kernel/sched/hmp.c | 3 |
2 files changed, 7 insertions, 4 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 4cdf967b67c1..ff7f6f35fc8f 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3390,16 +3390,17 @@ static void __sched notrace __schedule(bool preempt) update_rq_clock(rq); next = pick_next_task(rq, prev); - wallclock = sched_ktime_clock(); - update_task_ravg(prev, rq, PUT_PREV_TASK, wallclock, 0); - update_task_ravg(next, rq, PICK_NEXT_TASK, wallclock, 0); clear_tsk_need_resched(prev); clear_preempt_need_resched(); rq->clock_skip_update = 0; BUG_ON(task_cpu(next) != cpu_of(rq)); + wallclock = sched_ktime_clock(); if (likely(prev != next)) { + update_task_ravg(prev, rq, PUT_PREV_TASK, wallclock, 0); + update_task_ravg(next, rq, PICK_NEXT_TASK, wallclock, 0); + rq->nr_switches++; rq->curr = next; ++*switch_count; @@ -3410,6 +3411,7 @@ static void __sched notrace __schedule(bool preempt) rq = context_switch(rq, prev, next); /* unlocks the rq */ cpu = cpu_of(rq); } else { + update_task_ravg(prev, rq, TASK_UPDATE, wallclock, 0); lockdep_unpin_lock(&rq->lock); raw_spin_unlock_irq(&rq->lock); } diff --git a/kernel/sched/hmp.c b/kernel/sched/hmp.c index 1e7b4cd4e64c..a0686ea29243 100644 --- a/kernel/sched/hmp.c +++ b/kernel/sched/hmp.c @@ -2741,7 +2741,8 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, void update_task_ravg(struct task_struct *p, struct rq *rq, int event, u64 wallclock, u64 irqtime) { - if (!rq->window_start || sched_disable_window_stats) + if (!rq->window_start || sched_disable_window_stats || + p->ravg.mark_start == wallclock) return; lockdep_assert_held(&rq->lock); |
