Module Name: src Committed By: thorpej Date: Sat Oct 10 18:18:05 UTC 2020
Modified Files: src/sys/kern: kern_cctr.c Log Message: Add some more detail/explanation to the calibration timing diagram. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/kern/kern_cctr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_cctr.c diff -u src/sys/kern/kern_cctr.c:1.11 src/sys/kern/kern_cctr.c:1.12 --- src/sys/kern/kern_cctr.c:1.11 Sat Oct 10 03:05:04 2020 +++ src/sys/kern/kern_cctr.c Sat Oct 10 18:18:04 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_cctr.c,v 1.11 2020/10/10 03:05:04 thorpej Exp $ */ +/* $NetBSD: kern_cctr.c,v 1.12 2020/10/10 18:18:04 thorpej Exp $ */ /*- * Copyright (c) 2020 Jason R. Thorpe @@ -43,25 +43,39 @@ * Calibration happens periodically, and works like this: * * Secondary CPU Primary CPU - * T0 = local CC * Send IPI to publish reference CC * ---------> + * Indicate Primary Ready + * <---------------------------- + * T0 = local CC + * Indicate Secondary Ready + * -----------------> * (assume this happens at Tavg) Publish reference CC - * <----------------------- - * Notice publication + * Indicate completion + * <------------------------ + * Notice completion * T1 = local CC * * Tavg = (T0 + T1) / 2 * * Delta = Tavg - Published primary CC value * + * "Notice completion" is performed by waiting for the primary to set + * the calibration state to FINISHED. This is a little unfortunate, + * because T0->Tavg involves a single store-release on the secondary, and + * Tavg->T1 involves a store-relaxed and a store-release. It would be + * better to simply wait for the reference CC to transition from 0 to + * non-0 (i.e. just wait for a single store-release from Tavg->T1), but + * if the cycle counter just happened to read back as 0 at that instant, + * we would never break out of the loop. + * * We trigger calibration roughly once a second; the period is actually * skewed based on the CPU index in order to avoid lock contention. The * calibration interval does not need to be precise, and so this is fine. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_cctr.c,v 1.11 2020/10/10 03:05:04 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_cctr.c,v 1.12 2020/10/10 18:18:04 thorpej Exp $"); #include <sys/param.h> #include <sys/atomic.h>