[PATCH RFC 10/11] rust: device: remove logging methods

From: Thomas Weißschuh

Date: Sun Oct 11 2026 - 08:57:03 EST


To support dynamic debug, the logging needs to happen through a macro
call. Only a macro provides the possibility to statically allocate the
descriptor used by the dynamic debug core.

For consistency also remove the other logging methods.
They have no external users anyways.

All functions are thin wrappers around Device::printk() anyways.
Only Device::pr_dbg() contains additional logic, move that to
!dev_dbg().

As a side-effect this now evaluates cfg(debug_assertions) in the context
of the caller and not device.rs. Which matches the C macros better.

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

diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs
index 2291d85b6849..2d49063f4f7c 100644
--- a/rust/kernel/device.rs
+++ b/rust/kernel/device.rs
@@ -298,88 +298,6 @@ pub unsafe fn from_raw<'a>(ptr: *mut bindings::device) -> &'a Self {
unsafe { &*ptr.cast() }
}

- /// Prints an emergency-level message (level 0) prefixed with device information.
- ///
- /// More details are available from [`dev_emerg`].
- ///
- /// [`dev_emerg`]: crate::dev_emerg
- pub fn pr_emerg(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_EMERG, args) };
- }
-
- /// Prints an alert-level message (level 1) prefixed with device information.
- ///
- /// More details are available from [`dev_alert`].
- ///
- /// [`dev_alert`]: crate::dev_alert
- pub fn pr_alert(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_ALERT, args) };
- }
-
- /// Prints a critical-level message (level 2) prefixed with device information.
- ///
- /// More details are available from [`dev_crit`].
- ///
- /// [`dev_crit`]: crate::dev_crit
- pub fn pr_crit(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_CRIT, args) };
- }
-
- /// Prints an error-level message (level 3) prefixed with device information.
- ///
- /// More details are available from [`dev_err`].
- ///
- /// [`dev_err`]: crate::dev_err
- pub fn pr_err(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_ERR, args) };
- }
-
- /// Prints a warning-level message (level 4) prefixed with device information.
- ///
- /// More details are available from [`dev_warn`].
- ///
- /// [`dev_warn`]: crate::dev_warn
- pub fn pr_warn(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_WARNING, args) };
- }
-
- /// Prints a notice-level message (level 5) prefixed with device information.
- ///
- /// More details are available from [`dev_notice`].
- ///
- /// [`dev_notice`]: crate::dev_notice
- pub fn pr_notice(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_NOTICE, args) };
- }
-
- /// Prints an info-level message (level 6) prefixed with device information.
- ///
- /// More details are available from [`dev_info`].
- ///
- /// [`dev_info`]: crate::dev_info
- pub fn pr_info(&self, args: fmt::Arguments<'_>) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_INFO, args) };
- }
-
- /// Prints a debug-level message (level 7) prefixed with device information.
- ///
- /// More details are available from [`dev_dbg`].
- ///
- /// [`dev_dbg`]: crate::dev_dbg
- pub fn pr_dbg(&self, args: fmt::Arguments<'_>) {
- if cfg!(debug_assertions) {
- // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
- unsafe { self.printk(bindings::KERN_DEBUG, args) };
- }
- }
-
/// Prints the provided message to the console.
///
/// # Safety
@@ -387,7 +305,7 @@ pub fn pr_dbg(&self, args: fmt::Arguments<'_>) {
/// Callers must ensure that `klevel` is null-terminated; in particular, one of the
/// `KERN_*`constants, for example, `KERN_CRIT`, `KERN_ALERT`, etc.
#[cfg_attr(not(CONFIG_PRINTK), allow(unused_variables))]
- unsafe fn printk(&self, klevel: &[u8], msg: fmt::Arguments<'_>) {
+ pub unsafe fn printk(&self, klevel: &[u8], msg: fmt::Arguments<'_>) {
// SAFETY: `klevel` is null-terminated and one of the kernel constants. `self.as_raw`
// is valid because `self` is valid. The "%pA" format string expects a pointer to
// `fmt::Arguments`, which is what we're passing as the last argument.
@@ -738,9 +656,9 @@ macro_rules! impl_device_context_into_aref {
#[doc(hidden)]
#[macro_export]
macro_rules! dev_printk {
- ($method:ident, $dev:expr, $($f:tt)*) => {
- $crate::device::Device::$method($dev.as_ref(), $crate::prelude::fmt!($($f)*))
- }
+ ($klevel:expr, $dev:expr, $args:expr) => {
+ $crate::device::Device::printk($dev.as_ref(), $klevel, $args)
+ };
}

/// Prints an emergency-level message (level 0) prefixed with device information.
@@ -766,7 +684,14 @@ macro_rules! dev_printk {
/// ```
#[macro_export]
macro_rules! dev_emerg {
- ($($f:tt)*) => { $crate::dev_printk!(pr_emerg, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_EMERG, dev, args) }
+ }
+ }
+ }
}

/// Prints an alert-level message (level 1) prefixed with device information.
@@ -792,7 +717,14 @@ macro_rules! dev_emerg {
/// ```
#[macro_export]
macro_rules! dev_alert {
- ($($f:tt)*) => { $crate::dev_printk!(pr_alert, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_ALERT, dev, args) }
+ }
+ }
+ }
}

/// Prints a critical-level message (level 2) prefixed with device information.
@@ -818,7 +750,14 @@ macro_rules! dev_alert {
/// ```
#[macro_export]
macro_rules! dev_crit {
- ($($f:tt)*) => { $crate::dev_printk!(pr_crit, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_CRIT, dev, args) }
+ }
+ }
+ }
}

/// Prints an error-level message (level 3) prefixed with device information.
@@ -844,7 +783,14 @@ macro_rules! dev_crit {
/// ```
#[macro_export]
macro_rules! dev_err {
- ($($f:tt)*) => { $crate::dev_printk!(pr_err, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_ERR, dev, args) }
+ }
+ }
+ }
}

/// Prints a warning-level message (level 4) prefixed with device information.
@@ -870,7 +816,14 @@ macro_rules! dev_err {
/// ```
#[macro_export]
macro_rules! dev_warn {
- ($($f:tt)*) => { $crate::dev_printk!(pr_warn, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_WARNING, dev, args) }
+ }
+ }
+ }
}

/// Prints a notice-level message (level 5) prefixed with device information.
@@ -896,7 +849,14 @@ macro_rules! dev_warn {
/// ```
#[macro_export]
macro_rules! dev_notice {
- ($($f:tt)*) => { $crate::dev_printk!(pr_notice, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_NOTICE, dev, args) }
+ }
+ }
+ }
}

/// Prints an info-level message (level 6) prefixed with device information.
@@ -922,7 +882,14 @@ macro_rules! dev_notice {
/// ```
#[macro_export]
macro_rules! dev_info {
- ($($f:tt)*) => { $crate::dev_printk!(pr_info, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ // SAFETY: `klevel` is null-terminated, uses one of the kernel constants.
+ unsafe { $crate::dev_printk!($crate::bindings::KERN_INFO, dev, args) }
+ }
+ }
+ }
}

/// Prints a debug-level message (level 7) prefixed with device information.
@@ -948,5 +915,14 @@ macro_rules! dev_info {
/// ```
#[macro_export]
macro_rules! dev_dbg {
- ($($f:tt)*) => { $crate::dev_printk!(pr_dbg, $($f)*) }
+ ($dev:expr, $($f:tt)*) => {
+ match (&$dev, $crate::prelude::fmt!($($f)*)) {
+ (dev, args) => {
+ 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