tvtohz() was originally designed for tsleep() and timeout() operations but
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 7 Jan 2004 11:07:04 +0000 (11:07 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 7 Jan 2004 11:07:04 +0000 (11:07 +0000)
it is also used to time nanosleep() ops.  The problem is that in order to
compensate for the fact that a clock interrupt might occur just after a
thread blocks or registers a timeout, this function effectively added +1
to the returned value plus added another +1 for timeouts that were not
integer multiples if the clock interrupt frequency.

Split tvtohz() into two routines: tvtohz_low() and tvtohz_high().
tvtohz_low() does not do any compensation, tvtohz_high() does.

Add the kern.sleep_hardloop sysctl, which defaults to 0 (off).  If set to
1 this will cause nanosleep() to attempt to time exactly the requested
interval (which could cost more cpu) rather then rounding it off to a
multiple of hz.  If set to 2 nanosleep() will only do the more rigid
timing for requests less then 1 second.   Also change the normal hz-baesd
case to only compensate by +1, not +2, in order to improve accuracy.

16 files changed:
sys/kern/kern_clock.c
sys/kern/kern_event.c
sys/kern/kern_sig.c
sys/kern/kern_synch.c
sys/kern/kern_threads.c
sys/kern/kern_time.c
sys/kern/sys_generic.c
sys/kern/vfs_aio.c
sys/net/bpf.c
sys/netinet/in_rmx.c
sys/netinet6/in6_rmx.c
sys/netproto/ncp/ncp_sock.c
sys/netproto/smb/smb_trantcp.c
sys/sys/signalvar.h
sys/sys/time.h
sys/vfs/smbfs/smbfs_smb.c

index 3823153..7f622ba 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     @(#)kern_clock.c        8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_clock.c,v 1.105.2.10 2002/10/17 13:19:40 maxim Exp $
- * $DragonFly: src/sys/kern/kern_clock.c,v 1.12 2003/10/17 07:30:42 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_clock.c,v 1.13 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include "opt_ntp.h"
@@ -268,35 +268,28 @@ hardclock(frame)
 }
 
 /*
- * Compute number of ticks in the specified amount of time.
+ * Compute number of ticks for the specified amount of time.  The 
+ * return value is intended to be used in a clock interrupt timed
+ * operation and guarenteed to meet or exceed the requested time.
+ * If the representation overflows, return INT_MAX.  The minimum return
+ * value is 1 ticks and the function will average the calculation up.
+ * If any value greater then 0 microseconds is supplied, a value
+ * of at least 2 will be returned to ensure that a near-term clock
+ * interrupt does not cause the timeout to occur (degenerately) early.
+ *
+ * Note that limit checks must take into account microseconds, which is
+ * done simply by using the smaller signed long maximum instead of
+ * the unsigned long maximum.
+ *
+ * If ints have 32 bits, then the maximum value for any timeout in
+ * 10ms ticks is 248 days.
  */
 int
-tvtohz(tv)
-       struct timeval *tv;
+tvtohz_high(struct timeval *tv)
 {
-       unsigned long ticks;
+       int ticks;
        long sec, usec;
 
-       /*
-        * If the number of usecs in the whole seconds part of the time
-        * difference fits in a long, then the total number of usecs will
-        * fit in an unsigned long.  Compute the total and convert it to
-        * ticks, rounding up and adding 1 to allow for the current tick
-        * to expire.  Rounding also depends on unsigned long arithmetic
-        * to avoid overflow.
-        *
-        * Otherwise, if the number of ticks in the whole seconds part of
-        * the time difference fits in a long, then convert the parts to
-        * ticks separately and add, using similar rounding methods and
-        * overflow avoidance.  This method would work in the previous
-        * case but it is slightly slower and assumes that hz is integral.
-        *
-        * Otherwise, round the time difference down to the maximum
-        * representable value.
-        *
-        * If ints have 32 bits, then the maximum value for any timeout in
-        * 10ms ticks is 248 days.
-        */
        sec = tv->tv_sec;
        usec = tv->tv_usec;
        if (usec < 0) {
@@ -313,19 +306,42 @@ tvtohz(tv)
                       sec, usec);
 #endif
                ticks = 1;
-       } else if (sec <= LONG_MAX / 1000000)
-               ticks = (sec * 1000000 + (unsigned long)usec + (tick - 1))
-                       / tick + 1;
-       else if (sec <= LONG_MAX / hz)
-               ticks = sec * hz
-                       + ((unsigned long)usec + (tick - 1)) / tick + 1;
+       } else if (sec <= INT_MAX / hz) {
+               ticks = (int)(sec * hz + 
+                           ((u_long)usec + (tick - 1)) / tick) + 1;
+       } else {
+               ticks = INT_MAX;
+       }
+       return (ticks);
+}
+
+/*
+ * Compute number of ticks for the specified amount of time, erroring on
+ * the side of it being too low to ensure that sleeping the returned number
+ * of ticks will not result in a late return.
+ *
+ * The supplied timeval may not be negative and should be normalized.  A
+ * return value of 0 is possible if the timeval converts to less then
+ * 1 tick.
+ *
+ * If ints have 32 bits, then the maximum value for any timeout in
+ * 10ms ticks is 248 days.
+ */
+int
+tvtohz_low(struct timeval *tv)
+{
+       int ticks;
+       long sec;
+
+       sec = tv->tv_sec;
+       if (sec <= INT_MAX / hz)
+               ticks = (int)(sec * hz + (u_long)tv->tv_usec / tick);
        else
-               ticks = LONG_MAX;
-       if (ticks > INT_MAX)
                ticks = INT_MAX;
-       return ((int)ticks);
+       return (ticks);
 }
 
+
 /*
  * Start profiling on a process.
  *
index ae0fe56..2cebaab 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_event.c,v 1.2.2.9 2003/05/08 07:47:16 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_event.c,v 1.9 2003/07/30 00:19:14 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_event.c,v 1.10 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -306,7 +306,7 @@ filt_timerexpire(void *knx)
        if ((kn->kn_flags & EV_ONESHOT) == 0) {
                tv.tv_sec = kn->kn_sdata / 1000;
                tv.tv_usec = (kn->kn_sdata % 1000) * 1000;
-               tticks = tvtohz(&tv);
+               tticks = tvtohz_high(&tv);
                calloutp = (struct callout *)kn->kn_hook;
                callout_reset(calloutp, tticks, filt_timerexpire, kn);
        }
@@ -328,7 +328,7 @@ filt_timerattach(struct knote *kn)
 
        tv.tv_sec = kn->kn_sdata / 1000;
        tv.tv_usec = (kn->kn_sdata % 1000) * 1000;
-       tticks = tvtohz(&tv);
+       tticks = tvtohz_high(&tv);
 
        kn->kn_flags |= EV_CLEAR;               /* automatically set */
        MALLOC(calloutp, struct callout *, sizeof(*calloutp),
@@ -612,7 +612,7 @@ kqueue_scan(struct file *fp, int maxevents, struct kevent *ulistp,
                        timeout = -1;
                else 
                        timeout = atv.tv_sec > 24 * 60 * 60 ?
-                           24 * 60 * 60 * hz : tvtohz(&atv);
+                           24 * 60 * 60 * hz : tvtohz_high(&atv);
                getmicrouptime(&rtv);
                timevaladd(&atv, &rtv);
        } else {
@@ -630,7 +630,7 @@ retry:
                ttv = atv;
                timevalsub(&ttv, &rtv);
                timeout = ttv.tv_sec > 24 * 60 * 60 ?
-                       24 * 60 * 60 * hz : tvtohz(&ttv);
+                       24 * 60 * 60 * hz : tvtohz_high(&ttv);
        }
 
 start:
index 2d1c26e..8036a2f 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_sig.c  8.7 (Berkeley) 4/18/94
  * $FreeBSD: src/sys/kern/kern_sig.c,v 1.72.2.17 2003/05/16 16:34:34 obrien Exp $
- * $DragonFly: src/sys/kern/kern_sig.c,v 1.23 2003/10/24 14:10:46 daver Exp $
+ * $DragonFly: src/sys/kern/kern_sig.c,v 1.24 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -1010,6 +1010,25 @@ signotify_remote(void *arg)
 
 #endif
 
+/*
+ * If the current process has received a signal that would interrupt a
+ * system call, return EINTR or ERESTART as appropriate.
+ */
+int
+iscaught(struct proc *p)
+{
+       int sig;
+
+       if (p) {
+               if ((sig = CURSIG(p)) != 0) {
+                       if (SIGISMEMBER(p->p_sigacts->ps_sigintr, sig))
+                               return (EINTR);                        
+                       return (ERESTART);     
+               }                         
+       }
+       return(EWOULDBLOCK);
+}
+
 /*
  * If the current process has received a signal (should be caught or cause
  * termination, should interrupt current syscall), return the signal number.
index be3d2be..e0fb35f 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_synch.c        8.9 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/kern/kern_synch.c,v 1.87.2.6 2002/10/13 07:29:53 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_synch.c,v 1.25 2003/10/17 07:30:42 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_synch.c,v 1.26 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -468,6 +468,7 @@ resume:
                 */
                td->td_wmesg = NULL;
        }
+       /* inline of iscaught() */
        if (p) {
                if (catch && (sig != 0 || (sig = CURSIG(p)))) {
                        if (SIGISMEMBER(p->p_sigacts->ps_sigintr, sig))
index e15b2ef..21a24e6 100644 (file)
@@ -47,7 +47,7 @@
  * and I certainly make no claims as to its fitness for *any* purpose.
  * 
  * $FreeBSD: src/sys/kern/kern_threads.c,v 1.15 1999/08/28 00:46:15 peter Exp $
- * $DragonFly: src/sys/kern/kern_threads.c,v 1.7 2003/07/30 00:19:14 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_threads.c,v 1.8 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -96,7 +96,7 @@ thr_sleep(struct thr_sleep_args *uap)
                        p->p_wakeup = 0;
                        return (EINVAL);
                }
-               timo = tvtohz(&atv);
+               timo = tvtohz_high(&atv);
        }
 
        uap->sysmsg_result = 0;
index ccb2341..9cfd988 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)kern_time.c 8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/kern/kern_time.c,v 1.68.2.1 2002/10/01 08:00:41 bde Exp $
- * $DragonFly: src/sys/kern/kern_time.c,v 1.11 2003/11/20 06:05:30 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_time.c,v 1.12 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -48,6 +48,7 @@
 #include <sys/proc.h>
 #include <sys/time.h>
 #include <sys/vnode.h>
+#include <sys/sysctl.h>
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
 #include <sys/msgport2.h>
@@ -70,6 +71,9 @@ static int    settime (struct timeval *);
 static void    timevalfix (struct timeval *);
 static void    no_lease_updatetime (int);
 
+static int     sleep_hardloop = 0;
+SYSCTL_INT(_kern, OID_AUTO, sleep_hardloop, CTLFLAG_RW, &sleep_hardloop, 0, "");
+
 static void 
 no_lease_updatetime(deltat)
        int deltat;
@@ -210,13 +214,36 @@ nanosleep1(struct timespec *rqt, struct timespec *rmt)
                return (EINVAL);
        if (rqt->tv_sec < 0 || (rqt->tv_sec == 0 && rqt->tv_nsec == 0))
                return (0);
-       getnanouptime(&ts);
-       timespecadd(&ts, rqt);
-       TIMESPEC_TO_TIMEVAL(&tv, rqt);
+       nanouptime(&ts);
+       timespecadd(&ts, rqt);          /* ts = target timestamp compare */
+       TIMESPEC_TO_TIMEVAL(&tv, rqt);  /* tv = sleep interval */
        for (;;) {
-               error = tsleep(&nanowait, PCATCH, "nanslp",
-                   tvtohz(&tv));
-               getnanouptime(&ts2);
+               /*
+                * If hard looping is allowed and the interval is too short,
+                * hard loop with a yield, otherwise sleep with a conservative
+                * tick count.  In normal mode sleep with one extra tick count
+                * which will be sufficient for most sleep values.  If it
+                * isn't sufficient in normal mode we will wind up doing an
+                * extra loop.
+                *
+                * sleep_hardloop = 0   Normal mode
+                * sleep_hardloop = 1   Strict hard loop
+                * sleep_hardloop = 2   Hard loop on < 1 tick requests only
+                */
+               int ticks = tvtohz_low(&tv);
+
+               if (sleep_hardloop) {
+                       if (ticks == 0) {
+                               uio_yield();
+                               error = iscaught(curproc);
+                       } else {
+                               error = tsleep(&nanowait, PCATCH, "nanslp", 
+                                               ticks + sleep_hardloop - 1);
+                       }
+               } else {
+                       error = tsleep(&nanowait, PCATCH, "nanslp", ticks + 1);
+               }
+               nanouptime(&ts2);
                if (error != EWOULDBLOCK) {
                        if (error == ERESTART)
                                error = EINTR;
@@ -509,7 +536,7 @@ setitimer(struct setitimer_args *uap)
                        untimeout(realitexpire, (caddr_t)p, p->p_ithandle);
                if (timevalisset(&aitv.it_value)) 
                        p->p_ithandle = timeout(realitexpire, (caddr_t)p,
-                                               tvtohz(&aitv.it_value));
+                                               tvtohz_high(&aitv.it_value));
                getmicrouptime(&ctv);
                timevaladd(&aitv.it_value, &ctv);
                p->p_realtimer = aitv;
@@ -526,7 +553,7 @@ setitimer(struct setitimer_args *uap)
  * Else compute next time timer should go off which is > current time.
  * This is where delay in processing this timeout causes multiple
  * SIGALRM calls to be compressed into one.
- * tvtohz() always adds 1 to allow for the time until the next clock
+ * tvtohz_high() always adds 1 to allow for the time until the next clock
  * interrupt being strictly less than 1 clock tick, but we don't want
  * that here since we want to appear to be in sync with the clock
  * interrupt even when we're delayed.
@@ -554,7 +581,7 @@ realitexpire(arg)
                        ntv = p->p_realtimer.it_value;
                        timevalsub(&ntv, &ctv);
                        p->p_ithandle = timeout(realitexpire, (caddr_t)p,
-                           tvtohz(&ntv) - 1);
+                           tvtohz_low(&ntv));
                        splx(s);
                        return;
                }
index 2c945e2..8ec1676 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)sys_generic.c       8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $
- * $DragonFly: src/sys/kern/sys_generic.c,v 1.15 2003/10/21 20:06:47 dillon Exp $
+ * $DragonFly: src/sys/kern/sys_generic.c,v 1.16 2004/01/07 11:04:18 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -594,7 +594,7 @@ retry:
                ttv = atv;
                timevalsub(&ttv, &rtv);
                timo = ttv.tv_sec > 24 * 60 * 60 ?
-                   24 * 60 * 60 * hz : tvtohz(&ttv);
+                   24 * 60 * 60 * hz : tvtohz_high(&ttv);
        }
        s = splhigh();
        if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
@@ -726,7 +726,7 @@ retry:
                ttv = atv;
                timevalsub(&ttv, &rtv);
                timo = ttv.tv_sec > 24 * 60 * 60 ?
-                   24 * 60 * 60 * hz : tvtohz(&ttv);
+                   24 * 60 * 60 * hz : tvtohz_high(&ttv);
        } 
        s = splhigh(); 
        if ((p->p_flag & P_SELECT) == 0 || nselcoll != ncoll) {
index 7c589ef..07ad338 100644 (file)
@@ -14,7 +14,7 @@
  * of the author.  This software is distributed AS-IS.
  *
  * $FreeBSD: src/sys/kern/vfs_aio.c,v 1.70.2.28 2003/05/29 06:15:35 alc Exp $
- * $DragonFly: src/sys/kern/vfs_aio.c,v 1.11 2003/11/05 23:27:15 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_aio.c,v 1.12 2004/01/07 11:04:18 dillon Exp $
  */
 
 /*
@@ -1502,7 +1502,7 @@ aio_suspend(struct aio_suspend_args *uap)
                TIMESPEC_TO_TIMEVAL(&atv, &ts);
                if (itimerfix(&atv))
                        return (EINVAL);
-               timo = tvtohz(&atv);
+               timo = tvtohz_high(&atv);
        }
 
        ki = p->p_aioinfo;
@@ -2108,7 +2108,7 @@ aio_waitcomplete(struct aio_waitcomplete_args *uap)
                TIMESPEC_TO_TIMEVAL(&atv, &ts);
                if (itimerfix(&atv))
                        return (EINVAL);
-               timo = tvtohz(&atv);
+               timo = tvtohz_high(&atv);
        }
 
        ki = p->p_aioinfo;
index 7032f46..7ba7ab3 100644 (file)
@@ -38,7 +38,7 @@
  *      @(#)bpf.c      8.2 (Berkeley) 3/28/94
  *
  * $FreeBSD: src/sys/net/bpf.c,v 1.59.2.12 2002/04/14 21:41:48 luigi Exp $
- * $DragonFly: src/sys/net/bpf.c,v 1.9 2004/01/06 03:17:25 dillon Exp $
+ * $DragonFly: src/sys/net/bpf.c,v 1.10 2004/01/07 11:04:19 dillon Exp $
  */
 
 #include "use_bpf.h"
@@ -840,7 +840,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
                         * a one-shot timer.
                         */
                        if ((error = itimerfix(tv)) == 0)
-                               d->bd_rtout = tvtohz(tv) - 1;
+                               d->bd_rtout = tvtohz_low(tv);
                        break;
                }
 
index e569d7c..00b97e2 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/in_rmx.c,v 1.37.2.3 2002/08/09 14:49:23 ru Exp $
- * $DragonFly: src/sys/netinet/in_rmx.c,v 1.3 2003/08/23 11:18:00 rob Exp $
+ * $DragonFly: src/sys/netinet/in_rmx.c,v 1.4 2004/01/07 11:04:23 dillon Exp $
  */
 
 /*
@@ -325,7 +325,7 @@ in_rtqtimo(void *rock)
 
        atv.tv_usec = 0;
        atv.tv_sec = arg.nextstop - time_second;
-       timeout(in_rtqtimo, rock, tvtohz(&atv));
+       timeout(in_rtqtimo, rock, tvtohz_high(&atv));
 }
 
 void
index 3a9d2ce..c2d281a 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet6/in6_rmx.c,v 1.1.2.3 2002/04/28 05:40:27 suz Exp $    */
-/*     $DragonFly: src/sys/netinet6/in6_rmx.c,v 1.3 2003/08/23 11:02:45 rob Exp $      */
+/*     $DragonFly: src/sys/netinet6/in6_rmx.c,v 1.4 2004/01/07 11:07:04 dillon Exp $   */
 /*     $KAME: in6_rmx.c,v 1.11 2001/07/26 06:53:16 jinmei Exp $        */
 
 /*
@@ -381,7 +381,7 @@ in6_rtqtimo(void *rock)
 
        atv.tv_usec = 0;
        atv.tv_sec = arg.nextstop;
-       timeout(in6_rtqtimo, rock, tvtohz(&atv));
+       timeout(in6_rtqtimo, rock, tvtohz_high(&atv));
 }
 
 /*
@@ -436,7 +436,7 @@ in6_mtutimo(void *rock)
                printf("invalid mtu expiration time on routing table\n");
                arg.nextstop = time_second + 30;        /* last resort */
        }
-       timeout(in6_mtutimo, rock, tvtohz(&atv));
+       timeout(in6_mtutimo, rock, tvtohz_high(&atv));
 }
 
 #if 0
index 280fb29..cfcd5a8 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netncp/ncp_sock.c,v 1.2 1999/10/12 10:36:59 bp Exp $
- * $DragonFly: src/sys/netproto/ncp/ncp_sock.c,v 1.7 2003/08/07 21:54:35 dillon Exp $
+ * $DragonFly: src/sys/netproto/ncp/ncp_sock.c,v 1.8 2004/01/07 11:04:25 dillon Exp $
  *
  * Low level socket routines
  */
@@ -229,7 +229,7 @@ retry:
                        goto done;
                ttv=atv;
                timevalsub(&ttv, &rtv);
-               timo = tvtohz(&ttv);
+               timo = tvtohz_high(&ttv);
        }
        s = splhigh();
        if ((p->p_flag & P_SELECT) == 0) {
index 5b65578..da8228d 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netsmb/smb_trantcp.c,v 1.3.2.1 2001/05/22 08:32:34 bp Exp $
- * $DragonFly: src/sys/netproto/smb/smb_trantcp.c,v 1.6 2003/08/07 21:17:39 dillon Exp $
+ * $DragonFly: src/sys/netproto/smb/smb_trantcp.c,v 1.7 2004/01/07 11:04:27 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -128,7 +128,7 @@ retry:
                        goto done;
                ttv = atv;
                timevalsub(&ttv, &rtv);
-               timo = tvtohz(&ttv);
+               timo = tvtohz_high(&ttv);
        }
        s = splhigh();
        if ((p->p_flag & P_SELECT) == 0) {
index cc2c8e7..f979505 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)signalvar.h 8.6 (Berkeley) 2/19/95
  * $FreeBSD: src/sys/sys/signalvar.h,v 1.34.2.1 2000/05/16 06:58:05 dillon Exp $
- * $DragonFly: src/sys/sys/signalvar.h,v 1.10 2003/11/21 22:46:13 dillon Exp $
+ * $DragonFly: src/sys/sys/signalvar.h,v 1.11 2004/01/07 11:04:20 dillon Exp $
  */
 
 #ifndef        _SYS_SIGNALVAR_H_               /* tmp for user.h */
@@ -189,6 +189,7 @@ void        check_sigacts (void);
 void   execsigs (struct proc *p);
 void   gsignal (int pgid, int sig);
 int    issignal (struct proc *p);
+int    iscaught (struct proc *p);
 void   killproc (struct proc *p, char *why);
 void   pgsigio (struct sigio *, int signum, int checkctty);
 void   pgsignal (struct pgrp *pgrp, int sig, int checkctty);
index 91382b1..45f929f 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)time.h      8.5 (Berkeley) 5/4/95
  * $FreeBSD: src/sys/sys/time.h,v 1.42 1999/12/29 04:24:48 peter Exp $
- * $DragonFly: src/sys/sys/time.h,v 1.6 2003/11/22 19:30:57 asmodai Exp $
+ * $DragonFly: src/sys/sys/time.h,v 1.7 2004/01/07 11:04:20 dillon Exp $
  */
 
 #ifndef _SYS_TIME_H_
@@ -288,7 +288,8 @@ void        nanotime (struct timespec *ts);
 void   set_timecounter (struct timespec *ts);
 void   timevaladd (struct timeval *, struct timeval *);
 void   timevalsub (struct timeval *, struct timeval *);
-int    tvtohz (struct timeval *);
+int    tvtohz_high (struct timeval *);
+int    tvtohz_low (struct timeval *);
 void   update_timecounter (struct timecounter *tc);
 #else /* !_KERNEL */
 #include <time.h>
index 642aebb..f7783ba 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/fs/smbfs/smbfs_smb.c,v 1.1.2.2 2003/01/17 08:20:26 tjr Exp $
- * $DragonFly: src/sys/vfs/smbfs/smbfs_smb.c,v 1.5 2003/08/07 21:54:36 dillon Exp $
+ * $DragonFly: src/sys/vfs/smbfs/smbfs_smb.c,v 1.6 2004/01/07 11:04:21 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -966,7 +966,7 @@ smbfs_smb_trans2find2(struct smbfs_fctx *ctx)
                         * I've didn't notice any problem, but put code
                         * for it.
                         */
-                        tsleep(&flags, 0, "fix95", tvtohz(&tv));
+                        tsleep(&flags, 0, "fix95", tvtohz_high(&tv));
                }
 #endif
        }