aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_time.c
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2020-02-04 05:25:51 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2020-02-04 05:25:51 +0000
commitcbc108919090590010b44d8f654ca10370013b2c (patch)
tree8cd3d564dce17ab4ac491210f2f7ad105aae310f /sys/kern/kern_time.c
parent2506c76121da2863fb10de5b194b4e65b6c382b5 (diff)
Notes
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r--sys/kern/kern_time.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 98db5e7fb006..7514cf00b8f0 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -242,7 +242,7 @@ sys_clock_gettime(struct thread *td, struct clock_gettime_args *uap)
return (error);
}
-static inline void
+static inline void
cputick2timespec(uint64_t runtime, struct timespec *ats)
{
runtime = cputick2usec(runtime);
@@ -250,12 +250,15 @@ cputick2timespec(uint64_t runtime, struct timespec *ats)
ats->tv_nsec = runtime % 1000000 * 1000;
}
-static void
-get_thread_cputime(struct thread *targettd, struct timespec *ats)
+void
+kern_thread_cputime(struct thread *targettd, struct timespec *ats)
{
uint64_t runtime, curtime, switchtime;
+ struct proc *p;
if (targettd == NULL) { /* current thread */
+ p = curthread->td_proc;
+ PROC_LOCK_ASSERT(p, MA_OWNED);
critical_enter();
switchtime = PCPU_GET(switchtime);
curtime = cpu_ticks();
@@ -263,6 +266,8 @@ get_thread_cputime(struct thread *targettd, struct timespec *ats)
critical_exit();
runtime += curtime - switchtime;
} else {
+ p = targettd->td_proc;
+ PROC_LOCK_ASSERT(p, MA_OWNED);
thread_lock(targettd);
runtime = targettd->td_runtime;
thread_unlock(targettd);
@@ -270,12 +275,13 @@ get_thread_cputime(struct thread *targettd, struct timespec *ats)
cputick2timespec(runtime, ats);
}
-static void
-get_process_cputime(struct proc *targetp, struct timespec *ats)
+void
+kern_process_cputime(struct proc *targetp, struct timespec *ats)
{
uint64_t runtime;
struct rusage ru;
+ PROC_LOCK_ASSERT(targetp, MA_OWNED);
PROC_STATLOCK(targetp);
rufetch(targetp, &ru);
runtime = targetp->p_rux.rux_runtime;
@@ -300,14 +306,14 @@ get_cputime(struct thread *td, clockid_t clock_id, struct timespec *ats)
td2 = tdfind(tid, p->p_pid);
if (td2 == NULL)
return (EINVAL);
- get_thread_cputime(td2, ats);
+ kern_thread_cputime(td2, ats);
PROC_UNLOCK(td2->td_proc);
} else {
pid = clock_id & CPUCLOCK_ID_MASK;
error = pget(pid, PGET_CANSEE, &p2);
if (error != 0)
return (EINVAL);
- get_process_cputime(p2, ats);
+ kern_process_cputime(p2, ats);
PROC_UNLOCK(p2);
}
return (0);
@@ -360,11 +366,11 @@ kern_clock_gettime(struct thread *td, clockid_t clock_id, struct timespec *ats)
ats->tv_nsec = 0;
break;
case CLOCK_THREAD_CPUTIME_ID:
- get_thread_cputime(NULL, ats);
+ kern_thread_cputime(NULL, ats);
break;
case CLOCK_PROCESS_CPUTIME_ID:
PROC_LOCK(p);
- get_process_cputime(p, ats);
+ kern_process_cputime(p, ats);
PROC_UNLOCK(p);
break;
default: