From: john stultz <johnstul@us.ibm.com>
To: Andi Kleen <andi@firstfloor.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
Paul Mackerras <paulus@samba.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Anton Blanchard <anton@samba.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH] time: Add locking to xtime access in get_seconds()
Date: Wed, 04 May 2011 19:54:50 -0700 [thread overview]
Message-ID: <1304564090.2943.36.camel@work-vm> (raw)
In-Reply-To: <m2oc3jxgtt.fsf@firstfloor.org>
On Tue, 2011-05-03 at 20:52 -0700, Andi Kleen wrote:
> John Stultz <john.stultz@linaro.org> writes:
>
> > From: John Stultz <johnstul@us.ibm.com>
> >
> > So get_seconds() has always been lock free, with the assumption
> > that accessing a long will be atomic.
> >
> > However, recently I came across an odd bug where time() access could
> > occasionally be inconsistent, but only on power7 hardware. The
>
> Shouldn't a single rmb() be enough to avoid that?
>
> If not then I suspect there's a lot more code buggy on that CPU than
> just the time.
So interestingly, I've found that the issue was not as complex as I
first assumed. While the rmb() is probably a good idea for
get_seconds(), but it alone does not solve the issue I was seeing,
making it clear my theory wasn't correct.
The problem was reported against the 2.6.32-stable kernel, and had not
been seen in later kernels. I had assumed the change to logarithmic time
accumulation basically reduced the window for for the issue to be seen,
but it would likely still show up eventually.
When the rmb() alone did not solve this issue, I looked to see why the
locking did resolve it, and then it was clear: The old
update_xtime_cache() function doesn't set the xtime_cache values
atomically.
Now, the xtime_cache writing is done under the xtime_lock, so the
get_seconds() locking resolves the issue, but isn't appropriate since
get_seconds() is called from machine check handlers.
So the fix here for the 2.6.32-stable tree is to just update xtime_cache
in one go as done with the following patch.
I also added the rmb() for good measure, and the rmb() should probably
also go upstream since theoretically there maybe a platform that could
do out of order syscalls.
I suspect the reason this hasn't been triggered on x86 or power6 is due
to compiler or processor optimizations reordering the assignment to in
effect make it atomic. Or maybe the timing window to see the issue is
harder to observe?
Signed-off-by: John Stultz <johnstul@us.ibm.com>
Index: linux-2.6.32.y/kernel/time/timekeeping.c
===================================================================
--- linux-2.6.32.y.orig/kernel/time/timekeeping.c 2011-05-04 19:34:21.604314152 -0700
+++ linux-2.6.32.y/kernel/time/timekeeping.c 2011-05-04 19:39:09.972203989 -0700
@@ -168,8 +168,10 @@ int __read_mostly timekeeping_suspended;
static struct timespec xtime_cache __attribute__ ((aligned (16)));
void update_xtime_cache(u64 nsec)
{
- xtime_cache = xtime;
- timespec_add_ns(&xtime_cache, nsec);
+ /* use temporary timespec so xtime_cache is updated atomically */
+ struct timespec ts = xtime;
+ timespec_add_ns(&ts, nsec);
+ xtime_cache = ts;
}
/* must hold xtime_lock */
@@ -859,6 +861,7 @@ EXPORT_SYMBOL_GPL(monotonic_to_bootbased
unsigned long get_seconds(void)
{
+ rmb();
return xtime_cache.tv_sec;
}
EXPORT_SYMBOL(get_seconds);
next prev parent reply other threads:[~2011-05-05 2:54 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-04 3:11 [PATCH] time: Add locking to xtime access in get_seconds() John Stultz
2011-05-04 3:52 ` Andi Kleen
2011-05-05 2:54 ` john stultz [this message]
2011-05-05 5:44 ` Eric Dumazet
2011-05-05 6:21 ` john stultz
2011-05-05 6:50 ` Eric Dumazet
2011-05-05 8:14 ` Paul E. McKenney
2011-05-05 18:51 ` john stultz
2011-05-05 14:04 ` [RFC] time: xtime_lock is held too long Eric Dumazet
2011-05-05 14:39 ` Thomas Gleixner
2011-05-05 15:08 ` Eric Dumazet
2011-05-05 15:59 ` Thomas Gleixner
2011-05-05 21:01 ` Andi Kleen
2011-05-06 1:41 ` Eric Dumazet
2011-05-06 6:55 ` Andi Kleen
2011-05-06 10:18 ` Thomas Gleixner
2011-05-06 10:22 ` Ingo Molnar
2011-05-06 16:53 ` Andi Kleen
2011-05-07 8:20 ` Ingo Molnar
2011-05-06 16:59 ` Andi Kleen
2011-05-06 17:09 ` Eric Dumazet
2011-05-06 17:17 ` Andi Kleen
2011-05-06 17:42 ` Eric Dumazet
2011-05-06 17:50 ` Andi Kleen
2011-05-06 19:26 ` Eric Dumazet
2011-05-06 20:04 ` Eric Dumazet
2011-05-06 20:24 ` john stultz
2011-05-06 22:30 ` Eric Dumazet
2011-05-06 22:46 ` john stultz
2011-05-06 23:00 ` Eric Dumazet
2011-05-06 23:28 ` john stultz
2011-05-07 5:02 ` Eric Dumazet
2011-05-07 7:11 ` Henrik Rydberg
2011-05-09 8:40 ` Thomas Gleixner
2011-05-12 9:13 ` [PATCH] seqlock: don't smp_rmb in seqlock reader spin loop, [PATCH] seqlock: don't smp_rmb in seqlock reader spin loop Milton Miller
2011-05-12 9:35 ` Eric Dumazet
2011-05-12 14:08 ` Andi Kleen
2011-05-06 20:18 ` [RFC] time: xtime_lock is held too long john stultz
2011-05-05 17:57 ` [PATCH] time: Add locking to xtime access in get_seconds() Andi Kleen
2011-05-05 20:17 ` john stultz
2011-05-05 20:24 ` Eric Dumazet
2011-05-05 20:40 ` john stultz
2011-05-05 20:43 ` Eric Dumazet
2011-05-05 20:56 ` Andi Kleen
2011-05-04 16:51 ` Max Asbock
2011-05-04 21:05 ` Andi Kleen
2011-05-04 23:05 ` 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=1304564090.2943.36.camel@work-vm \
--to=johnstul@us.ibm.com \
--cc=andi@firstfloor.org \
--cc=anton@samba.org \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=paulus@samba.org \
--cc=tglx@linutronix.de \
/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