git: 28d08dc7d051 - main - clock_gettime: Fix CLOCK_THREAD_CPUTIME_ID race
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 17 Mar 2022 19:40:14 UTC
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=28d08dc7d051a4e058cc0004cf4dd884f87037a2 commit 28d08dc7d051a4e058cc0004cf4dd884f87037a2 Author: firk <firk@cantconnect.ru> AuthorDate: 2022-03-15 22:22:21 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2022-03-17 19:39:00 +0000 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 74e7c42004ad..0bab05c65ffc 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);