Skip to content

v3.8.3 — status-LED dimming fix + watchdog post-mortem v3 (#99, #120)

Choose a tag to compare

@jnilo1 jnilo1 released this 10 Jun 12:50
· 8 commits to main since this release

Kernel-only release: status-LED dimming fix and watchdog post-mortem v3 (issue #99 instrumentation). Bootloader, rootfs and userdata payloads are unchanged — existing installs can upgrade with a kernel-only reflash.

Status LED flickered at 31 Hz instead of dimming (issue #120)

Since the Linux 4.8 timer-wheel rework the kernel rounds every timer expiry up by one jiffy so a timer can never fire early: the leds-gpio-pwm per-jiffy re-arm at jiffies + 1 actually fired every 2 ticks, doubling the PWM step to 8 ms and halving the PWM frequency to the 31 Hz flicker scoped in #120. Re-arming at jiffies (expire ASAP — bucketed at the next tick by construction) restores the designed 62.5 Hz at all duty levels (bench: 31.5 → 62.5 Hz at brightness 60/128/192). The sysfs scale stays 0–255; the 4-level duty quantization is now documented in the driver header.

Watchdog v1.4 — panic-path arm race fixed, panic record v3 (issue #99)

  • v1.3 regression fixed — candidate lists were silently lost. v3.8.1 armed the recovery reset before the best-effort wheel walks with a single WDTCNR=0 write, assuming a ~1.31 s grace window. With the userspace kicker active the up-counter sits far above the OVSEL=0 threshold and the chip resets instantly — every v3.8.1 capture came back timers=[none] (confirmed on the bench with DRAM breadcrumbs, then in the field by frtz13's capture). The arm is now two writes: clear the counter while the watchdog is halted, then enable.
  • delayed_work candidates resolved to their work function — e.g. neigh_managed_work instead of four indistinguishable delayed_work_timer_fn wrappers (the blind spot in the first #99 record-v2 field capture).
  • Wheel backlog captured. New record fields overdue= (jiffies the earliest queued timer is past expiry) and pending= (total queued timers) discriminate the two storm shapes behind #99: a wheel that never catches up (death spiral — large overdue) vs a softirq re-raised over a caught-up wheel (overdue ≈ 0). Bench: overdue=0j on a healthy crash, overdue=6269j (25.1 s of wheel starvation) under an injected soft-lockup.

Upgrading

Full install (recommended for new users):

./flash_install_rtl8196e.sh <gateway-ip>

Existing v3.8.x installs (including the #99 soak boxes) only need the kernel partition — config, Thread dataset and SSH keys untouched:

./3-Main-SoC-Realtek-RTL8196E/flash_remote.sh -y kernel <gateway-ip>

After upgrading, re-arm the panic capture: rm -f /userdata/panic/history (note: after a kernel-only reflash the login banner still shows the previous version — cosmetic only).