diff options
author | mav <mav@FreeBSD.org> | 2014-04-23 12:46:27 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2014-04-23 12:46:27 +0000 |
commit | 825aecc9cf7fa256ac990b622c9cd918477d011a (patch) | |
tree | 6eded17405d1a1e2aeb24beb402dea7d8b2295f0 /sys/kern/kern_time.c | |
parent | d9c1f7d4465819a77ecbd2b9624e16cc6aa07dde (diff) | |
download | FreeBSD-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.c | 8 |
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; |