Messages in this thread | | | Date | Tue, 26 Jun 2007 12:21:48 -0400 | From | Chris Snook <> | Subject | Re: [PATCH] sys_time-speedup-small-cleanup |
| |
Oleg Nesterov wrote: > on top of sys_time-speedup.patch > > Ingo Molnar wrote: >> asmlinkage long sys_time(time_t __user * tloc) >> { >> - time_t i; >> - struct timeval tv; >> + /* >> + * We read xtime.tv_sec atomically - it's updated >> + * atomically by update_wall_time(), so no need to >> + * even read-lock the xtime seqlock: >> + */ >> + time_t i = xtime.tv_sec; >> >> - do_gettimeofday(&tv); >> - i = tv.tv_sec; >> + smp_rmb(); /* sys_time() results are coherent */ > > Why do we need this barrier? My guess it is needed to prevent > the reading of xtime.tv_sec twice, yes? In that case a simple > barrier() should be enough.
Without the smp_rmb, you can potentially have a situation where one CPU is still reading an old value from cache while another has the new value. It's generally a rather small race window on most architectures, but very bad things can happen if time ever goes backwards, so it's worth the overhead of maintaining coherence on smp.
-- Chris
> Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> > > --- t/kernel/time.c~ 2007-06-26 16:28:59.000000000 +0400 > +++ t/kernel/time.c 2007-06-26 16:32:09.000000000 +0400 > @@ -64,7 +64,7 @@ asmlinkage long sys_time(time_t __user * > */ > time_t i = xtime.tv_sec; > > - smp_rmb(); /* sys_time() results are coherent */ > + barrier(); /* sys_time() results are coherent */ > > if (tloc) { > if (put_user(i, tloc)) > > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |