svn commit: r239915 - stable/9/sys/kern

John Baldwin jhb at FreeBSD.org
Thu Aug 30 18:29:50 UTC 2012


Author: jhb
Date: Thu Aug 30 18:29:49 2012
New Revision: 239915
URL: http://svn.freebsd.org/changeset/base/239915

Log:
  MFC 238424:
  Make the interval timings for EVFILT_TIMER more accurate.  tvtohz() always
  adds an extra tick to account for the current partial clock tick.  However,
  that is not appropriate for a repeating timer when the exact tvtohz() value
  should be used for subsequent intervals.  Fix repeating callouts for
  EVFILT_TIMER by subtracting 1 tick from the tvtohz() result similar to the
  fix used in realitexpire() for interval timers.
  
  While here, update a few comments to note that if the EVFILT_TIMER code
  were to move out of kern_event.c, it should move to kern_time.c (where the
  interval timer code it mimics lives) rather than kern_timeout.c.

Modified:
  stable/9/sys/kern/kern_event.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)
  stable/9/sys/dev/   (props changed)
  stable/9/sys/dev/e1000/   (props changed)
  stable/9/sys/dev/isp/   (props changed)
  stable/9/sys/dev/ixgbe/   (props changed)
  stable/9/sys/fs/   (props changed)
  stable/9/sys/fs/ntfs/   (props changed)
  stable/9/sys/modules/   (props changed)

Modified: stable/9/sys/kern/kern_event.c
==============================================================================
--- stable/9/sys/kern/kern_event.c	Thu Aug 30 18:03:03 2012	(r239914)
+++ stable/9/sys/kern/kern_event.c	Thu Aug 30 18:29:49 2012	(r239915)
@@ -512,6 +512,10 @@ knote_fork(struct knlist *list, int pid)
 	list->kl_unlock(list->kl_lockarg);
 }
 
+/*
+ * XXX: EVFILT_TIMER should perhaps live in kern_time.c beside the
+ * interval timer support code.
+ */
 static int
 timertoticks(intptr_t data)
 {
@@ -525,7 +529,6 @@ timertoticks(intptr_t data)
 	return tticks;
 }
 
-/* XXX - move to kern_timeout.c? */
 static void
 filt_timerexpire(void *knx)
 {
@@ -535,9 +538,16 @@ filt_timerexpire(void *knx)
 	kn->kn_data++;
 	KNOTE_ACTIVATE(kn, 0);	/* XXX - handle locking */
 
+	/*
+	 * timertoticks() uses tvtohz() which always adds 1 to allow
+	 * for the time until the next clock interrupt being strictly
+	 * less than 1 clock tick.  We don't want that here since we
+	 * want to appear to be in sync with the clock interrupt even
+	 * when we're delayed.
+	 */
 	if ((kn->kn_flags & EV_ONESHOT) != EV_ONESHOT) {
 		calloutp = (struct callout *)kn->kn_hook;
-		callout_reset_curcpu(calloutp, timertoticks(kn->kn_sdata),
+		callout_reset_curcpu(calloutp, timertoticks(kn->kn_sdata) - 1,
 		    filt_timerexpire, kn);
 	}
 }
@@ -545,7 +555,6 @@ filt_timerexpire(void *knx)
 /*
  * data contains amount of time to sleep, in milliseconds
  */
-/* XXX - move to kern_timeout.c? */
 static int
 filt_timerattach(struct knote *kn)
 {
@@ -569,7 +578,6 @@ filt_timerattach(struct knote *kn)
 	return (0);
 }
 
-/* XXX - move to kern_timeout.c? */
 static void
 filt_timerdetach(struct knote *kn)
 {
@@ -582,7 +590,6 @@ filt_timerdetach(struct knote *kn)
 	kn->kn_status |= KN_DETACHED;	/* knlist_remove usually clears it */
 }
 
-/* XXX - move to kern_timeout.c? */
 static int
 filt_timer(struct knote *kn, long hint)
 {


More information about the svn-src-all mailing list