| 1 Hz pulses | 5 s pulses | |
|---|---|---|
| tickless (NO_HZ_IDLE) | tickless, 1Hz | tickless, 5s |
| tickful (nohz=off) | tickful, 1Hz | tickful, 5s |
| back-dated (entry.S timestamp) | tickful, 1Hz | tickless, 5s |
| spin-poll (mlichvar mode) | tickful, 1Hz | — |
| spin-poll (bracketed counter) | tickless, 1Hz | — |
Cortex-A53 (BPI-R64), 12.5 MHz arch counter, u-blox GNSS timepulse
into pps-gpio, in-kernel hardpps() disciplining
CLOCK_REALTIME with STA_PPSTIME|STA_PPSFREQ|STA_PLL. Kernel: the timekeeping
series (timekeeping branch)
on 7.3-rc1 — including the idle-sleep bound while a slew is in flight and the
proportional ntp_error correction — plus silent bench instrumentation (per-pulse
ring captured in the PPS hardirq, drained to disk once a minute in the pulse's
shadow). No distro userspace: a single static PID 1 sets the date from
NMEA, binds hardpps, and sleeps. All periodic wakeup sources were disabled
(vmstat, runtime-PM autosuspend, fair dl_server, ethernet not probed).
Tickless cells boot NO_HZ_IDLE; tickful cells add nohz=off
on the same kernel binary.
The proportional drain engages when accumulated ntp_error exceeds one minute's worth of ±1-dither delivery (~45 ns here), repays over ~10 s re-sized each second, hands back to the dither below threshold, and aborts mid-second if it overshoots zero.
Per-pulse capture cost from the spin loop telemetry. Mode 0 (mlichvar semantics): duration of the pps_get_ts() call made after edge detection — its variance feeds directly into the measured phase (right panel). Mode 1: half the counter bracket around the detecting GPIO read — the capture uncertainty by construction.
Counter value is stamped at exception vector entry; this measures entry to the timestamping snapshot in the pps-gpio hardirq — on tickless kernels the deferred timekeeping catch-up runs in between.
This run is the test asked for on the list: hardpps on a tickless kernel driven by a real PPS source, with its real jitter and IRQ latency, and the CPU genuinely idle between pulses.
pps-gpio; timestamp taken in the hardirq handler.nohz=off.snapshot_ntp_error() — the divergence between the ideal
NTP-disciplined time and the sanitized clock_gettime() line that
the series corrects in pps_get_ts() — plus the corrected
ts_real phase against the second boundary. The kernel discipline
state (hardpps corrections, second_overflow decisions, every mult step) is
logged via printk to the kmsg ring and drained to disk per dump.nohz=off) A/B
comparison on identical hardware are the follow-ups.