From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Zijlstra Date: Thu, 28 May 2009 09:34:41 +0000 Subject: Re: [PATCH] sched: Support current clocksource handling in Message-Id: <1243503281.23657.80.camel@twins> List-Id: References: <20090526061532.GD9188@linux-sh.org> <63386a3d0905260731m655bfee3q82a6f52d71fa3cef@mail.gmail.com> <1243348681.23657.14.camel@twins> <20090526230855.GA27218@linux-sh.org> <20090527001543.GA8493@linux-sh.org> <1243441525.28705.19.camel@desktop> <20090528091936.GA27545@linux-sh.org> In-Reply-To: <20090528091936.GA27545@linux-sh.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Paul Mundt Cc: Daniel Walker , Thomas Gleixner , Linus Walleij , Ingo Molnar , Andrew Victor , Haavard Skinnemoen , Andrew Morton , linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org, linux-arm-kernel@lists.arm.linux.org.uk, John Stultz On Thu, 2009-05-28 at 18:19 +0900, Paul Mundt wrote: > Ok, there were some ordering problems with the early platform code, but > I've played with this a bit more and got it to the point where this now > also works. I can live with this over the v3 version if people prefer > this approach instead. > > -- > @@ -38,8 +39,7 @@ > */ > unsigned long long __attribute__((weak)) sched_clock(void) > { > - return (unsigned long long)(jiffies - INITIAL_JIFFIES) > - * (NSEC_PER_SEC / HZ); > + return cyc2ns(sched_clocksource, clocksource_read(sched_clocksource)); > } > > static __read_mostly int sched_clock_running; > @@ -362,6 +363,9 @@ static struct clocksource *select_clocksource(void) > if (next = curr_clocksource) > return NULL; > > + if (next->flags & CLOCK_SOURCE_USE_FOR_SCHED_CLOCK) > + sched_clocksource = next; > + > return next; > } > That's a single assignment, vs two reads on use. Should we be worried about the SMP race where we observe two different sched_clocksource pointers on read? I would suggest we write it as: u64 __weak sched_clock(void) { struct clocksource *clock = ACCESS_ONCE(sched_clocksource); return cyc2ns(clock, clocksource_read(clock)); }