diff options
| -rw-r--r-- | .clippy.toml | 2 | ||||
| -rw-r--r-- | arch/x86/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpu/nova-core/gpu.rs | 2 | ||||
| -rw-r--r-- | init/Kconfig | 3 | ||||
| -rw-r--r-- | rust/bindings/lib.rs | 1 | ||||
| -rw-r--r-- | rust/kernel/alloc/kvec.rs | 3 | ||||
| -rw-r--r-- | rust/kernel/list.rs | 3 | ||||
| -rw-r--r-- | rust/kernel/str.rs | 46 | ||||
| -rw-r--r-- | rust/macros/kunit.rs | 13 | ||||
| -rw-r--r-- | rust/macros/module.rs | 19 | ||||
| -rw-r--r-- | rust/macros/paste.rs | 2 | ||||
| -rw-r--r-- | rust/pin-init/internal/src/pinned_drop.rs | 3 | ||||
| -rw-r--r-- | rust/uapi/lib.rs | 1 | ||||
| -rw-r--r-- | tools/objtool/check.c | 1 | 
14 files changed, 49 insertions, 51 deletions
| diff --git a/.clippy.toml b/.clippy.toml index 815c94732ed7..137f41d203de 100644 --- a/.clippy.toml +++ b/.clippy.toml @@ -7,5 +7,5 @@ check-private-items = true  disallowed-macros = [      # The `clippy::dbg_macro` lint only works with `std::dbg!`, thus we simulate      # it here, see: https://github.com/rust-lang/rust-clippy/issues/11303. -    { path = "kernel::dbg", reason = "the `dbg!` macro is intended as a debugging tool" }, +    { path = "kernel::dbg", reason = "the `dbg!` macro is intended as a debugging tool", allow-invalid = true },  ] diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 4b9f378e05f6..5873c9e39919 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2368,6 +2368,7 @@ config STRICT_SIGALTSTACK_SIZE  config CFI_AUTO_DEFAULT  	bool "Attempt to use FineIBT by default at boot time"  	depends on FINEIBT +	depends on !RUST || RUSTC_VERSION >= 108800  	default y  	help  	  Attempt to use FineIBT by default at boot time. If enabled, diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 17c9660da450..ab0e5a72a059 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -93,7 +93,7 @@ impl Chipset {  // For now, redirect to fmt::Debug for convenience.  impl fmt::Display for Chipset {      fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -        write!(f, "{:?}", self) +        write!(f, "{self:?}")      }  } diff --git a/init/Kconfig b/init/Kconfig index 63f5974b9fa6..4cdd1049283c 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -140,6 +140,9 @@ config LD_CAN_USE_KEEP_IN_OVERLAY  config RUSTC_HAS_COERCE_POINTEE  	def_bool RUSTC_VERSION >= 108400 +config RUSTC_HAS_UNNECESSARY_TRANSMUTES +	def_bool RUSTC_VERSION >= 108800 +  config PAHOLE_VERSION  	int  	default $(shell,$(srctree)/scripts/pahole-version.sh $(PAHOLE)) diff --git a/rust/bindings/lib.rs b/rust/bindings/lib.rs index 014af0d1fc70..a08eb5518cac 100644 --- a/rust/bindings/lib.rs +++ b/rust/bindings/lib.rs @@ -26,6 +26,7 @@  #[allow(dead_code)]  #[allow(clippy::undocumented_unsafe_blocks)] +#[cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]  mod bindings_raw {      // Manual definition for blocklisted types.      type __kernel_size_t = usize; diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs index ae9d072741ce..87a71fd40c3c 100644 --- a/rust/kernel/alloc/kvec.rs +++ b/rust/kernel/alloc/kvec.rs @@ -2,6 +2,9 @@  //! Implementation of [`Vec`]. +// May not be needed in Rust 1.87.0 (pending beta backport). +#![allow(clippy::ptr_eq)] +  use super::{      allocator::{KVmalloc, Kmalloc, Vmalloc},      layout::ArrayLayout, diff --git a/rust/kernel/list.rs b/rust/kernel/list.rs index a335c3b1ff5e..2054682c5724 100644 --- a/rust/kernel/list.rs +++ b/rust/kernel/list.rs @@ -4,6 +4,9 @@  //! A linked list implementation. +// May not be needed in Rust 1.87.0 (pending beta backport). +#![allow(clippy::ptr_eq)] +  use crate::sync::ArcBorrow;  use crate::types::Opaque;  use core::iter::{DoubleEndedIterator, FusedIterator}; diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs index 878111cb77bc..fb61ce81ea28 100644 --- a/rust/kernel/str.rs +++ b/rust/kernel/str.rs @@ -73,7 +73,7 @@ impl fmt::Display for BStr {                  b'\r' => f.write_str("\\r")?,                  // Printable characters.                  0x20..=0x7e => f.write_char(b as char)?, -                _ => write!(f, "\\x{:02x}", b)?, +                _ => write!(f, "\\x{b:02x}")?,              }          }          Ok(()) @@ -109,7 +109,7 @@ impl fmt::Debug for BStr {                  b'\\' => f.write_str("\\\\")?,                  // Printable characters.                  0x20..=0x7e => f.write_char(b as char)?, -                _ => write!(f, "\\x{:02x}", b)?, +                _ => write!(f, "\\x{b:02x}")?,              }          }          f.write_char('"') @@ -447,7 +447,7 @@ impl fmt::Display for CStr {                  // Printable character.                  f.write_char(c as char)?;              } else { -                write!(f, "\\x{:02x}", c)?; +                write!(f, "\\x{c:02x}")?;              }          }          Ok(()) @@ -479,7 +479,7 @@ impl fmt::Debug for CStr {                  // Printable characters.                  b'\"' => f.write_str("\\\"")?,                  0x20..=0x7e => f.write_char(c as char)?, -                _ => write!(f, "\\x{:02x}", c)?, +                _ => write!(f, "\\x{c:02x}")?,              }          }          f.write_str("\"") @@ -641,13 +641,13 @@ mod tests {      #[test]      fn test_cstr_display() {          let hello_world = CStr::from_bytes_with_nul(b"hello, world!\0").unwrap(); -        assert_eq!(format!("{}", hello_world), "hello, world!"); +        assert_eq!(format!("{hello_world}"), "hello, world!");          let non_printables = CStr::from_bytes_with_nul(b"\x01\x09\x0a\0").unwrap(); -        assert_eq!(format!("{}", non_printables), "\\x01\\x09\\x0a"); +        assert_eq!(format!("{non_printables}"), "\\x01\\x09\\x0a");          let non_ascii = CStr::from_bytes_with_nul(b"d\xe9j\xe0 vu\0").unwrap(); -        assert_eq!(format!("{}", non_ascii), "d\\xe9j\\xe0 vu"); +        assert_eq!(format!("{non_ascii}"), "d\\xe9j\\xe0 vu");          let good_bytes = CStr::from_bytes_with_nul(b"\xf0\x9f\xa6\x80\0").unwrap(); -        assert_eq!(format!("{}", good_bytes), "\\xf0\\x9f\\xa6\\x80"); +        assert_eq!(format!("{good_bytes}"), "\\xf0\\x9f\\xa6\\x80");      }      #[test] @@ -658,47 +658,47 @@ mod tests {              bytes[i as usize] = i.wrapping_add(1);          }          let cstr = CStr::from_bytes_with_nul(&bytes).unwrap(); -        assert_eq!(format!("{}", cstr), ALL_ASCII_CHARS); +        assert_eq!(format!("{cstr}"), ALL_ASCII_CHARS);      }      #[test]      fn test_cstr_debug() {          let hello_world = CStr::from_bytes_with_nul(b"hello, world!\0").unwrap(); -        assert_eq!(format!("{:?}", hello_world), "\"hello, world!\""); +        assert_eq!(format!("{hello_world:?}"), "\"hello, world!\"");          let non_printables = CStr::from_bytes_with_nul(b"\x01\x09\x0a\0").unwrap(); -        assert_eq!(format!("{:?}", non_printables), "\"\\x01\\x09\\x0a\""); +        assert_eq!(format!("{non_printables:?}"), "\"\\x01\\x09\\x0a\"");          let non_ascii = CStr::from_bytes_with_nul(b"d\xe9j\xe0 vu\0").unwrap(); -        assert_eq!(format!("{:?}", non_ascii), "\"d\\xe9j\\xe0 vu\""); +        assert_eq!(format!("{non_ascii:?}"), "\"d\\xe9j\\xe0 vu\"");          let good_bytes = CStr::from_bytes_with_nul(b"\xf0\x9f\xa6\x80\0").unwrap(); -        assert_eq!(format!("{:?}", good_bytes), "\"\\xf0\\x9f\\xa6\\x80\""); +        assert_eq!(format!("{good_bytes:?}"), "\"\\xf0\\x9f\\xa6\\x80\"");      }      #[test]      fn test_bstr_display() {          let hello_world = BStr::from_bytes(b"hello, world!"); -        assert_eq!(format!("{}", hello_world), "hello, world!"); +        assert_eq!(format!("{hello_world}"), "hello, world!");          let escapes = BStr::from_bytes(b"_\t_\n_\r_\\_\'_\"_"); -        assert_eq!(format!("{}", escapes), "_\\t_\\n_\\r_\\_'_\"_"); +        assert_eq!(format!("{escapes}"), "_\\t_\\n_\\r_\\_'_\"_");          let others = BStr::from_bytes(b"\x01"); -        assert_eq!(format!("{}", others), "\\x01"); +        assert_eq!(format!("{others}"), "\\x01");          let non_ascii = BStr::from_bytes(b"d\xe9j\xe0 vu"); -        assert_eq!(format!("{}", non_ascii), "d\\xe9j\\xe0 vu"); +        assert_eq!(format!("{non_ascii}"), "d\\xe9j\\xe0 vu");          let good_bytes = BStr::from_bytes(b"\xf0\x9f\xa6\x80"); -        assert_eq!(format!("{}", good_bytes), "\\xf0\\x9f\\xa6\\x80"); +        assert_eq!(format!("{good_bytes}"), "\\xf0\\x9f\\xa6\\x80");      }      #[test]      fn test_bstr_debug() {          let hello_world = BStr::from_bytes(b"hello, world!"); -        assert_eq!(format!("{:?}", hello_world), "\"hello, world!\""); +        assert_eq!(format!("{hello_world:?}"), "\"hello, world!\"");          let escapes = BStr::from_bytes(b"_\t_\n_\r_\\_\'_\"_"); -        assert_eq!(format!("{:?}", escapes), "\"_\\t_\\n_\\r_\\\\_'_\\\"_\""); +        assert_eq!(format!("{escapes:?}"), "\"_\\t_\\n_\\r_\\\\_'_\\\"_\"");          let others = BStr::from_bytes(b"\x01"); -        assert_eq!(format!("{:?}", others), "\"\\x01\""); +        assert_eq!(format!("{others:?}"), "\"\\x01\"");          let non_ascii = BStr::from_bytes(b"d\xe9j\xe0 vu"); -        assert_eq!(format!("{:?}", non_ascii), "\"d\\xe9j\\xe0 vu\""); +        assert_eq!(format!("{non_ascii:?}"), "\"d\\xe9j\\xe0 vu\"");          let good_bytes = BStr::from_bytes(b"\xf0\x9f\xa6\x80"); -        assert_eq!(format!("{:?}", good_bytes), "\"\\xf0\\x9f\\xa6\\x80\""); +        assert_eq!(format!("{good_bytes:?}"), "\"\\xf0\\x9f\\xa6\\x80\"");      }  } diff --git a/rust/macros/kunit.rs b/rust/macros/kunit.rs index 4f553ecf40c0..99ccac82edde 100644 --- a/rust/macros/kunit.rs +++ b/rust/macros/kunit.rs @@ -15,10 +15,7 @@ pub(crate) fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream {      }      if attr.len() > 255 { -        panic!( -            "The test suite name `{}` exceeds the maximum length of 255 bytes", -            attr -        ) +        panic!("The test suite name `{attr}` exceeds the maximum length of 255 bytes")      }      let mut tokens: Vec<_> = ts.into_iter().collect(); @@ -102,16 +99,14 @@ pub(crate) fn kunit_tests(attr: TokenStream, ts: TokenStream) -> TokenStream {      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_fn_name = format!("kunit_rust_wrapper_{test}");          let kunit_wrapper = format!( -            "unsafe extern \"C\" fn {}(_test: *mut kernel::bindings::kunit) {{ {}(); }}", -            kunit_wrapper_fn_name, 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();      } diff --git a/rust/macros/module.rs b/rust/macros/module.rs index a9418fbc9b44..2f66107847f7 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -48,7 +48,7 @@ impl<'a> ModInfoBuilder<'a> {              )          } else {              // Loadable modules' modinfo strings go as-is. -            format!("{field}={content}\0", field = field, content = content) +            format!("{field}={content}\0")          };          write!( @@ -126,10 +126,7 @@ impl ModuleInfo {              };              if seen_keys.contains(&key) { -                panic!( -                    "Duplicated key \"{}\". Keys can only be specified once.", -                    key -                ); +                panic!("Duplicated key \"{key}\". Keys can only be specified once.");              }              assert_eq!(expect_punct(it), ':'); @@ -143,10 +140,7 @@ impl ModuleInfo {                  "license" => info.license = expect_string_ascii(it),                  "alias" => info.alias = Some(expect_string_array(it)),                  "firmware" => info.firmware = Some(expect_string_array(it)), -                _ => panic!( -                    "Unknown key \"{}\". Valid keys are: {:?}.", -                    key, EXPECTED_KEYS -                ), +                _ => panic!("Unknown key \"{key}\". Valid keys are: {EXPECTED_KEYS:?}."),              }              assert_eq!(expect_punct(it), ','); @@ -158,7 +152,7 @@ impl ModuleInfo {          for key in REQUIRED_KEYS {              if !seen_keys.iter().any(|e| e == key) { -                panic!("Missing required key \"{}\".", key); +                panic!("Missing required key \"{key}\".");              }          } @@ -170,10 +164,7 @@ impl ModuleInfo {          }          if seen_keys != ordered_keys { -            panic!( -                "Keys are not ordered as expected. Order them like: {:?}.", -                ordered_keys -            ); +            panic!("Keys are not ordered as expected. Order them like: {ordered_keys:?}.");          }          info diff --git a/rust/macros/paste.rs b/rust/macros/paste.rs index 6529a387673f..cce712d19855 100644 --- a/rust/macros/paste.rs +++ b/rust/macros/paste.rs @@ -50,7 +50,7 @@ fn concat_helper(tokens: &[TokenTree]) -> Vec<(String, Span)> {                  let tokens = group.stream().into_iter().collect::<Vec<TokenTree>>();                  segments.append(&mut concat_helper(tokens.as_slice()));              } -            token => panic!("unexpected token in paste segments: {:?}", token), +            token => panic!("unexpected token in paste segments: {token:?}"),          };      } diff --git a/rust/pin-init/internal/src/pinned_drop.rs b/rust/pin-init/internal/src/pinned_drop.rs index c824dd8b436d..c4ca7a70b726 100644 --- a/rust/pin-init/internal/src/pinned_drop.rs +++ b/rust/pin-init/internal/src/pinned_drop.rs @@ -28,8 +28,7 @@ pub(crate) fn pinned_drop(_args: TokenStream, input: TokenStream) -> TokenStream              // Found the end of the generics, this should be `PinnedDrop`.              assert!(                  matches!(tt, TokenTree::Ident(i) if i.to_string() == "PinnedDrop"), -                "expected 'PinnedDrop', found: '{:?}'", -                tt +                "expected 'PinnedDrop', found: '{tt:?}'"              );              pinned_drop_idx = Some(i);              break; diff --git a/rust/uapi/lib.rs b/rust/uapi/lib.rs index 13495910271f..c98d7a8cde77 100644 --- a/rust/uapi/lib.rs +++ b/rust/uapi/lib.rs @@ -24,6 +24,7 @@      unreachable_pub,      unsafe_op_in_unsafe_fn  )] +#![cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]  // Manual definition of blocklisted types.  type __kernel_size_t = usize; diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 3a411064fa34..b21b12ec88d9 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -227,6 +227,7 @@ static bool is_rust_noreturn(const struct symbol *func)  	       str_ends_with(func->name, "_4core9panicking19assert_failed_inner")			||  	       str_ends_with(func->name, "_4core9panicking30panic_null_pointer_dereference")		||  	       str_ends_with(func->name, "_4core9panicking36panic_misaligned_pointer_dereference")	|| +	       str_ends_with(func->name, "_7___rustc17rust_begin_unwind")				||  	       strstr(func->name, "_4core9panicking13assert_failed")					||  	       strstr(func->name, "_4core9panicking11panic_const24panic_const_")			||  	       (strstr(func->name, "_4core5slice5index24slice_") && | 
