summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-10-06 01:07:17 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-10-06 01:07:16 -0700
commit631243822474c856084d149d9ff823b758f84046 (patch)
treef82586b970f03cc2ee5750cdf52893bbfa524077 /kernel
parent62a52467b588e341eeaa76301ed7a432af54bb86 (diff)
parent7c3461a6acf2b2a36657215fd410f407e33862f2 (diff)
Merge "sched: Fix a division by zero bug in scale_exec_time()"
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/core.c8
-rw-r--r--kernel/sched/hmp.c3
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);