From 7f23cbca985d72fbc790db8c7a430691937395ca Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Mon, 24 May 2010 12:11:43 -0700 Subject: [PATCH] --- yaml --- r: 200602 b: refs/heads/master c: 0d98bb2656e9bd2dfda2d089db1fe1dbdab41504 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/sched.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 1f88f892fde3..bce25d99d91b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3c93717cfa51316e4dbb471e7c0f9d243359d5f8 +refs/heads/master: 0d98bb2656e9bd2dfda2d089db1fe1dbdab41504 diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 6c9e7c8735bf..a24d6d5d83f6 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -1254,6 +1254,12 @@ static void sched_avg_update(struct rq *rq) s64 period = sched_avg_period(); while ((s64)(rq->clock - rq->age_stamp) > period) { + /* + * Inline assembly required to prevent the compiler + * optimising this loop into a divmod call. + * See __iter_div_u64_rem() for another example of this. + */ + asm("" : "+rm" (rq->age_stamp)); rq->age_stamp += period; rq->rt_avg /= 2; }