public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: prevent compiler from optimising sched_avg_update loop
@ 2010-03-23 17:36 Will Deacon
  2010-03-23 17:53 ` Eric Dumazet
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Will Deacon @ 2010-03-23 17:36 UTC (permalink / raw)
  To: linux-kernel
  Cc: Will Deacon, Catalin Marinas, Ingo Molnar, Andrew Morton,
	Peter Zijlstra

GCC 4.4.1 on ARM has been observed to replace the while loop
in sched_avg_update with a call to uldivmod, resulting in the
following build failure at link-time:

kernel/built-in.o: In function `sched_avg_update':
/linux-2.6/kernel/sched.c:1261: undefined reference to `__aeabi_uldivmod'
/linux-2.6/kernel/sched.c:1261: undefined reference to `__aeabi_uldivmod'
make: *** [.tmp_vmlinux1] Error 1

This patch [taken against 2.6.34-rc2] replaces the loop with a call to
div_s64 which allows the Kernel to link.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
---
 kernel/sched.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/kernel/sched.c b/kernel/sched.c
index 9ab3cd7..6b74f21 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1238,11 +1238,10 @@ static u64 sched_avg_period(void)
 static void sched_avg_update(struct rq *rq)
 {
 	s64 period = sched_avg_period();
+	s64 elapsed_periods = div_s64(rq->clock - rq->age_stamp - 1, period);
 
-	while ((s64)(rq->clock - rq->age_stamp) > period) {
-		rq->age_stamp += period;
-		rq->rt_avg /= 2;
-	}
+	rq->age_stamp += (u64)(elapsed_periods * period);
+	rq->rt_avg >>= elapsed_periods;
 }
 
 static void sched_rt_avg_update(struct rq *rq, u64 rt_delta)
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-03-23 19:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-23 17:36 [PATCH] sched: prevent compiler from optimising sched_avg_update loop Will Deacon
2010-03-23 17:53 ` Eric Dumazet
     [not found]   ` <000101cacab3$25af90a0$710eb1e0$@deacon@arm.com>
2010-03-23 18:10     ` Peter Zijlstra
2010-03-23 18:08 ` Peter Zijlstra
2010-03-23 19:05 ` Will Deacon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox