On Wed, Mar 16, 2016 at 14:42 +0900, Masao Uebayashi wrote:
> This doesn't use atomic operation, because:
> 
> - hardclock() is the only writer
>   - Clock interrupt doesn't run simultaneously
> - Reading int should be atomic on all architectures
>

Well, in reality both the new location and timeout_hardclock_update
are only executed by the primary CPU so there's no concurrent
modification happening with or without your diff.

FWIW, I'm fine with moving it into the kern_clock.c.  I assume that
this will make even more sense with some upcoming diffs.

> On Wed, Mar 16, 2016 at 02:13:13PM +0900, Masao Uebayashi wrote:
> > This clarifies that the single, global `ticks' is owned by kern_clock.c.
> > timeout(9) is only one of users of `ticks', even though its handler,
> > timeout_hardclock_update(), is called from hardclock() after update of
> > `ticks' every time.
> > 
> > Theoretically timecounter(9)'s tick, tc_ticktock(), is independent of
> > the value of `ticks'.  Then it must be safe to update `ticks' first then
> > tick timecounter(9).  I leave this order as is for now.
> > 
> > Index: sys/kern/kern_clock.c
> > ===================================================================
> > RCS file: /cvs/src/sys/kern/kern_clock.c,v
> > retrieving revision 1.88
> > diff -u -p -r1.88 kern_clock.c
> > --- sys/kern/kern_clock.c   11 Jun 2015 16:03:04 -0000      1.88
> > +++ sys/kern/kern_clock.c   16 Mar 2016 04:30:42 -0000
> > @@ -191,6 +191,7 @@ hardclock(struct clockframe *frame)
> >             return;
> >  
> >     tc_ticktock();
> > +   ticks++;
> >  
> >     /*
> >      * Update real-time timeout queue.
> > Index: sys/kern/kern_timeout.c
> > ===================================================================
> > RCS file: /cvs/src/sys/kern/kern_timeout.c,v
> > retrieving revision 1.43
> > diff -u -p -r1.43 kern_timeout.c
> > --- sys/kern/kern_timeout.c 20 Jul 2015 23:47:20 -0000      1.43
> > +++ sys/kern/kern_timeout.c 16 Mar 2016 04:30:42 -0000
> > @@ -304,8 +304,6 @@ timeout_hardclock_update(void)
> >  
> >     mtx_enter(&timeout_mutex);
> >  
> > -   ticks++;
> > -
> >     MOVEBUCKET(0, ticks);
> >     if (MASKWHEEL(0, ticks) == 0) {
> >             MOVEBUCKET(1, ticks);
> 

Reply via email to