[PATCH 1/5] rust: print: handle `pr_cont` separately
Gary Guo <[email protected]> Tue, 28 Jul 2026 15:52:08 +0100
| Newsgroups | org.kernel.vger.rust-for-linux,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Currently all prints are handled centrally through the `print_macro` macro with everything except `pr_cont` passing `true` as the second macro argument. This is all redundant, call `call_printk_cont` directly from `pr_cont` instead. Signed-off-by: Gary Guo <[email protected]> --- rust/kernel/print.rs | 75 ++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/rust/kernel/print.rs b/rust/kernel/print.rs index 6fd84389a858..066ef7a7d5ce 100644 --- a/rust/kernel/print.rs +++ b/rust/kernel/print.rs @@ -51,21 +51,13 @@ pub mod format_strings { /// given `prefix`, which are the kernel's `KERN_*` constants. /// /// [`_printk`]: srctree/include/linux/printk.h - const fn generate(is_cont: bool, prefix: &[u8; 3]) -> [u8; LENGTH] { + const fn generate(prefix: &[u8; 3]) -> [u8; LENGTH] { // Ensure the `KERN_*` macros are what we expect. assert!(prefix[0] == b'\x01'); - if is_cont { - assert!(prefix[1] == b'c'); - } else { - assert!(prefix[1] >= b'0' && prefix[1] <= b'7'); - } + assert!(prefix[1] >= b'0' && prefix[1] <= b'7'); assert!(prefix[2] == b'\x00'); - let suffix: &[u8; LENGTH - LENGTH_PREFIX] = if is_cont { - b"%pA\0\0\0\0\0" - } else { - b"%s: %pA\0" - }; + let suffix: &[u8; LENGTH - LENGTH_PREFIX] = b"%s: %pA\0"; [ prefix[0], prefix[1], suffix[0], suffix[1], suffix[2], suffix[3], suffix[4], suffix[5], @@ -79,15 +71,14 @@ pub mod format_strings { // // Furthermore, `static` instead of `const` is used to share the strings // for all the kernel. - pub static EMERG: [u8; LENGTH] = generate(false, bindings::KERN_EMERG); - pub static ALERT: [u8; LENGTH] = generate(false, bindings::KERN_ALERT); - pub static CRIT: [u8; LENGTH] = generate(false, bindings::KERN_CRIT); - pub static ERR: [u8; LENGTH] = generate(false, bindings::KERN_ERR); - pub static WARNING: [u8; LENGTH] = generate(false, bindings::KERN_WARNING); - pub static NOTICE: [u8; LENGTH] = generate(false, bindings::KERN_NOTICE); - pub static INFO: [u8; LENGTH] = generate(false, bindings::KERN_INFO); - pub static DEBUG: [u8; LENGTH] = generate(false, bindings::KERN_DEBUG); - pub static CONT: [u8; LENGTH] = generate(true, bindings::KERN_CONT); + pub static EMERG: [u8; LENGTH] = generate(bindings::KERN_EMERG); + pub static ALERT: [u8; LENGTH] = generate(bindings::KERN_ALERT); + pub static CRIT: [u8; LENGTH] = generate(bindings::KERN_CRIT); + pub static ERR: [u8; LENGTH] = generate(bindings::KERN_ERR); + pub static WARNING: [u8; LENGTH] = generate(bindings::KERN_WARNING); + pub static NOTICE: [u8; LENGTH] = generate(bindings::KERN_NOTICE); + pub static INFO: [u8; LENGTH] = generate(bindings::KERN_INFO); + pub static DEBUG: [u8; LENGTH] = generate(bindings::KERN_DEBUG); } /// Prints a message via the kernel's [`_printk`]. @@ -127,13 +118,23 @@ pub unsafe fn call_printk( #[doc(hidden)] #[cfg_attr(not(CONFIG_PRINTK), allow(unused_variables))] pub fn call_printk_cont(args: fmt::Arguments<'_>) { + const CONT_FMT: [u8; 6] = { + // Ensure the `KERN_*` macros are what we expect (2 byte + 1 byte nul-termination). + assert!(bindings::KERN_CONT.len() == 3); + + let mut fmt = *b"\0\0%pA\0"; + fmt[0] = bindings::KERN_CONT[0]; + fmt[1] = bindings::KERN_CONT[1]; + fmt + }; + // `_printk` does not seem to fail in any path. // // SAFETY: The format string is fixed. #[cfg(CONFIG_PRINTK)] unsafe { bindings::_printk( - format_strings::CONT.as_ptr(), + CONT_FMT.as_ptr(), core::ptr::from_ref(&args).cast::<c_void>(), ); } @@ -147,8 +148,7 @@ pub fn call_printk_cont(args: fmt::Arguments<'_>) { #[macro_export] #[expect(clippy::crate_in_macro_def)] macro_rules! print_macro ( - // The non-continuation cases (most of them, e.g. `INFO`). - ($format_string:path, false, $($arg:tt)+) => ( + ($format_string:path, $($arg:tt)+) => ( // To remain sound, `arg`s must be expanded outside the `unsafe` block. // Typically one would use a `let` binding for that; however, `format_args!` // takes borrows on the arguments, but does not extend the scope of temporaries. @@ -169,20 +169,13 @@ macro_rules! print_macro ( } } ); - - // The `CONT` case. - ($format_string:path, true, $($arg:tt)+) => ( - $crate::print::call_printk_cont( - $crate::prelude::fmt!($($arg)+), - ); - ); ); /// Stub for doctests #[cfg(testlib)] #[macro_export] macro_rules! print_macro ( - ($format_string:path, $e:expr, $($arg:tt)+) => ( + ($format_string:path, $($arg:tt)+) => ( () ); ); @@ -217,7 +210,7 @@ macro_rules! print_macro ( #[macro_export] macro_rules! pr_emerg ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::EMERG, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::EMERG, $($arg)*) ) ); @@ -242,7 +235,7 @@ macro_rules! pr_emerg ( #[macro_export] macro_rules! pr_alert ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::ALERT, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::ALERT, $($arg)*) ) ); @@ -267,7 +260,7 @@ macro_rules! pr_alert ( #[macro_export] macro_rules! pr_crit ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::CRIT, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::CRIT, $($arg)*) ) ); @@ -292,7 +285,7 @@ macro_rules! pr_crit ( #[macro_export] macro_rules! pr_err ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::ERR, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::ERR, $($arg)*) ) ); @@ -317,7 +310,7 @@ macro_rules! pr_err ( #[macro_export] macro_rules! pr_warn ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::WARNING, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::WARNING, $($arg)*) ) ); @@ -342,7 +335,7 @@ macro_rules! pr_warn ( #[macro_export] macro_rules! pr_notice ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::NOTICE, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::NOTICE, $($arg)*) ) ); @@ -368,7 +361,7 @@ macro_rules! pr_notice ( #[doc(alias = "print")] macro_rules! pr_info ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::INFO, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::INFO, $($arg)*) ) ); @@ -396,7 +389,7 @@ macro_rules! pr_info ( macro_rules! pr_debug ( ($($arg:tt)*) => ( if cfg!(debug_assertions) { - $crate::print_macro!($crate::print::format_strings::DEBUG, false, $($arg)*) + $crate::print_macro!($crate::print::format_strings::DEBUG, $($arg)*) } ) ); @@ -425,7 +418,9 @@ macro_rules! pr_debug ( #[macro_export] macro_rules! pr_cont ( ($($arg:tt)*) => ( - $crate::print_macro!($crate::print::format_strings::CONT, true, $($arg)*) + $crate::print::call_printk_cont( + $crate::prelude::fmt!($($arg)+), + ) ) ); -- 2.54.0