* [PATCH v4] rust: macros: Fix macro referencing core and kernel crates [not found] <20250516122349.1944895-1-igor.korotin.ref@yahoo.com> @ 2025-05-16 12:23 ` Igor Korotin 2025-05-17 21:36 ` kernel test robot ` (3 more replies) 0 siblings, 4 replies; 14+ messages in thread From: Igor Korotin @ 2025-05-16 12:23 UTC (permalink / raw) To: Miguel Ojeda, Alex Gaynor Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux, Igor Korotin Fix macros and auto-generated code to use absolute paths, `::core::...` and `::kernel::...`, for core and kernel references. This prevents issues where user-defined modules named `core` or `kernel` could be picked up instead of the `core` or `kernel` crates. Suggested-by: Benno Lossin <benno.lossin@proton.me> Closes: https://github.com/Rust-for-Linux/linux/issues/1150 Signed-off-by: Igor Korotin <igor.korotin@yahoo.com> --- Changes since v3: - rebased changes on top of the branch rust-next - added one fix in auto-generated code in file rust/macros/module.rs - link to v3: https://lore.kernel.org/rust-for-linux/20250331102451.2362415-1-igor.korotin@yahoo.com/ Changes since v2: - rewrote commit message - link to v2: https://lore.kernel.org/lkml/20250328180312.2025317-2-igor.korotin@yahoo.com/ Changes since v1: - rewrote commit message - Added fixes in auto-generated code in files rust/macros/kunit.rs, rust/macros/module.rs, scripts/rustdoc_test_builder.rs, scripts/rustdoc_test_gen.rs thanks to Benno - link to v1: https://lore.kernel.org/lkml/20250326182302.5650-1-igor.korotin@yahoo.com/ rust/ffi.rs | 2 +- rust/kernel/device.rs | 2 +- rust/kernel/device_id.rs | 4 ++-- rust/kernel/kunit.rs | 8 ++++---- rust/kernel/static_assert.rs | 4 ++-- rust/kernel/str.rs | 4 ++-- rust/macros/kunit.rs | 22 +++++++++++----------- rust/macros/lib.rs | 6 +++--- rust/macros/module.rs | 31 ++++++++++++++++--------------- scripts/rustdoc_test_builder.rs | 6 +++--- scripts/rustdoc_test_gen.rs | 16 ++++++++++------ 11 files changed, 55 insertions(+), 50 deletions(-) diff --git a/rust/ffi.rs b/rust/ffi.rs index 584f75b49862..d60aad792af4 100644 --- a/rust/ffi.rs +++ b/rust/ffi.rs @@ -17,7 +17,7 @@ macro_rules! alias { // Check size compatibility with `core`. const _: () = assert!( - core::mem::size_of::<$name>() == core::mem::size_of::<core::ffi::$name>() + ::core::mem::size_of::<$name>() == ::core::mem::size_of::<::core::ffi::$name>() ); )*} } diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs index 5c372cf27ed0..539888465cc6 100644 --- a/rust/kernel/device.rs +++ b/rust/kernel/device.rs @@ -240,7 +240,7 @@ impl DeviceContext for Normal {} macro_rules! dev_printk { ($method:ident, $dev:expr, $($f:tt)*) => { { - ($dev).$method(core::format_args!($($f)*)); + ($dev).$method(::core::format_args!($($f)*)); } } } diff --git a/rust/kernel/device_id.rs b/rust/kernel/device_id.rs index e5859217a579..0a4eb56d98f2 100644 --- a/rust/kernel/device_id.rs +++ b/rust/kernel/device_id.rs @@ -159,7 +159,7 @@ macro_rules! module_device_table { "_", line!(), "_", stringify!($table_name)) ] - static $module_table_name: [core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] = - unsafe { core::mem::transmute_copy($table_name.raw_ids()) }; + static $module_table_name: [::core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] = + unsafe { ::core::mem::transmute_copy($table_name.raw_ids()) }; }; } diff --git a/rust/kernel/kunit.rs b/rust/kernel/kunit.rs index 1604fb6a5b1b..81833a687b75 100644 --- a/rust/kernel/kunit.rs +++ b/rust/kernel/kunit.rs @@ -59,7 +59,7 @@ macro_rules! kunit_assert { } static FILE: &'static $crate::str::CStr = $crate::c_str!($file); - static LINE: i32 = core::line!() as i32 - $diff; + static LINE: i32 = ::core::line!() as i32 - $diff; static CONDITION: &'static $crate::str::CStr = $crate::c_str!(stringify!($condition)); // SAFETY: FFI call without safety requirements. @@ -130,11 +130,11 @@ unsafe impl Sync for UnaryAssert {} unsafe { $crate::bindings::__kunit_do_failed_assertion( kunit_test, - core::ptr::addr_of!(LOCATION.0), + ::core::ptr::addr_of!(LOCATION.0), $crate::bindings::kunit_assert_type_KUNIT_ASSERTION, - core::ptr::addr_of!(ASSERTION.0.assert), + ::core::ptr::addr_of!(ASSERTION.0.assert), Some($crate::bindings::kunit_unary_assert_format), - core::ptr::null(), + ::core::ptr::null(), ); } diff --git a/rust/kernel/static_assert.rs b/rust/kernel/static_assert.rs index d8120f838260..5e5a0bee9888 100644 --- a/rust/kernel/static_assert.rs +++ b/rust/kernel/static_assert.rs @@ -20,7 +20,7 @@ /// /// ``` /// static_assert!(42 > 24); -/// static_assert!(core::mem::size_of::<u8>() == 1); +/// static_assert!(::core::mem::size_of::<u8>() == 1); /// /// const X: &[u8] = b"bar"; /// static_assert!(X[1] == b'a'); @@ -34,6 +34,6 @@ #[macro_export] macro_rules! static_assert { ($condition:expr $(,$arg:literal)?) => { - const _: () = core::assert!($condition $(,$arg)?); + const _: () = ::core::assert!($condition $(,$arg)?); }; } diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs index fb61ce81ea28..fbdcbbba9c3f 100644 --- a/rust/kernel/str.rs +++ b/rust/kernel/str.rs @@ -595,7 +595,7 @@ fn deref(&self) -> &str { macro_rules! format { ($($f:tt)*) => ({ - &*String::from_fmt(kernel::fmt!($($f)*)) + &*String::from_fmt(::kernel::fmt!($($f)*)) }) } @@ -944,5 +944,5 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { /// A convenience alias for [`core::format_args`]. #[macro_export] macro_rules! fmt { - ($($f:tt)*) => ( core::format_args!($($f)*) ) + ($($f:tt)*) => ( ::core::format_args!($($f)*) ) } diff --git a/rust/macros/kunit.rs b/rust/macros/kunit.rs index 99ccac82edde..b146c5894e92 100644 --- a/rust/macros/kunit.rs +++ b/rust/macros/kunit.rs @@ -85,28 +85,28 @@ pub(crate) fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream { // Looks like: // // ``` - // unsafe extern "C" fn kunit_rust_wrapper_foo(_test: *mut kernel::bindings::kunit) { foo(); } - // unsafe extern "C" fn kunit_rust_wrapper_bar(_test: *mut kernel::bindings::kunit) { bar(); } + // unsafe extern "C" fn kunit_rust_wrapper_foo(_test: *mut ::kernel::bindings::kunit) { foo(); } + // unsafe extern "C" fn kunit_rust_wrapper_bar(_test: *mut ::kernel::bindings::kunit) { bar(); } // - // static mut TEST_CASES: [kernel::bindings::kunit_case; 3] = [ - // kernel::kunit::kunit_case(kernel::c_str!("foo"), kunit_rust_wrapper_foo), - // kernel::kunit::kunit_case(kernel::c_str!("bar"), kunit_rust_wrapper_bar), - // kernel::kunit::kunit_case_null(), + // static mut TEST_CASES: [::kernel::bindings::kunit_case; 3] = [ + // ::kernel::kunit::kunit_case(::kernel::c_str!("foo"), kunit_rust_wrapper_foo), + // ::kernel::kunit::kunit_case(::kernel::c_str!("bar"), kunit_rust_wrapper_bar), + // ::kernel::kunit::kunit_case_null(), // ]; // - // kernel::kunit_unsafe_test_suite!(kunit_test_suit_name, TEST_CASES); + // ::kernel::kunit_unsafe_test_suite!(kunit_test_suit_name, TEST_CASES); // ``` let mut kunit_macros = "".to_owned(); let mut test_cases = "".to_owned(); for test in &tests { let kunit_wrapper_fn_name = format!("kunit_rust_wrapper_{test}"); let kunit_wrapper = format!( - "unsafe extern \"C\" fn {kunit_wrapper_fn_name}(_test: *mut kernel::bindings::kunit) {{ {test}(); }}" + "unsafe extern \"C\" fn {kunit_wrapper_fn_name}(_test: *mut ::kernel::bindings::kunit) {{ {test}(); }}" ); writeln!(kunit_macros, "{kunit_wrapper}").unwrap(); writeln!( test_cases, - " kernel::kunit::kunit_case(kernel::c_str!(\"{test}\"), {kunit_wrapper_fn_name})," + " ::kernel::kunit::kunit_case(::kernel::c_str!(\"{test}\"), {kunit_wrapper_fn_name})," ) .unwrap(); } @@ -114,14 +114,14 @@ pub(crate) fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream { writeln!(kunit_macros).unwrap(); writeln!( kunit_macros, - "static mut TEST_CASES: [kernel::bindings::kunit_case; {}] = [\n{test_cases} kernel::kunit::kunit_case_null(),\n];", + "static mut TEST_CASES: [::kernel::bindings::kunit_case; {}] = [\n{test_cases} ::kernel::kunit::kunit_case_null(),\n];", tests.len() + 1 ) .unwrap(); writeln!( kunit_macros, - "kernel::kunit_unsafe_test_suite!({attr}, TEST_CASES);" + "::kernel::kunit_unsafe_test_suite!({attr}, TEST_CASES);" ) .unwrap(); diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs index 9acaa68c974e..cb429eceff71 100644 --- a/rust/macros/lib.rs +++ b/rust/macros/lib.rs @@ -283,7 +283,7 @@ pub fn concat_idents(ts: TokenStream) -> TokenStream { /// # const binder_driver_return_protocol_BR_FAILED_REPLY: u32 = 14; /// macro_rules! pub_no_prefix { /// ($prefix:ident, $($newname:ident),+) => { -/// kernel::macros::paste! { +/// ::kernel::macros::paste! { /// $(pub(crate) const $newname: u32 = [<$prefix $newname>];)+ /// } /// }; @@ -340,7 +340,7 @@ pub fn concat_idents(ts: TokenStream) -> TokenStream { /// # const binder_driver_return_protocol_BR_FAILED_REPLY: u32 = 14; /// macro_rules! pub_no_prefix { /// ($prefix:ident, $($newname:ident),+) => { -/// kernel::macros::paste! { +/// ::kernel::macros::paste! { /// $(pub(crate) const fn [<$newname:lower:span>]() -> u32 { [<$prefix $newname:span>] })+ /// } /// }; @@ -375,7 +375,7 @@ pub fn concat_idents(ts: TokenStream) -> TokenStream { /// ``` /// macro_rules! create_numbered_fn { /// ($name:literal, $val:literal) => { -/// kernel::macros::paste! { +/// ::kernel::macros::paste! { /// fn [<some_ $name _fn $val>]() -> u32 { $val } /// } /// }; diff --git a/rust/macros/module.rs b/rust/macros/module.rs index 2f66107847f7..721454a5dbe7 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -215,24 +215,24 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream { // SAFETY: `__this_module` is constructed by the kernel at load time and will not be // freed until the module is unloaded. #[cfg(MODULE)] - static THIS_MODULE: kernel::ThisModule = unsafe {{ + static THIS_MODULE: ::kernel::ThisModule = unsafe {{ extern \"C\" {{ - static __this_module: kernel::types::Opaque<kernel::bindings::module>; + static __this_module: ::kernel::types::Opaque<::kernel::bindings::module>; }} - kernel::ThisModule::from_ptr(__this_module.get()) + ::kernel::ThisModule::from_ptr(__this_module.get()) }}; #[cfg(not(MODULE))] - static THIS_MODULE: kernel::ThisModule = unsafe {{ - kernel::ThisModule::from_ptr(core::ptr::null_mut()) + static THIS_MODULE: ::kernel::ThisModule = unsafe {{ + ::kernel::ThisModule::from_ptr(::core::ptr::null_mut()) }}; /// The `LocalModule` type is the type of the module created by `module!`, /// `module_pci_driver!`, `module_platform_driver!`, etc. type LocalModule = {type_}; - impl kernel::ModuleMetadata for {type_} {{ - const NAME: &'static kernel::str::CStr = kernel::c_str!(\"{name}\"); + impl ::kernel::ModuleMetadata for {type_} {{ + const NAME: &'static ::kernel::str::CStr = ::kernel::c_str!(\"{name}\"); }} // Double nested modules, since then nobody can access the public items inside. @@ -250,8 +250,8 @@ mod __module_init {{ #[used] static __IS_RUST_MODULE: () = (); - static mut __MOD: core::mem::MaybeUninit<{type_}> = - core::mem::MaybeUninit::uninit(); + static mut __MOD: ::core::mem::MaybeUninit<{type_}> = + ::core::mem::MaybeUninit::uninit(); // Loadable modules need to export the `{{init,cleanup}}_module` identifiers. /// # Safety @@ -262,7 +262,7 @@ mod __module_init {{ #[doc(hidden)] #[no_mangle] #[link_section = \".init.text\"] - pub unsafe extern \"C\" fn init_module() -> kernel::ffi::c_int {{ + pub unsafe extern \"C\" fn init_module() -> ::kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // unique name. @@ -301,11 +301,12 @@ mod __module_init {{ #[doc(hidden)] #[link_section = \"{initcall_section}\"] #[used] - pub static __{name}_initcall: extern \"C\" fn() -> kernel::ffi::c_int = __{name}_init; + pub static __{name}_initcall: extern \"C\" fn() -> ::kernel::ffi::c_int = + __{name}_init; #[cfg(not(MODULE))] #[cfg(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)] - core::arch::global_asm!( + ::core::arch::global_asm!( r#\".section \"{initcall_section}\", \"a\" __{name}_initcall: .long __{name}_init - . @@ -316,7 +317,7 @@ mod __module_init {{ #[cfg(not(MODULE))] #[doc(hidden)] #[no_mangle] - pub extern \"C\" fn __{name}_init() -> kernel::ffi::c_int {{ + pub extern \"C\" fn __{name}_init() -> ::kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // placement above in the initcall section. @@ -339,9 +340,9 @@ mod __module_init {{ /// # Safety /// /// This function must only be called once. - unsafe fn __init() -> kernel::ffi::c_int {{ + unsafe fn __init() -> ::kernel::ffi::c_int {{ let initer = - <{type_} as kernel::InPlaceModule>::init(&super::super::THIS_MODULE); + <{type_} as ::kernel::InPlaceModule>::init(&super::super::THIS_MODULE); // SAFETY: No data race, since `__MOD` can only be accessed by this module // and there only `__init` and `__exit` access it. These functions are only // called once and `__exit` cannot be called before or during `__init`. diff --git a/scripts/rustdoc_test_builder.rs b/scripts/rustdoc_test_builder.rs index e5894652f12c..81233fb56b66 100644 --- a/scripts/rustdoc_test_builder.rs +++ b/scripts/rustdoc_test_builder.rs @@ -28,7 +28,7 @@ fn main() { // // ``` // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_28_0() { - // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_37_0() -> Result<(), impl core::fmt::Debug> { + // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_37_0() -> Result<(), impl ::core::fmt::Debug> { // ``` // // It should be unlikely that doctest code matches such lines (when code is formatted properly). @@ -49,8 +49,8 @@ fn main() { // Qualify `Result` to avoid the collision with our own `Result` coming from the prelude. let body = body.replace( - &format!("{rustdoc_function_name}() -> Result<(), impl core::fmt::Debug> {{"), - &format!("{rustdoc_function_name}() -> core::result::Result<(), impl core::fmt::Debug> {{"), + &format!("{rustdoc_function_name}() -> Result<(), impl ::core::fmt::Debug> {{"), + &format!("{rustdoc_function_name}() -> ::core::result::Result<(), impl ::core::fmt::Debug> {{"), ); // For tests that get generated with `Result`, like above, `rustdoc` generates an `unwrap()` on diff --git a/scripts/rustdoc_test_gen.rs b/scripts/rustdoc_test_gen.rs index ec8d70ac888b..1ca253594d38 100644 --- a/scripts/rustdoc_test_gen.rs +++ b/scripts/rustdoc_test_gen.rs @@ -167,12 +167,14 @@ fn main() { rust_tests, r#"/// Generated `{name}` KUnit test case from a Rust documentation test. #[no_mangle] -pub extern "C" fn {kunit_name}(__kunit_test: *mut kernel::bindings::kunit) {{ +pub extern "C" fn {kunit_name}(__kunit_test: *mut ::kernel::bindings::kunit) {{ /// Overrides the usual [`assert!`] macro with one that calls KUnit instead. #[allow(unused)] macro_rules! assert {{ ($cond:expr $(,)?) => {{{{ - kernel::kunit_assert!("{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $cond); + ::kernel::kunit_assert!( + "{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $cond + ); }}}} }} @@ -180,13 +182,15 @@ macro_rules! assert {{ #[allow(unused)] macro_rules! assert_eq {{ ($left:expr, $right:expr $(,)?) => {{{{ - kernel::kunit_assert_eq!("{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $left, $right); + ::kernel::kunit_assert_eq!( + "{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $left, $right + ); }}}} }} // Many tests need the prelude, so provide it by default. #[allow(unused)] - use kernel::prelude::*; + use ::kernel::prelude::*; // Unconditionally print the location of the original doctest (i.e. rather than the location in // the generated file) so that developers can easily map the test back to the source code. @@ -197,11 +201,11 @@ macro_rules! assert_eq {{ // This follows the syntax for declaring test metadata in the proposed KTAP v2 spec, which may // be used for the proposed KUnit test attributes API. Thus hopefully this will make migration // easier later on. - kernel::kunit::info(format_args!(" # {kunit_name}.location: {real_path}:{line}\n")); + ::kernel::kunit::info(format_args!(" # {kunit_name}.location: {real_path}:{line}\n")); /// The anchor where the test code body starts. #[allow(unused)] - static __DOCTEST_ANCHOR: i32 = core::line!() as i32 + {body_offset} + 1; + static __DOCTEST_ANCHOR: i32 = ::core::line!() as i32 + {body_offset} + 1; {{ {body} main(); -- 2.43.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-16 12:23 ` [PATCH v4] rust: macros: Fix macro referencing core and kernel crates Igor Korotin @ 2025-05-17 21:36 ` kernel test robot 2025-05-18 7:33 ` Benno Lossin ` (2 subsequent siblings) 3 siblings, 0 replies; 14+ messages in thread From: kernel test robot @ 2025-05-17 21:36 UTC (permalink / raw) To: Igor Korotin, Miguel Ojeda, Alex Gaynor Cc: oe-kbuild-all, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux, Igor Korotin Hi Igor, kernel test robot noticed the following build errors: [auto build test ERROR on rust/rust-next] [cannot apply to shuah-kselftest/kunit shuah-kselftest/kunit-fixes linus/master v6.15-rc6 next-20250516] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Igor-Korotin/rust-macros-Fix-macro-referencing-core-and-kernel-crates/20250516-203554 base: https://github.com/Rust-for-Linux/linux rust-next patch link: https://lore.kernel.org/r/20250516122349.1944895-1-igor.korotin%40yahoo.com patch subject: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20250518/202505180525.LRAJXV9j-lkp@intel.com/config) compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff) rustc: rustc 1.78.0 (9b00956e5 2024-04-29) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250518/202505180525.LRAJXV9j-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202505180525.LRAJXV9j-lkp@intel.com/ All errors (new ones prefixed by >>): PATH=/opt/cross/clang-18/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin INFO PATH=/opt/cross/rustc-1.78.0-bindgen-0.65.1/cargo/bin:/opt/cross/clang-18/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /usr/bin/timeout -k 100 12h /usr/bin/make KCFLAGS= -Wno-error=return-type -Wreturn-type -funsigned-char -Wundef W=1 --keep-going LLVM=1 -j32 -C source O=/kbuild/obj/consumer/x86_64-rhel-9.4-rust ARCH=x86_64 SHELL=/bin/bash rustfmtcheck make: Entering directory '/kbuild/src/consumer' make[1]: Entering directory '/kbuild/obj/consumer/x86_64-rhel-9.4-rust' >> Diff in scripts/rustdoc_test_builder.rs at line 50: // Qualify `Result` to avoid the collision with our own `Result` coming from the prelude. let body = body.replace( &format!("{rustdoc_function_name}() -> Result<(), impl ::core::fmt::Debug> {{"), - &format!("{rustdoc_function_name}() -> ::core::result::Result<(), impl ::core::fmt::Debug> {{"), + &format!( + "{rustdoc_function_name}() -> ::core::result::Result<(), impl ::core::fmt::Debug> {{" + ), ); // For tests that get generated with `Result`, like above, `rustdoc` generates an `unwrap()` on make[2]: *** [Makefile:1826: rustfmt] Error 123 make[2]: Target 'rustfmtcheck' not remade because of errors. make[1]: Leaving directory '/kbuild/obj/consumer/x86_64-rhel-9.4-rust' make: *** [Makefile:248: __sub-make] Error 2 make: Target 'rustfmtcheck' not remade because of errors. make[1]: *** [Makefile:248: __sub-make] Error 2 make[1]: Target 'rustfmtcheck' not remade because of errors. make: Leaving directory '/kbuild/src/consumer' -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-16 12:23 ` [PATCH v4] rust: macros: Fix macro referencing core and kernel crates Igor Korotin 2025-05-17 21:36 ` kernel test robot @ 2025-05-18 7:33 ` Benno Lossin 2025-05-19 14:20 ` Miguel Ojeda 2025-05-19 16:45 ` [PATCH v5] " igor.korotin.linux 3 siblings, 0 replies; 14+ messages in thread From: Benno Lossin @ 2025-05-18 7:33 UTC (permalink / raw) To: Igor Korotin, Miguel Ojeda, Alex Gaynor Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux On Fri May 16, 2025 at 2:23 PM CEST, Igor Korotin wrote: > Fix macros and auto-generated code to use absolute paths, `::core::...` > and `::kernel::...`, for core and kernel references. This prevents issues > where user-defined modules named `core` or `kernel` could be picked up > instead of the `core` or `kernel` crates. > > Suggested-by: Benno Lossin <benno.lossin@proton.me> > Closes: https://github.com/Rust-for-Linux/linux/issues/1150 > Signed-off-by: Igor Korotin <igor.korotin@yahoo.com> > --- > > Changes since v3: > - rebased changes on top of the branch rust-next > - added one fix in auto-generated code in file rust/macros/module.rs > - link to v3: https://lore.kernel.org/rust-for-linux/20250331102451.2362415-1-igor.korotin@yahoo.com/ > Changes since v2: > - rewrote commit message > - link to v2: https://lore.kernel.org/lkml/20250328180312.2025317-2-igor.korotin@yahoo.com/ > Changes since v1: > - rewrote commit message > - Added fixes in auto-generated code in files rust/macros/kunit.rs, > rust/macros/module.rs, scripts/rustdoc_test_builder.rs, > scripts/rustdoc_test_gen.rs thanks to Benno > - link to v1: https://lore.kernel.org/lkml/20250326182302.5650-1-igor.korotin@yahoo.com/ > > rust/ffi.rs | 2 +- > rust/kernel/device.rs | 2 +- > rust/kernel/device_id.rs | 4 ++-- > rust/kernel/kunit.rs | 8 ++++---- > rust/kernel/static_assert.rs | 4 ++-- > rust/kernel/str.rs | 4 ++-- > rust/macros/kunit.rs | 22 +++++++++++----------- > rust/macros/lib.rs | 6 +++--- > rust/macros/module.rs | 31 ++++++++++++++++--------------- > scripts/rustdoc_test_builder.rs | 6 +++--- > scripts/rustdoc_test_gen.rs | 16 ++++++++++------ > 11 files changed, 55 insertions(+), 50 deletions(-) The changes look good, there is one rustfmt issue the bot detected, but Miguel can take care of that when picking the patch, so no need to send a new version just for that. I tried to find any instances that you might have overlooked, but couldn't find any :) I didn't write a script to find them all though, so I might also have missed some. Would be great if someone else also could try to find any missing ones. Reviewed-by: Benno Lossin <lossin@kernel.org> --- Cheers, Benno ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-16 12:23 ` [PATCH v4] rust: macros: Fix macro referencing core and kernel crates Igor Korotin 2025-05-17 21:36 ` kernel test robot 2025-05-18 7:33 ` Benno Lossin @ 2025-05-19 14:20 ` Miguel Ojeda 2025-05-19 14:33 ` Benno Lossin 2025-05-19 16:09 ` Igor Korotin 2025-05-19 16:45 ` [PATCH v5] " igor.korotin.linux 3 siblings, 2 replies; 14+ messages in thread From: Miguel Ojeda @ 2025-05-19 14:20 UTC (permalink / raw) To: Igor Korotin Cc: Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux On Fri, May 16, 2025 at 2:35 PM Igor Korotin <igor.korotin@yahoo.com> wrote: > > diff --git a/rust/kernel/static_assert.rs b/rust/kernel/static_assert.rs > index d8120f838260..5e5a0bee9888 100644 > --- a/rust/kernel/static_assert.rs > +++ b/rust/kernel/static_assert.rs > @@ -20,7 +20,7 @@ > /// > /// ``` > /// static_assert!(42 > 24); > -/// static_assert!(core::mem::size_of::<u8>() == 1); > +/// static_assert!(::core::mem::size_of::<u8>() == 1); Hmm... Why are we changing this one? Thanks! Cheers, Miguel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 14:20 ` Miguel Ojeda @ 2025-05-19 14:33 ` Benno Lossin 2025-05-19 16:09 ` Igor Korotin 1 sibling, 0 replies; 14+ messages in thread From: Benno Lossin @ 2025-05-19 14:33 UTC (permalink / raw) To: Miguel Ojeda, Igor Korotin Cc: Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux On Mon May 19, 2025 at 4:20 PM CEST, Miguel Ojeda wrote: > On Fri, May 16, 2025 at 2:35 PM Igor Korotin <igor.korotin@yahoo.com> wrote: >> >> diff --git a/rust/kernel/static_assert.rs b/rust/kernel/static_assert.rs >> index d8120f838260..5e5a0bee9888 100644 >> --- a/rust/kernel/static_assert.rs >> +++ b/rust/kernel/static_assert.rs >> @@ -20,7 +20,7 @@ >> /// >> /// ``` >> /// static_assert!(42 > 24); >> -/// static_assert!(core::mem::size_of::<u8>() == 1); >> +/// static_assert!(::core::mem::size_of::<u8>() == 1); > > Hmm... Why are we changing this one? Yeah this one doesn't seem necessary. --- Cheers, Benno ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 14:20 ` Miguel Ojeda 2025-05-19 14:33 ` Benno Lossin @ 2025-05-19 16:09 ` Igor Korotin 2025-05-19 16:49 ` Miguel Ojeda 1 sibling, 1 reply; 14+ messages in thread From: Igor Korotin @ 2025-05-19 16:09 UTC (permalink / raw) To: Miguel Ojeda Cc: Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux, Benno Lossin On 5/19/25 15:20, Miguel Ojeda wrote: > On Fri, May 16, 2025 at 2:35 PM Igor Korotin <igor.korotin@yahoo.com> wrote: >> >> diff --git a/rust/kernel/static_assert.rs b/rust/kernel/static_assert.rs >> index d8120f838260..5e5a0bee9888 100644 >> --- a/rust/kernel/static_assert.rs >> +++ b/rust/kernel/static_assert.rs >> @@ -20,7 +20,7 @@ >> /// >> /// ``` >> /// static_assert!(42 > 24); >> -/// static_assert!(core::mem::size_of::<u8>() == 1); >> +/// static_assert!(::core::mem::size_of::<u8>() == 1); > > Hmm... Why are we changing this one? > > Thanks! > > Cheers, > Miguel This is a mistake. I'll drop this change in v5. Thanks for the review. I didn't receive Benno's reply in my mailbox for some reason, but I saw it on lore.kernel.org. Thanks to him as well for pointing it out. Best Regards Igor ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 16:09 ` Igor Korotin @ 2025-05-19 16:49 ` Miguel Ojeda 2025-05-20 8:37 ` Igor Korotin 0 siblings, 1 reply; 14+ messages in thread From: Miguel Ojeda @ 2025-05-19 16:49 UTC (permalink / raw) To: Igor Korotin Cc: Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux, Benno Lossin On Mon, May 19, 2025 at 6:09 PM Igor Korotin <igor.korotin@yahoo.com> wrote: > > This is a mistake. I'll drop this change in v5. Thanks for the review. You're welcome! If you want, I can remove that change when I apply it instead. By the way, I would probably avoid the "fix" verb in the subject, since this seems more like an improvement, and instead use something like "clean" -- if we consider something a fix, then it should have a Fixes: tag pointing to the code it actually fixes etc., which in turn typically requires splitting the commit into several, adding Cc: stable, etc. Thanks! Cheers, Miguel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 16:49 ` Miguel Ojeda @ 2025-05-20 8:37 ` Igor Korotin 0 siblings, 0 replies; 14+ messages in thread From: Igor Korotin @ 2025-05-20 8:37 UTC (permalink / raw) To: Miguel Ojeda Cc: Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux, Benno Lossin On 5/19/25 17:49, Miguel Ojeda wrote: > By the way, I would probably avoid the "fix" verb in the subject, > since this seems more like an improvement, and instead use something > like "clean" -- if we consider something a fix, then it should have a > Fixes: tag pointing to the code it actually fixes etc., which in turn > typically requires splitting the commit into several, adding Cc: > stable, etc. Thanks for the clarification. I'm happy to change the subject line to avoid "fix" and send a v6 if necessary — just let me know. Thanks Igor ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5] rust: macros: Fix macro referencing core and kernel crates 2025-05-16 12:23 ` [PATCH v4] rust: macros: Fix macro referencing core and kernel crates Igor Korotin ` (2 preceding siblings ...) 2025-05-19 14:20 ` Miguel Ojeda @ 2025-05-19 16:45 ` igor.korotin.linux 2025-05-19 17:10 ` Miguel Ojeda ` (2 more replies) 3 siblings, 3 replies; 14+ messages in thread From: igor.korotin.linux @ 2025-05-19 16:45 UTC (permalink / raw) To: Miguel Ojeda, Alex Gaynor Cc: Benno Lossin, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux, Igor Korotin From: Igor Korotin <igor.korotin.linux@gmail.com> Fix macros and auto-generated code to use absolute paths, `::core::...` and `::kernel::...`, for core and kernel references. This prevents issues where user-defined modules named `core` or `kernel` could be picked up instead of the `core` or `kernel` crates. Suggested-by: Benno Lossin <benno.lossin@proton.me> Closes: https://github.com/Rust-for-Linux/linux/issues/1150 Signed-off-by: Igor Korotin <igor.korotin.linux@gmail.com> --- Changes since v4: - dropped unrelated change in rust/kernel/static_assert.rs - link to v4: https://lore.kernel.org/rust-for-linux/20250516122349.1944895-1-igor.korotin@yahoo.com/ Changes since v3: - rebased changes on top of the branch rust-next - added one fix in auto-generated code in file rust/macros/module.rs - link to v3: https://lore.kernel.org/rust-for-linux/20250331102451.2362415-1-igor.korotin@yahoo.com/ Changes since v2: - rewrote commit message - link to v2: https://lore.kernel.org/lkml/20250328180312.2025317-2-igor.korotin@yahoo.com/ Changes since v1: - rewrote commit message - Added fixes in auto-generated code in files rust/macros/kunit.rs, rust/macros/module.rs, scripts/rustdoc_test_builder.rs, scripts/rustdoc_test_gen.rs thanks to Benno - link to v1: https://lore.kernel.org/lkml/20250326182302.5650-1-igor.korotin@yahoo.com/ rust/ffi.rs | 2 +- rust/kernel/device.rs | 2 +- rust/kernel/device_id.rs | 4 ++-- rust/kernel/kunit.rs | 8 ++++---- rust/kernel/static_assert.rs | 2 +- rust/kernel/str.rs | 4 ++-- rust/macros/kunit.rs | 22 +++++++++++----------- rust/macros/lib.rs | 6 +++--- rust/macros/module.rs | 31 ++++++++++++++++--------------- scripts/rustdoc_test_builder.rs | 6 +++--- scripts/rustdoc_test_gen.rs | 16 ++++++++++------ 11 files changed, 54 insertions(+), 49 deletions(-) diff --git a/rust/ffi.rs b/rust/ffi.rs index 584f75b49862..d60aad792af4 100644 --- a/rust/ffi.rs +++ b/rust/ffi.rs @@ -17,7 +17,7 @@ macro_rules! alias { // Check size compatibility with `core`. const _: () = assert!( - core::mem::size_of::<$name>() == core::mem::size_of::<core::ffi::$name>() + ::core::mem::size_of::<$name>() == ::core::mem::size_of::<::core::ffi::$name>() ); )*} } diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs index 5c372cf27ed0..539888465cc6 100644 --- a/rust/kernel/device.rs +++ b/rust/kernel/device.rs @@ -240,7 +240,7 @@ impl DeviceContext for Normal {} macro_rules! dev_printk { ($method:ident, $dev:expr, $($f:tt)*) => { { - ($dev).$method(core::format_args!($($f)*)); + ($dev).$method(::core::format_args!($($f)*)); } } } diff --git a/rust/kernel/device_id.rs b/rust/kernel/device_id.rs index e5859217a579..0a4eb56d98f2 100644 --- a/rust/kernel/device_id.rs +++ b/rust/kernel/device_id.rs @@ -159,7 +159,7 @@ macro_rules! module_device_table { "_", line!(), "_", stringify!($table_name)) ] - static $module_table_name: [core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] = - unsafe { core::mem::transmute_copy($table_name.raw_ids()) }; + static $module_table_name: [::core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] = + unsafe { ::core::mem::transmute_copy($table_name.raw_ids()) }; }; } diff --git a/rust/kernel/kunit.rs b/rust/kernel/kunit.rs index 1604fb6a5b1b..81833a687b75 100644 --- a/rust/kernel/kunit.rs +++ b/rust/kernel/kunit.rs @@ -59,7 +59,7 @@ macro_rules! kunit_assert { } static FILE: &'static $crate::str::CStr = $crate::c_str!($file); - static LINE: i32 = core::line!() as i32 - $diff; + static LINE: i32 = ::core::line!() as i32 - $diff; static CONDITION: &'static $crate::str::CStr = $crate::c_str!(stringify!($condition)); // SAFETY: FFI call without safety requirements. @@ -130,11 +130,11 @@ unsafe impl Sync for UnaryAssert {} unsafe { $crate::bindings::__kunit_do_failed_assertion( kunit_test, - core::ptr::addr_of!(LOCATION.0), + ::core::ptr::addr_of!(LOCATION.0), $crate::bindings::kunit_assert_type_KUNIT_ASSERTION, - core::ptr::addr_of!(ASSERTION.0.assert), + ::core::ptr::addr_of!(ASSERTION.0.assert), Some($crate::bindings::kunit_unary_assert_format), - core::ptr::null(), + ::core::ptr::null(), ); } diff --git a/rust/kernel/static_assert.rs b/rust/kernel/static_assert.rs index d8120f838260..a57ba14315a0 100644 --- a/rust/kernel/static_assert.rs +++ b/rust/kernel/static_assert.rs @@ -34,6 +34,6 @@ #[macro_export] macro_rules! static_assert { ($condition:expr $(,$arg:literal)?) => { - const _: () = core::assert!($condition $(,$arg)?); + const _: () = ::core::assert!($condition $(,$arg)?); }; } diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs index 8768ab790580..61e6d3331b9c 100644 --- a/rust/kernel/str.rs +++ b/rust/kernel/str.rs @@ -595,7 +595,7 @@ fn deref(&self) -> &str { macro_rules! format { ($($f:tt)*) => ({ - &*String::from_fmt(kernel::fmt!($($f)*)) + &*String::from_fmt(::kernel::fmt!($($f)*)) }) } @@ -944,5 +944,5 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { /// A convenience alias for [`core::format_args`]. #[macro_export] macro_rules! fmt { - ($($f:tt)*) => ( core::format_args!($($f)*) ) + ($($f:tt)*) => ( ::core::format_args!($($f)*) ) } diff --git a/rust/macros/kunit.rs b/rust/macros/kunit.rs index 99ccac82edde..b146c5894e92 100644 --- a/rust/macros/kunit.rs +++ b/rust/macros/kunit.rs @@ -85,28 +85,28 @@ pub(crate) fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream { // Looks like: // // ``` - // unsafe extern "C" fn kunit_rust_wrapper_foo(_test: *mut kernel::bindings::kunit) { foo(); } - // unsafe extern "C" fn kunit_rust_wrapper_bar(_test: *mut kernel::bindings::kunit) { bar(); } + // unsafe extern "C" fn kunit_rust_wrapper_foo(_test: *mut ::kernel::bindings::kunit) { foo(); } + // unsafe extern "C" fn kunit_rust_wrapper_bar(_test: *mut ::kernel::bindings::kunit) { bar(); } // - // static mut TEST_CASES: [kernel::bindings::kunit_case; 3] = [ - // kernel::kunit::kunit_case(kernel::c_str!("foo"), kunit_rust_wrapper_foo), - // kernel::kunit::kunit_case(kernel::c_str!("bar"), kunit_rust_wrapper_bar), - // kernel::kunit::kunit_case_null(), + // static mut TEST_CASES: [::kernel::bindings::kunit_case; 3] = [ + // ::kernel::kunit::kunit_case(::kernel::c_str!("foo"), kunit_rust_wrapper_foo), + // ::kernel::kunit::kunit_case(::kernel::c_str!("bar"), kunit_rust_wrapper_bar), + // ::kernel::kunit::kunit_case_null(), // ]; // - // kernel::kunit_unsafe_test_suite!(kunit_test_suit_name, TEST_CASES); + // ::kernel::kunit_unsafe_test_suite!(kunit_test_suit_name, TEST_CASES); // ``` let mut kunit_macros = "".to_owned(); let mut test_cases = "".to_owned(); for test in &tests { let kunit_wrapper_fn_name = format!("kunit_rust_wrapper_{test}"); let kunit_wrapper = format!( - "unsafe extern \"C\" fn {kunit_wrapper_fn_name}(_test: *mut kernel::bindings::kunit) {{ {test}(); }}" + "unsafe extern \"C\" fn {kunit_wrapper_fn_name}(_test: *mut ::kernel::bindings::kunit) {{ {test}(); }}" ); writeln!(kunit_macros, "{kunit_wrapper}").unwrap(); writeln!( test_cases, - " kernel::kunit::kunit_case(kernel::c_str!(\"{test}\"), {kunit_wrapper_fn_name})," + " ::kernel::kunit::kunit_case(::kernel::c_str!(\"{test}\"), {kunit_wrapper_fn_name})," ) .unwrap(); } @@ -114,14 +114,14 @@ pub(crate) fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream { writeln!(kunit_macros).unwrap(); writeln!( kunit_macros, - "static mut TEST_CASES: [kernel::bindings::kunit_case; {}] = [\n{test_cases} kernel::kunit::kunit_case_null(),\n];", + "static mut TEST_CASES: [::kernel::bindings::kunit_case; {}] = [\n{test_cases} ::kernel::kunit::kunit_case_null(),\n];", tests.len() + 1 ) .unwrap(); writeln!( kunit_macros, - "kernel::kunit_unsafe_test_suite!({attr}, TEST_CASES);" + "::kernel::kunit_unsafe_test_suite!({attr}, TEST_CASES);" ) .unwrap(); diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs index 9acaa68c974e..cb429eceff71 100644 --- a/rust/macros/lib.rs +++ b/rust/macros/lib.rs @@ -283,7 +283,7 @@ pub fn concat_idents(ts: TokenStream) -> TokenStream { /// # const binder_driver_return_protocol_BR_FAILED_REPLY: u32 = 14; /// macro_rules! pub_no_prefix { /// ($prefix:ident, $($newname:ident),+) => { -/// kernel::macros::paste! { +/// ::kernel::macros::paste! { /// $(pub(crate) const $newname: u32 = [<$prefix $newname>];)+ /// } /// }; @@ -340,7 +340,7 @@ pub fn concat_idents(ts: TokenStream) -> TokenStream { /// # const binder_driver_return_protocol_BR_FAILED_REPLY: u32 = 14; /// macro_rules! pub_no_prefix { /// ($prefix:ident, $($newname:ident),+) => { -/// kernel::macros::paste! { +/// ::kernel::macros::paste! { /// $(pub(crate) const fn [<$newname:lower:span>]() -> u32 { [<$prefix $newname:span>] })+ /// } /// }; @@ -375,7 +375,7 @@ pub fn concat_idents(ts: TokenStream) -> TokenStream { /// ``` /// macro_rules! create_numbered_fn { /// ($name:literal, $val:literal) => { -/// kernel::macros::paste! { +/// ::kernel::macros::paste! { /// fn [<some_ $name _fn $val>]() -> u32 { $val } /// } /// }; diff --git a/rust/macros/module.rs b/rust/macros/module.rs index 2f66107847f7..721454a5dbe7 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -215,24 +215,24 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream { // SAFETY: `__this_module` is constructed by the kernel at load time and will not be // freed until the module is unloaded. #[cfg(MODULE)] - static THIS_MODULE: kernel::ThisModule = unsafe {{ + static THIS_MODULE: ::kernel::ThisModule = unsafe {{ extern \"C\" {{ - static __this_module: kernel::types::Opaque<kernel::bindings::module>; + static __this_module: ::kernel::types::Opaque<::kernel::bindings::module>; }} - kernel::ThisModule::from_ptr(__this_module.get()) + ::kernel::ThisModule::from_ptr(__this_module.get()) }}; #[cfg(not(MODULE))] - static THIS_MODULE: kernel::ThisModule = unsafe {{ - kernel::ThisModule::from_ptr(core::ptr::null_mut()) + static THIS_MODULE: ::kernel::ThisModule = unsafe {{ + ::kernel::ThisModule::from_ptr(::core::ptr::null_mut()) }}; /// The `LocalModule` type is the type of the module created by `module!`, /// `module_pci_driver!`, `module_platform_driver!`, etc. type LocalModule = {type_}; - impl kernel::ModuleMetadata for {type_} {{ - const NAME: &'static kernel::str::CStr = kernel::c_str!(\"{name}\"); + impl ::kernel::ModuleMetadata for {type_} {{ + const NAME: &'static ::kernel::str::CStr = ::kernel::c_str!(\"{name}\"); }} // Double nested modules, since then nobody can access the public items inside. @@ -250,8 +250,8 @@ mod __module_init {{ #[used] static __IS_RUST_MODULE: () = (); - static mut __MOD: core::mem::MaybeUninit<{type_}> = - core::mem::MaybeUninit::uninit(); + static mut __MOD: ::core::mem::MaybeUninit<{type_}> = + ::core::mem::MaybeUninit::uninit(); // Loadable modules need to export the `{{init,cleanup}}_module` identifiers. /// # Safety @@ -262,7 +262,7 @@ mod __module_init {{ #[doc(hidden)] #[no_mangle] #[link_section = \".init.text\"] - pub unsafe extern \"C\" fn init_module() -> kernel::ffi::c_int {{ + pub unsafe extern \"C\" fn init_module() -> ::kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // unique name. @@ -301,11 +301,12 @@ mod __module_init {{ #[doc(hidden)] #[link_section = \"{initcall_section}\"] #[used] - pub static __{name}_initcall: extern \"C\" fn() -> kernel::ffi::c_int = __{name}_init; + pub static __{name}_initcall: extern \"C\" fn() -> ::kernel::ffi::c_int = + __{name}_init; #[cfg(not(MODULE))] #[cfg(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)] - core::arch::global_asm!( + ::core::arch::global_asm!( r#\".section \"{initcall_section}\", \"a\" __{name}_initcall: .long __{name}_init - . @@ -316,7 +317,7 @@ mod __module_init {{ #[cfg(not(MODULE))] #[doc(hidden)] #[no_mangle] - pub extern \"C\" fn __{name}_init() -> kernel::ffi::c_int {{ + pub extern \"C\" fn __{name}_init() -> ::kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // placement above in the initcall section. @@ -339,9 +340,9 @@ mod __module_init {{ /// # Safety /// /// This function must only be called once. - unsafe fn __init() -> kernel::ffi::c_int {{ + unsafe fn __init() -> ::kernel::ffi::c_int {{ let initer = - <{type_} as kernel::InPlaceModule>::init(&super::super::THIS_MODULE); + <{type_} as ::kernel::InPlaceModule>::init(&super::super::THIS_MODULE); // SAFETY: No data race, since `__MOD` can only be accessed by this module // and there only `__init` and `__exit` access it. These functions are only // called once and `__exit` cannot be called before or during `__init`. diff --git a/scripts/rustdoc_test_builder.rs b/scripts/rustdoc_test_builder.rs index e5894652f12c..81233fb56b66 100644 --- a/scripts/rustdoc_test_builder.rs +++ b/scripts/rustdoc_test_builder.rs @@ -28,7 +28,7 @@ fn main() { // // ``` // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_28_0() { - // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_37_0() -> Result<(), impl core::fmt::Debug> { + // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_37_0() -> Result<(), impl ::core::fmt::Debug> { // ``` // // It should be unlikely that doctest code matches such lines (when code is formatted properly). @@ -49,8 +49,8 @@ fn main() { // Qualify `Result` to avoid the collision with our own `Result` coming from the prelude. let body = body.replace( - &format!("{rustdoc_function_name}() -> Result<(), impl core::fmt::Debug> {{"), - &format!("{rustdoc_function_name}() -> core::result::Result<(), impl core::fmt::Debug> {{"), + &format!("{rustdoc_function_name}() -> Result<(), impl ::core::fmt::Debug> {{"), + &format!("{rustdoc_function_name}() -> ::core::result::Result<(), impl ::core::fmt::Debug> {{"), ); // For tests that get generated with `Result`, like above, `rustdoc` generates an `unwrap()` on diff --git a/scripts/rustdoc_test_gen.rs b/scripts/rustdoc_test_gen.rs index ec8d70ac888b..1ca253594d38 100644 --- a/scripts/rustdoc_test_gen.rs +++ b/scripts/rustdoc_test_gen.rs @@ -167,12 +167,14 @@ fn main() { rust_tests, r#"/// Generated `{name}` KUnit test case from a Rust documentation test. #[no_mangle] -pub extern "C" fn {kunit_name}(__kunit_test: *mut kernel::bindings::kunit) {{ +pub extern "C" fn {kunit_name}(__kunit_test: *mut ::kernel::bindings::kunit) {{ /// Overrides the usual [`assert!`] macro with one that calls KUnit instead. #[allow(unused)] macro_rules! assert {{ ($cond:expr $(,)?) => {{{{ - kernel::kunit_assert!("{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $cond); + ::kernel::kunit_assert!( + "{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $cond + ); }}}} }} @@ -180,13 +182,15 @@ macro_rules! assert {{ #[allow(unused)] macro_rules! assert_eq {{ ($left:expr, $right:expr $(,)?) => {{{{ - kernel::kunit_assert_eq!("{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $left, $right); + ::kernel::kunit_assert_eq!( + "{kunit_name}", "{real_path}", __DOCTEST_ANCHOR - {line}, $left, $right + ); }}}} }} // Many tests need the prelude, so provide it by default. #[allow(unused)] - use kernel::prelude::*; + use ::kernel::prelude::*; // Unconditionally print the location of the original doctest (i.e. rather than the location in // the generated file) so that developers can easily map the test back to the source code. @@ -197,11 +201,11 @@ macro_rules! assert_eq {{ // This follows the syntax for declaring test metadata in the proposed KTAP v2 spec, which may // be used for the proposed KUnit test attributes API. Thus hopefully this will make migration // easier later on. - kernel::kunit::info(format_args!(" # {kunit_name}.location: {real_path}:{line}\n")); + ::kernel::kunit::info(format_args!(" # {kunit_name}.location: {real_path}:{line}\n")); /// The anchor where the test code body starts. #[allow(unused)] - static __DOCTEST_ANCHOR: i32 = core::line!() as i32 + {body_offset} + 1; + static __DOCTEST_ANCHOR: i32 = ::core::line!() as i32 + {body_offset} + 1; {{ {body} main(); -- 2.43.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v5] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 16:45 ` [PATCH v5] " igor.korotin.linux @ 2025-05-19 17:10 ` Miguel Ojeda 2025-05-20 8:54 ` Igor Korotin 2025-05-21 14:12 ` Miguel Ojeda 2025-05-22 22:14 ` Miguel Ojeda 2 siblings, 1 reply; 14+ messages in thread From: Miguel Ojeda @ 2025-05-19 17:10 UTC (permalink / raw) To: igor.korotin.linux Cc: Miguel Ojeda, Alex Gaynor, Benno Lossin, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux On Mon, May 19, 2025 at 6:49 PM <igor.korotin.linux@gmail.com> wrote: > > From: Igor Korotin <igor.korotin.linux@gmail.com> > > Fix macros and auto-generated code to use absolute paths, `::core::...` > and `::kernel::...`, for core and kernel references. This prevents issues > where user-defined modules named `core` or `kernel` could be picked up > instead of the `core` or `kernel` crates. > > Suggested-by: Benno Lossin <benno.lossin@proton.me> > Closes: https://github.com/Rust-for-Linux/linux/issues/1150 > Signed-off-by: Igor Korotin <igor.korotin.linux@gmail.com> Oh, we crossed emails... :) Couple notes (no need for v6 -- I can fix locally when applying if you prefer): - Normally you would keep the Reviewed-by from the previous version if there are no big changes -- in this one Benno agreed to drop the `static_assert!` change I mentioned, so the Reviewed-by should still apply without risk. - The email header (From) lacks the name, so Git had to add the From: ... at the top. I would suggest checking the email setup so that the email goes with the full name too. - I normally suggest sending new versions as a new thread -- it is easier to read in certain clients and in Lore. Thanks! Cheers, Miguel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v5] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 17:10 ` Miguel Ojeda @ 2025-05-20 8:54 ` Igor Korotin 0 siblings, 0 replies; 14+ messages in thread From: Igor Korotin @ 2025-05-20 8:54 UTC (permalink / raw) To: Miguel Ojeda Cc: Miguel Ojeda, Alex Gaynor, Benno Lossin, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux On Mon, May 19, 2025 at 6:10 PM Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> wrote: > Couple notes (no need for v6 -- I can fix locally when applying if you prefer): Thanks — please do if it's not a burden. > - Normally you would keep the Reviewed-by from the previous version > if there are no big changes -- in this one Benno agreed to drop the > `static_assert!` change I mentioned, so the Reviewed-by should still > apply without risk. > > - The email header (From) lacks the name, so Git had to add the > From: ... at the top. I would suggest checking the email setup so that > the email goes with the full name too. > > - I normally suggest sending new versions as a new thread -- it is > easier to read in certain clients and in Lore. Thanks for the clarifications. Noted. Thanks Igor ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v5] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 16:45 ` [PATCH v5] " igor.korotin.linux 2025-05-19 17:10 ` Miguel Ojeda @ 2025-05-21 14:12 ` Miguel Ojeda 2025-05-21 15:08 ` Greg KH 2025-05-22 22:14 ` Miguel Ojeda 2 siblings, 1 reply; 14+ messages in thread From: Miguel Ojeda @ 2025-05-21 14:12 UTC (permalink / raw) To: David Gow, Brendan Higgins, Greg KH, Rafael J. Wysocki, Danilo Krummrich Cc: Miguel Ojeda, Alex Gaynor, Benno Lossin, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, rust-for-linux, igor.korotin.linux On Mon, May 19, 2025 at 6:49 PM <igor.korotin.linux@gmail.com> wrote: > > rust/kernel/device.rs | 2 +- > rust/kernel/device_id.rs | 4 ++-- > rust/kernel/kunit.rs | 8 ++++---- > rust/macros/kunit.rs | 22 +++++++++++----------- David, Brendan, Greg, Rafael, Danilo: I will pick this one up -- if you prefer I don't, please let me know. Thanks! Cheers, Miguel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v5] rust: macros: Fix macro referencing core and kernel crates 2025-05-21 14:12 ` Miguel Ojeda @ 2025-05-21 15:08 ` Greg KH 0 siblings, 0 replies; 14+ messages in thread From: Greg KH @ 2025-05-21 15:08 UTC (permalink / raw) To: Miguel Ojeda Cc: David Gow, Brendan Higgins, Rafael J. Wysocki, Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Benno Lossin, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, rust-for-linux, igor.korotin.linux On Wed, May 21, 2025 at 04:12:43PM +0200, Miguel Ojeda wrote: > On Mon, May 19, 2025 at 6:49 PM <igor.korotin.linux@gmail.com> wrote: > > > > rust/kernel/device.rs | 2 +- > > rust/kernel/device_id.rs | 4 ++-- > > rust/kernel/kunit.rs | 8 ++++---- > > rust/macros/kunit.rs | 22 +++++++++++----------- > > David, Brendan, Greg, Rafael, Danilo: I will pick this one up -- if > you prefer I don't, please let me know. No objection from me! Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v5] rust: macros: Fix macro referencing core and kernel crates 2025-05-19 16:45 ` [PATCH v5] " igor.korotin.linux 2025-05-19 17:10 ` Miguel Ojeda 2025-05-21 14:12 ` Miguel Ojeda @ 2025-05-22 22:14 ` Miguel Ojeda 2 siblings, 0 replies; 14+ messages in thread From: Miguel Ojeda @ 2025-05-22 22:14 UTC (permalink / raw) To: igor.korotin.linux Cc: Miguel Ojeda, Alex Gaynor, Benno Lossin, Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, rust-for-linux On Mon, May 19, 2025 at 6:49 PM <igor.korotin.linux@gmail.com> wrote: > > From: Igor Korotin <igor.korotin.linux@gmail.com> > > Fix macros and auto-generated code to use absolute paths, `::core::...` > and `::kernel::...`, for core and kernel references. This prevents issues > where user-defined modules named `core` or `kernel` could be picked up > instead of the `core` or `kernel` crates. > > Suggested-by: Benno Lossin <benno.lossin@proton.me> > Closes: https://github.com/Rust-for-Linux/linux/issues/1150 > Signed-off-by: Igor Korotin <igor.korotin.linux@gmail.com> Applied to `rust-next` -- thanks everyone! [ Applied `rustfmt`. Reworded slightly. - Miguel ] I picked up Benno's review from v4. If KUnit does not want this in, please shout. Cheers, Miguel ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-05-22 22:14 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20250516122349.1944895-1-igor.korotin.ref@yahoo.com> 2025-05-16 12:23 ` [PATCH v4] rust: macros: Fix macro referencing core and kernel crates Igor Korotin 2025-05-17 21:36 ` kernel test robot 2025-05-18 7:33 ` Benno Lossin 2025-05-19 14:20 ` Miguel Ojeda 2025-05-19 14:33 ` Benno Lossin 2025-05-19 16:09 ` Igor Korotin 2025-05-19 16:49 ` Miguel Ojeda 2025-05-20 8:37 ` Igor Korotin 2025-05-19 16:45 ` [PATCH v5] " igor.korotin.linux 2025-05-19 17:10 ` Miguel Ojeda 2025-05-20 8:54 ` Igor Korotin 2025-05-21 14:12 ` Miguel Ojeda 2025-05-21 15:08 ` Greg KH 2025-05-22 22:14 ` Miguel Ojeda
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).