calctsru() can be simplified. Its length makes it look more
complicated than it really is. We're converting from ticks to
nanoseconds and storing nanoseconds in a timespec:
- Remove the check for zero. Pointless.
- Convert from ticks to nanoseconds inline. No intermediate
variables.
- Use NSEC_TO_TIMSPEC() to abbreviate the nsec -> timespec conversion.
ok?
Index: kern_resource.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_resource.c,v
retrieving revision 1.69
diff -u -p -r1.69 kern_resource.c
--- kern_resource.c 25 Sep 2020 20:24:32 -0000 1.69
+++ kern_resource.c 25 Oct 2020 17:05:57 -0000
@@ -47,6 +47,7 @@
#include <sys/ktrace.h>
#include <sys/sched.h>
#include <sys/signalvar.h>
+#include <sys/time.h>
#include <sys/mount.h>
#include <sys/syscallargs.h>
@@ -408,34 +409,12 @@ void
calctsru(struct tusage *tup, struct timespec *up, struct timespec *sp,
struct timespec *ip)
{
- u_quad_t st, ut, it;
- int freq;
+ int freq = stathz ? stathz : hz;
- st = tup->tu_sticks;
- ut = tup->tu_uticks;
- it = tup->tu_iticks;
-
- if (st + ut + it == 0) {
- timespecclear(up);
- timespecclear(sp);
- if (ip != NULL)
- timespecclear(ip);
- return;
- }
-
- freq = stathz ? stathz : hz;
-
- st = st * 1000000000 / freq;
- sp->tv_sec = st / 1000000000;
- sp->tv_nsec = st % 1000000000;
- ut = ut * 1000000000 / freq;
- up->tv_sec = ut / 1000000000;
- up->tv_nsec = ut % 1000000000;
- if (ip != NULL) {
- it = it * 1000000000 / freq;
- ip->tv_sec = it / 1000000000;
- ip->tv_nsec = it % 1000000000;
- }
+ NSEC_TO_TIMESPEC(tup->tu_uticks * 1000000000 / freq, up);
+ NSEC_TO_TIMESPEC(tup->tu_sticks * 1000000000 / freq, sp);
+ if (ip != NULL)
+ NSEC_TO_TIMESPEC(tup->tu_iticks * 1000000000 / freq, ip);
}
void