From: Peter Zijlstra <peterz@infradead.org>
To: Will Deacon <will.deacon@arm.com>
Cc: linux-kernel@vger.kernel.org,
Catalin Marinas <catalin.marinas@arm.com>,
Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] sched: prevent compiler from optimising sched_avg_update loop
Date: Tue, 23 Mar 2010 19:08:02 +0100 [thread overview]
Message-ID: <1269367682.5109.155.camel@twins> (raw)
In-Reply-To: <1269365805-17280-1-git-send-email-will.deacon@arm.com>
On Tue, 2010-03-23 at 17:36 +0000, Will Deacon wrote:
> 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;
> }
Hmm, and that does an unconditional division, thing is, I don't expect
(under normal circumstances) for that loop to go round more than once so
that division will hurt for no reason.
Should we maybe write it like so:
if ((s64)(rq->clock - rq->age_stamp) > period) {
rq->age_stamp += period;
rq->rt_avg >>= 1;
}
if (unlikely((s64)(rq->clock - rq->age_stamp) > period)) {
s64 overflows = div_s64(rq->clocks - rq->age_stamp, period);
int width = sizeof(rq->rt_avg) * 8;
rq->age_stamp += overflows * period;
if (unlikely(overflows >= width))
rq->rt_avg = 0;
else
rq->rt_avg >>= overflows;
}
?
next prev parent reply other threads:[~2010-03-23 18:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2010-03-23 19:05 ` Will Deacon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1269367682.5109.155.camel@twins \
--to=peterz@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=catalin.marinas@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.