Simply omit conversions from timevals to hz and use the proper API. First one is trivial, the second one truncates the converted number of ticks to at leat one, which timeout_add_*(9) does automatically, so stop doing it manually.
Tested by running it on my X230. OK? Index: kern_time.c =================================================================== RCS file: /cvs/src/sys/kern/kern_time.c,v retrieving revision 1.120 diff -u -p -r1.120 kern_time.c --- kern_time.c 2 Jul 2019 14:54:36 -0000 1.120 +++ kern_time.c 21 Jul 2019 01:43:34 -0000 @@ -557,7 +557,6 @@ sys_setitimer(struct proc *p, void *v, r struct itimerval *oitv; struct process *pr = p->p_p; int error; - int timo; int which; which = SCARG(uap, which); @@ -585,8 +584,7 @@ sys_setitimer(struct proc *p, void *v, r timeout_del(&pr->ps_realit_to); getmicrouptime(&ctv); if (timerisset(&aitv.it_value)) { - timo = tvtohz(&aitv.it_value); - timeout_add(&pr->ps_realit_to, timo); + timeout_add_tv(&pr->ps_realit_to, &aitv.it_value); timeradd(&aitv.it_value, &ctv, &aitv.it_value); } pr->ps_timer[ITIMER_REAL] = aitv; @@ -621,18 +619,14 @@ realitexpire(void *arg) } for (;;) { struct timeval ctv, ntv; - int timo; timeradd(&tp->it_value, &tp->it_interval, &tp->it_value); getmicrouptime(&ctv); if (timercmp(&tp->it_value, &ctv, >)) { ntv = tp->it_value; timersub(&ntv, &ctv, &ntv); - timo = tvtohz(&ntv) - 1; - if (timo <= 0) - timo = 1; if ((pr->ps_flags & PS_EXITING) == 0) - timeout_add(&pr->ps_realit_to, timo); + timeout_add_tv(&pr->ps_realit_to, &ntv); return; } }