Actually, I spoke too soon. That's an algorithm used
to read deglitched hardware counters or ISR counters on
a single processor machine. But it may not be safe in
a multiprocessor environment where one CPU can read the
structure while a second CPU can be updating the
structure. There may be a way to update the
structure in a way that is MP safe, but I'll have
to think about it some more.
Sorry.
Allen (with foot planted firmly in mouth)
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]]On Behalf Of Allen Pulsifer
> Sent: Wednesday, March 29, 2000 11:36 PM
> To: Alfred Perlstein; Mike Smith
> Cc: Matthew Dillon; [EMAIL PROTECTED]
> Subject: RE: Using packed structs to gain cheap SMP primatives
>
>
> Here's another alternative for reading structures like time
> that always change monotonically: read the values in
> "MSB" to "LSB" order, then go back and check in reverse
> order that nothing has changed. For example, to read a
> structure containing hours, minutes, seconds:
>
> for (;;)
> { h = timep->hour;
> m = timep->minute;
> s = timep->second;
> if (m != timep->minute) continue;
> if (h != timep->hour) continue;
> break;
> }
>
> The assumption is that from the instant you first read
> timep->hour until the instant you double check its value,
> it could not have wrapped all the way back around to its
> previous value. Or to put it another way, if it has
> succeeding in wrapping all the way around, having a
> correct snapshot of the structure is the least of your
> problems and the value you use is arbitary.
>
> This same method can be used to read the MSW and LSW of
> any counter-like structure that is updated by an interrupt.
>
> Note this method will not work for a structure that can
> both increment and decrement--it has to be only one or
> the other.
>
> Allen
>
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED]]On Behalf Of Alfred Perlstein
> > Sent: Wednesday, March 29, 2000 10:25 PM
> > To: Mike Smith
> > Cc: Matthew Dillon; [EMAIL PROTECTED]
> > Subject: Using packed structs to gain cheap SMP primatives
> >
> >
> > * Mike Smith <[EMAIL PROTECTED]> [000329 17:03] wrote:
> > > > > For the single-process (1-fork) case, syscall overhead improved
> > > > > moderately from 1.6 uS in 4.0 to 1.3 uS in 5.0. I think the marked
> > > > > improvement in the competing-cpu's case is due to the movement of the
> > > > > MP lock inward somewhat (even for syscalls that aren't MP safe),
> > > > > the removal of a considerable number of unnecessary 'lock'ed
>instructions,
> > > > > and the removal of the cpl lock (which benefits spl*() code as well as
> > > > > syscall/interrupt code).
> > > > >
> > > > > I got similar results for calling sigprocmask():
> > > >
> > > > You should be able to remove the splhigh() from sigprocmask and run it
> > > > MPSAFE. At least, I can't find a reason not to (and it works here, yes).
> > >
> > > Just following on from this, one thing that I can see immediately being
> > > very important to me at least is a spinlock in the timecounter structure.
> > > Calcru and various other things call microtime(), and we're going to want
> > > to lock out updates and parallel accesses to the timecounter. What
> > > should we be using for an interrupt-disabling spinlock?
> >
> > One thing everyone should be aware of is that most archs will support
> > atomic read/write of a data value that's under a certail width (and
> > aligned properly)
> >
> > Yesterday I was looking at how Linux handles the gettimeofday stuff
> > without locking thier sys_tz variable, well it seems they don't care
> > or I'm missing something important.
> >
> > They just don't lock it, not that settimeofday will be called all that
> > often but it leaves me wondering what we can do about this, effectively
> > we can pack our tz (sys_tz in Linux) into a 32bit value which should
> > afford us read/write atomicity on every platform I'm aware of.
> >
> > In fact this can be quite effective for certain types of data structures,
> > even though our 'struct timezone' is two ints we can pack it into two
> > uint16 and pack a private structure, then copy it to a stack and expand
> > it into the user's address space.
> >
> > What do you guys think about that? Am I totally missing something
> > that makes the Linux way right/ok? (no locking on a 64bit struct)
> >
> > --
> > -Alfred Perlstein - [[EMAIL PROTECTED]|[EMAIL PROTECTED]]
> >
> >
> > To Unsubscribe: send mail to [EMAIL PROTECTED]
> > with "unsubscribe freebsd-current" in the body of the message
>
>
> To Unsubscribe: send mail to [EMAIL PROTECTED]
> with "unsubscribe freebsd-current" in the body of the message
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message