[PATCH v2 0/3] rust: add watchdog abstraction and Rust softdog driver
Artem Lytkin <[email protected]> Thu, 23 Jul 2026 19:15:26 +0300
| Newsgroups | org.kernel.vger.linux-watchdog,org.kernel.vger.linux-kernel,org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <[email protected]> |
This series adds Rust abstractions for the watchdog subsystem and a Rust software watchdog driver functionally equivalent to the core of the C softdog. Patch 1 adds the watchdog abstraction: a Device wrapper, an Info wrapper with option flags, an Options configuration struct, a #[vtable] WatchdogOps trait with an associated Data type for driver private data, and a generic Registration that owns the device, the ops table and the driver data in a single heap allocation. Patch 2 adds a minimal kernel::reboot module wrapping emergency_restart(), needed by the softdog driver. Patch 3 adds the softdog_rs driver: an hrtimer is armed on start and re-armed on every keepalive ping; if userspace stops pinging, the timer expires and the system is restarted via emergency_restart(). Changes since v1 [1]: Most of v2 is a redesign addressing the review feedback from Guenter (via the Sashiko review [2]), Miguel, and the kernel test robot: - The ops table is no longer a &'static mut supplied by the driver; it is built by the abstraction and embedded in the per-device heap allocation, so multiple device instances need no static mutable state (Sashiko). - Driver private data is now supported via an associated Data type; every callback receives a reference to it (Sashiko). - Callbacks now take only shared references and Data must be Sync: the watchdog core does not hold its lock on every callback path (the first start/ping on open, the reboot notifier stop, and the stop on unregistration run without it), so exclusive references would be unsound. - max_hw_heartbeat_ms is configurable and the stop()-or-heartbeat registration requirement is documented (Sashiko). - Removed the Registration::device() accessor that allowed aliasing with the references used in callbacks (Sashiko). - stop_on_reboot is now opt-in and rejected with EINVAL for drivers without stop(); nowayout defaults to CONFIG_WATCHDOG_NOWAYOUT (Sashiko). - The watchdog is always stopped on unregistration so no callback can run after the driver data is freed. - softdog_rs now actually bites: it arms an hrtimer and calls emergency_restart() on expiry, instead of relying on the (wrong) assumption that the core handles expiry (Sashiko). - Kconfig mutual exclusion fixed to SOFT_WATCHDOG=n; !SOFT_WATCHDOG still allowed both drivers as modules (Sashiko). - C helpers marked __rust_helper (Miguel), and updated for the const-qualified watchdog_active()/watchdog_hw_running(). - Fixed rustfmt and clippy issues reported by the kernel test robot. - Drivers no longer use raw bindings: added the Info wrapper, the flags module, and the kernel::reboot module. - Added the new rust watchdog files to MAINTAINERS. - Rebased onto current mainline (post-v7.2-rc4). [1] https://lore.kernel.org/linux-watchdog/[email protected]/ [2] https://sashiko.dev/#/patchset/20260323195138.5541-1-iprintercanon%40gmail.com Artem Lytkin (3): rust: watchdog: add watchdog device abstraction rust: reboot: add emergency_restart() wrapper watchdog: softdog_rs: add Rust software watchdog driver MAINTAINERS | 2 + drivers/watchdog/Kconfig | 12 + drivers/watchdog/Makefile | 1 + drivers/watchdog/softdog_rs.rs | 143 +++++++++++ rust/bindings/bindings_helper.h | 2 + rust/helpers/helpers.c | 1 + rust/helpers/watchdog.c | 38 +++ rust/kernel/lib.rs | 3 + rust/kernel/reboot.rs | 19 ++ rust/kernel/watchdog.rs | 522 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 743 insertions(+) create mode 100644 drivers/watchdog/softdog_rs.rs create mode 100644 rust/helpers/watchdog.c create mode 100644 rust/kernel/reboot.rs create mode 100644 rust/kernel/watchdog.rs -- 2.43.0