diff --git a/head/sys/kern/kern_time.c b/head/sys/kern/kern_time.c --- a/head/sys/kern/kern_time.c +++ b/head/sys/kern/kern_time.c @@ -254,13 +254,16 @@ kern_thread_cputime(struct thread *targettd, struct timespec *ats) { uint64_t runtime, curtime, switchtime; + struct proc *p; if (targettd == NULL) { /* current thread */ - critical_enter(); + p = curthread->td_proc; + PROC_LOCK_ASSERT(p, MA_OWNED); + PROC_STATLOCK(p); switchtime = PCPU_GET(switchtime); curtime = cpu_ticks(); runtime = curthread->td_runtime; - critical_exit(); + PROC_STATUNLOCK(p); runtime += curtime - switchtime; } else { PROC_LOCK_ASSERT(targettd->td_proc, MA_OWNED); @@ -362,7 +365,9 @@ ats->tv_nsec = 0; break; case CLOCK_THREAD_CPUTIME_ID: + PROC_LOCK(p); kern_thread_cputime(NULL, ats); + PROC_UNLOCK(p); break; case CLOCK_PROCESS_CPUTIME_ID: PROC_LOCK(p);