On Fri, Dec 04, 2020 at 12:17:31PM -0600, Scott Cheloha wrote:
> On Fri, Dec 04, 2020 at 09:56:02AM +0100, Claudio Jeker wrote:
> > On Thu, Dec 03, 2020 at 10:05:30PM -0600, Scott Cheloha wrote:
> > > Hi,
> > > 
> > > srp_finalize(9) uses tsleep(9) to spin while it waits for the object's
> > > refcount to reach zero.  It blocks for up to 1 tick and then checks
> > > the refecount again and again.
> > > 
> > > We can just as easily do this with tsleep_nsec(9) and block for 1
> > > millisecond per interval.
> > > 
> > > ok?
> > > 
> > > Index: kern_srp.c
> > > ===================================================================
> > > RCS file: /cvs/src/sys/kern/kern_srp.c,v
> > > retrieving revision 1.12
> > > diff -u -p -r1.12 kern_srp.c
> > > --- kern_srp.c    8 Sep 2017 05:36:53 -0000       1.12
> > > +++ kern_srp.c    4 Dec 2020 04:04:39 -0000
> > > @@ -274,7 +274,7 @@ void
> > >  srp_finalize(void *v, const char *wmesg)
> > >  {
> > >   while (srp_referenced(v))
> > > -         tsleep(v, PWAIT, wmesg, 1);
> > > +         tsleep_nsec(v, PWAIT, wmesg, MSEC_TO_NSEC(1));
> > >  }
> > >  
> > >  #else /* MULTIPROCESSOR */
> > > 
> > 
> > Why only 1ms instead of the original 10ms (at least on most archs)?
> 
> The underlying implementation can only process timeouts from
> hardclock(9) which runs about hz times per second.  If we tell the
> thread to "sleep for 10ms" it's almost always going to overshoot the
> next hardclock(9) and wind up sleeping ~20ms.
> 
> Some people run with HZ=1000 kernels.  I don't think many people run
> with kernels with a higher HZ than that, though.  So I figure a 1ms
> sleep is "good enough" for all practical kernels.  On HZ=100 kernels
> the thread will oversleep because it doesn't process timeouts often
> enough to honor the 1ms request.
> 
> Basically I'm trying to pick a reasonable polling interval (not too
> fast) that also won't cause the existing default kernel to block for
> longer than it already does (~10ms).  The default kernel is HZ=100, so
> a 1ms sleep will, in this case, almost always sleep ~10ms per
> iteration of this loop.

This sleep should basically be 'as short as possible', since it's waiting
out SRP references which are very short lived.  ok jmatthew@

Reply via email to