mirror of https://github.com/torvalds/linux.git
Rust fixes for v6.15 (2nd)
Toolchain and infrastructure:
- Make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88.0.
- Clean Rust (and Clippy) lints for the upcoming Rust 1.87.0 and Rust
1.88.0 releases.
- Clean objtool warning for the upcoming Rust 1.87.0 release by adding
one more noreturn function.
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEPjU5OPd5QIZ9jqqOGXyLc2htIW0FAmgeYP0ACgkQGXyLc2ht
IW1P4hAAkgehQqfec/Ebn31euIHcS2GTAr1UzSEM23ErYieLTKUOH3vaPq3rxxsF
Tfq/n7vjRI55hfQ199nYaWIXL/BBPIDGxGZ6EwoOcH/xx4Y7er4WIbCuaxaN2ySy
GniUtOOvbXM9tB4h/SjBc/8fv6XxmP0T8ylO4a2G1HIWz31Iy5KkeohmmugnpX0F
FvVdR0aAjbGk1bS4JCi4Y9/TX7FzjBd6gIErvIcYZNtNUkxlWYVbIOKTSOoQiQu0
JSI9EpgiDYjMMXvIM+INOapoVUX9yTJ/ZisoMEb2gkAkC15UVa+M8D4jaP1bYNPp
YcjiWGJv5TNIL9F25p0Wa9pgP/OGVzJxKZv11dAwkeqX6SM/nUXuNa3pBNiuSpn8
syoPTcP2DeZnPrXNZeItZ8KRl27TSdhs3y4RPW8jd77Fo5Hqw7nRrHqI9n+0DBKw
7FRqnXmUQfRzlpz29Y4nA9mr8k5gLJsdKLpLEzdxC8Fec3wDPTzvchu0X722UPq+
k+8Ex5sh8cDm0BKqplS6ZFEShMhqtwpRQFhZpCga8Ogs6t13b3vQRDkWFoeKvbGQ
7CxSUHQRjbiwJNEpemFUCLw6fHJMusnrEXNQCIOdxuIYFyCZKiV9wFyxVWYcEp6W
YTNnyp3f1GVlsiT9qSyNi9woUF4HTRdhUOQqsmGhCHDcUM6Ufhc=
=lyOI
-----END PGP SIGNATURE-----
Merge tag 'rust-fixes-6.15-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ojeda/linux
Pull rust fixes from Miguel Ojeda:
- Make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88.0
- Clean Rust (and Clippy) lints for the upcoming Rust 1.87.0 and 1.88.0
releases
- Clean objtool warning for the upcoming Rust 1.87.0 release by adding
one more noreturn function
* tag 'rust-fixes-6.15-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ojeda/linux:
x86/Kconfig: make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88
rust: clean Rust 1.88.0's `clippy::uninlined_format_args` lint
rust: clean Rust 1.88.0's warning about `clippy::disallowed_macros` configuration
rust: clean Rust 1.88.0's `unnecessary_transmutes` lint
rust: allow Rust 1.87.0's `clippy::ptr_eq` lint
objtool/rust: add one more `noreturn` Rust function for Rust 1.87.0
This commit is contained in:
commit
0e1329d404
|
|
@ -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 },
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ pub(crate) fn arch(&self) -> Architecture {
|
|||
// 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:?}")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||
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 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||
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 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||
// Printable character.
|
||||
f.write_char(c as char)?;
|
||||
} else {
|
||||
write!(f, "\\x{:02x}", c)?;
|
||||
write!(f, "\\x{c:02x}")?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
|
@ -479,7 +479,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||
// 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 @@ fn test_cstr_as_str_unchecked() {
|
|||
#[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 @@ fn test_cstr_display_all_bytes() {
|
|||
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\"");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ fn emit_base(&mut self, field: &str, content: &str, builtin: bool) {
|
|||
)
|
||||
} 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 @@ fn parse(it: &mut token_stream::IntoIter) -> Self {
|
|||
};
|
||||
|
||||
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 @@ fn parse(it: &mut token_stream::IntoIter) -> Self {
|
|||
"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 @@ fn parse(it: &mut token_stream::IntoIter) -> Self {
|
|||
|
||||
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 @@ fn parse(it: &mut token_stream::IntoIter) -> Self {
|
|||
}
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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:?}"),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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_") &&
|
||||
|
|
|
|||
Loading…
Reference in New Issue