[PATCH RFC 11/11] rust: device: enable dynamic debug for dev_dbg!()

From: Thomas Weißschuh

Date: Sun Oct 11 2026 - 08:58:00 EST


Wire up dynamic debug to also work for the dev_dbg!() macro.

Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx>
---
rust/kernel/device.rs | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs
index 2d49063f4f7c..db2c9adc5410 100644
--- a/rust/kernel/device.rs
+++ b/rust/kernel/device.rs
@@ -896,7 +896,7 @@ macro_rules! dev_info {
///
/// This level should be used for debug messages.
///
-/// Equivalent to the kernel's `dev_dbg` macro, except that it doesn't support dynamic debug yet.
+/// Equivalent to the kernel's `dev_dbg` macro.
///
/// Mimics the interface of [`std::print!`]. More information about the syntax is available from
/// [`core::fmt`] and [`std::format!`].
@@ -918,6 +918,15 @@ macro_rules! dev_dbg {
($dev:expr, $($f:tt)*) => {
match (&$dev, $crate::prelude::fmt!($($f)*)) {
(dev, args) => {
+ // TODO: Switch to cfg_select!() when that is usable.
+ #[cfg(any(CONFIG_DYNAMIC_DEBUG, all(CONFIG_DYNAMIC_DEBUG_CORE, debug_assertions)))]
+ $crate::dynamic_func_call!($crate::__format_string!($($f)*), || {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_DEBUG, dev, args) }
+ });
+
+ #[cfg(not(any(CONFIG_DYNAMIC_DEBUG,
+ all(CONFIG_DYNAMIC_DEBUG_CORE, debug_assertions))))]
if cfg!(debug_assertions) {
// SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
unsafe { $crate::dev_printk!($crate::bindings::KERN_DEBUG, dev, args) }

--
2.56.0