From: john stultz <johnstul@us.ibm.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Frans Pop <elendil@planet.nl>,
linux-s390@vger.kernel.org, Roman Zippel <zippel@linux-m68k.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [BUG,2.6.28,s390] Fails to boot in Hercules S/390 emulator
Date: Wed, 11 Mar 2009 18:57:46 -0700 [thread overview]
Message-ID: <1236823066.7680.178.camel@localhost.localdomain> (raw)
In-Reply-To: <alpine.LFD.2.00.0903120201040.29264@localhost.localdomain>
On Thu, 2009-03-12 at 02:30 +0100, Thomas Gleixner wrote:
> On Wed, 11 Mar 2009, john stultz wrote:
> > For a cleaner version, could you try the following, against 2.6.29-git
> > with no other modification?
>
> cleaner ?
>
> > xtime_nsec is expected at times to be negative. Instead of trying to
> > handle all the shifting properly via casts, define it as a s64 instead
> > of a u64.
> >
> > NOT FOR INCLUSION
> > Signed-off-by: John Stultz <johnstul@us.ibm.com>
> >
> > diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
> > index f88d32f..e217000 100644
> > --- a/include/linux/clocksource.h
> > +++ b/include/linux/clocksource.h
> > @@ -86,7 +86,7 @@ struct clocksource {
> > * more than one cache line.
> > */
> > cycle_t cycle_last ____cacheline_aligned_in_smp;
> > - u64 xtime_nsec;
> > + s64 xtime_nsec;
> > s64 error;
> > struct timespec raw_time;
> >
> > diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
> > index 900f1b6..387be3c 100644
> > --- a/kernel/time/timekeeping.c
> > +++ b/kernel/time/timekeeping.c
> > @@ -546,7 +546,7 @@ void update_wall_time(void)
> > /* store full nanoseconds into xtime after rounding it up and
> > * add the remainder to the error difference.
> > */
> > - xtime.tv_nsec = ((s64)clock->xtime_nsec >> clock->shift) + 1;
> > + xtime.tv_nsec = (clock->xtime_nsec >> clock->shift) + 1;
> > clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
> > clock->error += clock->xtime_nsec << (NTP_SCALE_SHIFT - clock->shift);
>
> This code sequence does:
>
> xtime.tv_nsec = (clock->xtime_nsec >> clock->shift) + 1;
> clock->xtime_nsec -= xtime.tv_nsec << clock->shift;
>
> Lets substitute a bit:
>
> a = xtime.tv_nsec
> b = clock->xtime_nsec
> c = clock->shift
> r = result (which ends up in b aka clock->xtime_nsec again for the next round)
>
> => a = (b >> c) + 1
> r = b - (a << c)
>
> b >> c = b / 2^c
> a << c = a * 2^c
>
> => a = (b / 2^c) + 1
> r = b - (a * 2^c)
>
> => r = b - ((b / 2^c) + 1) * 2^c
> r = b - ((2^c * b / 2^c) + 2^c)
> r = b - (2^c * b / 2^c) - 2^c
> r = b - b - 2^c
> r = -2^c
>
> => r = -(1 << c)
>
> So the whole business boils down to:
>
> clock->xtime_nsec = -(1 << clock->shift);
Err, not quite. See, we truncate clock->xtime_nsec when we shift it down
and store it into xtime.tv_nsec. Since we don't want to lose truncated
remainder, we simply add one to xtime.tv_nsec, taking the ceiling in
effect.
However, we have to balance this out in order to not rush forward in
time each tick. So we accumulate amount we ended up adding into the
error.
Lets walk through a simple example with actual values.
b = 99
c = 4
=> a = (b >> c) + 1
r = b - (a << c)
=> a = (99 >> 4) + 1
a = 6 + 1
a = 7
r = 99 - (7 << 4)
r = 99 - 112
r = -13
(Your reduction would give -16, since it ignores that shift down
truncates)
In effect, adding 1 to xtime.tv_nsec, is the same as adding 13 to
clock->xtime_nsec.
Maybe a different way of expressing what we're calculating is the
following:
xtime.tv_nsec = (clock->xtime_nsec + (1<<clock->shift)) >> clock->shift
clock->xtime_nsec = (1<<clock->shift)
- (clock->xtime_nsec &((1<<clock->shift)-1)
In other words: The rounded up portion - the masked remainder in
xtime_nsec.
Does that make sense?
thanks
-john
next prev parent reply other threads:[~2009-03-12 1:58 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-08 1:30 [BUG,2.6.28,s390] Fails to boot in Hercules S/390 emulator Frans Pop
2009-03-08 7:21 ` Frans Pop
2009-03-09 15:04 ` Frans Pop
2009-03-11 1:00 ` john stultz
2009-03-11 9:00 ` Frans Pop
2009-03-11 16:03 ` Frans Pop
2009-03-11 17:05 ` Frans Pop
2009-03-11 19:05 ` Frans Pop
2009-03-12 0:34 ` john stultz
2009-03-12 4:47 ` john stultz
2009-03-12 6:51 ` Frans Pop
2009-03-17 5:15 ` john stultz
2009-03-17 14:39 ` Frans Pop
2009-03-12 0:30 ` john stultz
2009-03-12 0:47 ` john stultz
2009-03-12 1:30 ` Thomas Gleixner
2009-03-12 1:57 ` john stultz [this message]
2009-03-12 7:50 ` Thomas Gleixner
2009-03-12 17:05 ` [BUG,2.6.28,s390] Fails to boot in Hercules S/390 emulator - hang traced Frans Pop
2009-03-13 11:48 ` Frans Pop
2009-03-13 17:34 ` Frans Pop
2009-03-17 5:09 ` john stultz
2009-03-18 2:26 ` john stultz
2009-03-18 2:54 ` john stultz
2009-03-18 9:28 ` Martin Schwidefsky
2009-03-18 12:07 ` Frans Pop
2009-03-18 15:48 ` John Stultz
2009-03-23 0:11 ` Frans Pop
2009-03-23 22:19 ` John Stultz
2009-03-24 8:23 ` Martin Schwidefsky
2009-04-14 22:27 ` [PATCH] Avoid possible endless loop when using jiffies clocksource and ONESHOT mode clockevent john stultz
2009-03-18 15:39 ` [BUG,2.6.28,s390] Fails to boot in Hercules S/390 emulator - hang traced John Stultz
2009-03-10 3:09 ` [BUG,2.6.28,s390] Fails to boot in Hercules S/390 emulator John Stultz
2009-03-10 3:37 ` Frans Pop
2009-03-10 3:38 ` John Stultz
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=1236823066.7680.178.camel@localhost.localdomain \
--to=johnstul@us.ibm.com \
--cc=elendil@planet.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=zippel@linux-m68k.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox