From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16D0A3DDDCD for ; Mon, 23 Mar 2026 19:52:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774295556; cv=none; b=dRrkloKIAvn9Cd2ISq3/mo+QO1vKj+Lo51CFgCg5nMYewLb1dW3fv62w/TRRf76pCgMZK1zGA5XBFUAKQ42db7ijwgCPZBWBn/4zRSCa+jJCdxhxXZDubVDZhnCUMHrmp29FHOu4Hfo7KgNTHNXuWtDyQ5uH5w9yVRDqxgd8VW4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774295556; c=relaxed/simple; bh=6lHvRBJVTFISgQuhcMFypyadWLPXF+SYk/dEigk1U3U=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n31rwb4Qcd3Y4TlnBmdtVSEf8FiroIeY9DM9SI2+wvOSoCeOwHktFVQiF/kusSvJHd/kRkeC7jJkeiKfl2mc8gf6MMAbE2YGikuOCQrq+HoyLOJZBX/9usbYmkwUiPaR/mJUwPk+ma+qNxcxC3CkuF5J9sWnDYrb745axiWNljo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XppH8gxL; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XppH8gxL" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5a13f6bcbf4so620860e87.1 for ; Mon, 23 Mar 2026 12:52:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774295553; x=1774900353; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=V5L/uO+Cwo0tKAvA8esxWTY+PEV+J2o8TPXsnbML/a8=; b=XppH8gxLLQn2dJMRB7QHvZBJrT9xI+A2eryqkGV2MzdAWvy95iboE11UEu2ZhlhKKN Cff2+8xQIjVSnEwK9oACwzQdAIhqgXLS7KkEt/ptcy2SOqu1R16IQ8NUHxcELki3sWc0 GqeiyFc3qDA5nXsj7PPsdhTdzcA8/jqtNi6zTeR2dIOvCNaO1GWRTtHdKkTvW5YEFYRO ppiaDSHTdNawUJkqluhk/MfpFR252GlbTkftLfJvMV835UFszt37wlMlVQG4d8ja3zRh ybH4Ica6QWrLaLOQvK+Zp+pUdNstO1EqI2r3UgArHqlmVuar15An5YVuE8MMj0zbIXJI iOHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774295553; x=1774900353; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=V5L/uO+Cwo0tKAvA8esxWTY+PEV+J2o8TPXsnbML/a8=; b=ImacSBxdqWE3jSRtUqvfg3GiYNgD9xZAuJD0VVJKdl45HV7dXgfgHvY774Ix7qTnZj ZyQVu84MxignssuEfHZj1R6SLuHcC4Bo/3JhQgcE0oCXq9BhSm3uVK6Jcle59FIzb6LG sQjXCUzhpXo3u1R8KpKN7HnygiAjBMm6ySIpEjQiNar262Qse8m9w7YC4DiPIs7jE7Ah 1d1Q26kYJSHW/8JD5eK/FcKxvZSCnzfZJ7ILvAdTuHjfaro3aLlxEDwdq3RouXtFh+YL bYKj7dQ2VwePUJXFaPTnzaBpGRO2Qab6po0dsQ+dFM8l4/gfoGoIuVsHWW4WWEw3CbFg Um7w== X-Gm-Message-State: AOJu0Yw3gMFsO1yYZr1oXvVw0Q5YUIXVvAT8hbOcUy8ewMdNxKV1gf21 /Q4vRhKNF9wE+qLbTFtGVwT+67plJaHOIPJeaa4EpDp9oc4rGjiRZi2JGVHvJpKn X-Gm-Gg: ATEYQzxpAsM5yWSLCwCrZSaC17rijYAs5+jCr16TpXVzzleW28hdvJnEZwrWcTyPGJw UCVWVHChbFdLoUHzQH1kzXJzwNWGMyQlp7Q6bWyhTnYA+RifptUMgDpqQMc6ZQ5DwOJVbcfEP18 aX099jDJHxjd/9jQjMQ2A9zuQUVOoQ5YihiCWpLVDsKHUcP49+IjfH8M7jd/swRjzbbMfOzbfc/ Iv1+berdTwWBN4T1aZRErJlyz0rkhS+bX/LCE3ai3lN1Rk6XiyBroTTokwxdzvPZbYSxfQWjnVv zpyOM+ywYKvVxls+MTmgpYEn69FaWRqCxbQGE1YtB9Nmk7cZmN57DtfXu5XpnAJth+mf4MDcFGw fD3eCYEb1JhXLT1AANattQff93BAwq2dhNue7uDhrJ2G9TWMj8t8OdliunDmwAeRA9IcKhIH4sY LmFKTamU6VWysoCB5RHbGwk7TpiMOMrVnxJwdvlRwFLwGOkTT+1OkwIIjI3DVYnMNDtQVGMaY0f nVgRnNX/QcJ6YS8c/Wxj70G89EC X-Received: by 2002:a05:6512:1195:b0:5a2:7ac2:afcc with SMTP id 2adb3069b0e04-5a285ae4bafmr5002425e87.7.1774295553035; Mon, 23 Mar 2026 12:52:33 -0700 (PDT) Received: from localhost.localdomain (46-138-191-69.dynamic.spd-mgts.ru. [46.138.191.69]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5a285192b5esm2713762e87.16.2026.03.23.12.52.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 12:52:32 -0700 (PDT) From: Artem Lytkin To: linux-kernel@vger.kernel.org Subject: [PATCH 2/2] watchdog: softdog_rs: add Rust software watchdog driver Date: Mon, 23 Mar 2026 22:52:09 +0300 Message-ID: <20260323195209.5581-2-iprintercanon@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260323195209.5581-1-iprintercanon@gmail.com> References: <20260323195209.5581-1-iprintercanon@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add a Rust software watchdog driver that uses the new Rust watchdog abstraction. This demonstrates that the abstraction is functional and can be used to write real watchdog drivers. The driver implements start and stop operations. Unlike the C softdog, this simplified version does not use hrtimers for the actual countdown -- the watchdog core handles the timeout expiry and keepalive management. This makes it suitable as a proof-of-concept driver for the Rust watchdog abstraction. The driver registers as "Rust Software Watchdog" with a default timeout of 60 seconds, matching the C softdog's defaults. The Kconfig option SOFT_WATCHDOG_RS depends on !SOFT_WATCHDOG to prevent both drivers from being enabled simultaneously. Signed-off-by: Artem Lytkin --- drivers/watchdog/Kconfig | 12 +++++ drivers/watchdog/Makefile | 1 + drivers/watchdog/softdog_rs.rs | 88 ++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 drivers/watchdog/softdog_rs.rs diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index d3b9df7d466b0..b7aad39f0de01 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -160,6 +160,18 @@ config SOFT_WATCHDOG To compile this driver as a module, choose M here: the module will be called softdog. +config SOFT_WATCHDOG_RS + tristate "Rust software watchdog" + depends on RUST && !SOFT_WATCHDOG + select WATCHDOG_CORE + help + A software watchdog driver written in Rust using the Rust watchdog + device abstraction. This is a simplified Rust equivalent of the + C softdog driver. + + To compile this driver as a module, choose M here: the + module will be called softdog_rs. + config SOFT_WATCHDOG_PRETIMEOUT bool "Software watchdog pretimeout governor support" depends on SOFT_WATCHDOG && WATCHDOG_PRETIMEOUT_GOV diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index ba52099b12539..3039e5068f835 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -239,6 +239,7 @@ obj-$(CONFIG_MAX77620_WATCHDOG) += max77620_wdt.o obj-$(CONFIG_NCT6694_WATCHDOG) += nct6694_wdt.o obj-$(CONFIG_ZIIRAVE_WATCHDOG) += ziirave_wdt.o obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o +obj-$(CONFIG_SOFT_WATCHDOG_RS) += softdog_rs.o obj-$(CONFIG_MENF21BMC_WATCHDOG) += menf21bmc_wdt.o obj-$(CONFIG_MENZ069_WATCHDOG) += menz69_wdt.o obj-$(CONFIG_RAVE_SP_WATCHDOG) += rave-sp-wdt.o diff --git a/drivers/watchdog/softdog_rs.rs b/drivers/watchdog/softdog_rs.rs new file mode 100644 index 0000000000000..c8ff125e817bc --- /dev/null +++ b/drivers/watchdog/softdog_rs.rs @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Rust software watchdog driver. +//! +//! A simplified Rust implementation of the software watchdog, demonstrating +//! the Rust watchdog device abstraction. + +use kernel::prelude::*; +use kernel::watchdog; + +const DEFAULT_MARGIN: u32 = 60; +const MAX_MARGIN: u32 = 65535; + +module! { + type: SoftdogModule, + name: "softdog_rs", + authors: ["Artem Lytkin"], + description: "Rust Software Watchdog Device Driver", + license: "GPL", +} + +struct SoftdogOps; + +#[vtable] +impl watchdog::WatchdogOps for SoftdogOps { + fn start(dev: &mut watchdog::Device) -> Result { + pr_info!("watchdog started (timeout={}s)\n", dev.timeout()); + Ok(()) + } + + fn stop(_dev: &mut watchdog::Device) -> Result { + pr_info!("watchdog stopped\n"); + Ok(()) + } +} + +static SOFTDOG_INFO: bindings::watchdog_info = bindings::watchdog_info { + options: bindings::WDIOF_SETTIMEOUT + | bindings::WDIOF_KEEPALIVEPING + | bindings::WDIOF_MAGICCLOSE, + firmware_version: 0, + identity: { + let mut id = [0u8; 32]; + let s = b"Rust Software Watchdog"; + let mut i = 0; + while i < s.len() { + id[i] = s[i]; + i += 1; + } + id + }, +}; + +static mut SOFTDOG_OPS: bindings::watchdog_ops = + watchdog::create_watchdog_ops::(); + +struct SoftdogModule { + _reg: watchdog::Registration, +} + +impl kernel::Module for SoftdogModule { + fn init(module: &'static ThisModule) -> Result { + // SAFETY: SOFTDOG_OPS is only mutated here, before registration, + // and this function is called exactly once during module init. + let ops = unsafe { &mut *core::ptr::addr_of_mut!(SOFTDOG_OPS) }; + + let reg = watchdog::Registration::register( + module, + None, + &SOFTDOG_INFO, + ops, + DEFAULT_MARGIN, + 1, + MAX_MARGIN, + false, + )?; + + pr_info!("initialized (timeout={}s)\n", DEFAULT_MARGIN); + + Ok(SoftdogModule { _reg: reg }) + } +} + +impl Drop for SoftdogModule { + fn drop(&mut self) { + pr_info!("exit\n"); + } +} -- 2.43.0