summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_time.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-04-23 12:46:27 +0000
committermav <mav@FreeBSD.org>2014-04-23 12:46:27 +0000
commit825aecc9cf7fa256ac990b622c9cd918477d011a (patch)
tree6eded17405d1a1e2aeb24beb402dea7d8b2295f0 /sys/kern/kern_time.c
parentd9c1f7d4465819a77ecbd2b9624e16cc6aa07dde (diff)
downloadFreeBSD-src-825aecc9cf7fa256ac990b622c9cd918477d011a.zip
FreeBSD-src-825aecc9cf7fa256ac990b622c9cd918477d011a.tar.gz
MFC r264550:
Fix VIRTUAL and PROF interval timers for short intervals, broken at r247903. Due to the way those timers are implemented, we can't handle very short intervals. In addition to that mentioned patch caused math overflows for short intervals. To avoid that round those intervals to 1 tick. PR: kern/187668
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r--sys/kern/kern_time.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 3aaed60..f6974c6 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -774,6 +774,14 @@ kern_setitimer(struct thread *td, u_int which, struct itimerval *aitv,
timevalsub(&oitv->it_value, &ctv);
}
} else {
+ if (aitv->it_interval.tv_sec == 0 &&
+ aitv->it_interval.tv_usec != 0 &&
+ aitv->it_interval.tv_usec < tick)
+ aitv->it_interval.tv_usec = tick;
+ if (aitv->it_value.tv_sec == 0 &&
+ aitv->it_value.tv_usec != 0 &&
+ aitv->it_value.tv_usec < tick)
+ aitv->it_value.tv_usec = tick;
PROC_SLOCK(p);
*oitv = p->p_stats->p_timer[which];
p->p_stats->p_timer[which] = *aitv;
OpenPOWER on IntegriCloud