svn commit: r239916 - stable/8/sys/kern
John Baldwin
jhb at FreeBSD.org
Thu Aug 30 18:30:09 UTC 2012
Author: jhb
Date: Thu Aug 30 18:30:08 2012
New Revision: 239916
URL: http://svn.freebsd.org/changeset/base/239916
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/8/sys/kern/kern_event.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/boot/ (props changed)
stable/8/sys/cddl/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/compat/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/ (props changed)
stable/8/sys/dev/e1000/ (props changed)
stable/8/sys/dev/sound/ (props changed)
stable/8/sys/dev/sound/pci/ (props changed)
stable/8/sys/dev/virtio/ (props changed)
stable/8/sys/kern/ (props changed)
stable/8/sys/sys/ (props changed)
stable/8/sys/vm/ (props changed)
Modified: stable/8/sys/kern/kern_event.c
==============================================================================
--- stable/8/sys/kern/kern_event.c Thu Aug 30 18:29:49 2012 (r239915)
+++ stable/8/sys/kern/kern_event.c Thu Aug 30 18:30:08 2012 (r239916)
@@ -494,6 +494,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)
{
@@ -507,7 +511,6 @@ timertoticks(intptr_t data)
return tticks;
}
-/* XXX - move to kern_timeout.c? */
static void
filt_timerexpire(void *knx)
{
@@ -517,9 +520,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);
}
}
@@ -527,7 +537,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)
{
@@ -551,7 +560,6 @@ filt_timerattach(struct knote *kn)
return (0);
}
-/* XXX - move to kern_timeout.c? */
static void
filt_timerdetach(struct knote *kn)
{
@@ -564,7 +572,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-stable
mailing list