From 28d08dc7d051a4e058cc0004cf4dd884f87037a2 Mon Sep 17 00:00:00 2001 From: firk Date: Tue, 15 Mar 2022 18:22:21 -0400 Subject: [PATCH] clock_gettime: Fix CLOCK_THREAD_CPUTIME_ID race Use a spinlock section instead of a critical section to synchronize with statclock(). Otherwise the CLOCK_THREAD_CPUTIME_ID clock can appear to go backwards. PR: 262273 Reviewed by: markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D34568 --- sys/kern/kern_time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 74e7c42004a..0bab05c65ff 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -256,11 +256,11 @@ kern_thread_cputime(struct thread *targettd, struct timespec *ats) uint64_t runtime, curtime, switchtime; if (targettd == NULL) { /* current thread */ - critical_enter(); + spinlock_enter(); switchtime = PCPU_GET(switchtime); curtime = cpu_ticks(); runtime = curthread->td_runtime; - critical_exit(); + spinlock_exit(); runtime += curtime - switchtime; } else { PROC_LOCK_ASSERT(targettd->td_proc, MA_OWNED); -- 2.45.0