mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:04:41 +01:00
Rust fixes for v7.0-rc1
Toolchain and infrastructure:
- Pass '-Zunstable-options' flag required by the future Rust 1.95.0.
- Fix 'objtool' warning for Rust 1.84.0.
'kernel' crate:
- 'irq' module: add missing bound detected by the future Rust 1.95.0.
- 'list' module: add missing 'unsafe' blocks and placeholder safety
comments to macros (an issue for future callers within the crate).
'pin-init' crate:
- Clean Clippy warning that changed behavior in the future Rust 1.95.0.
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEPjU5OPd5QIZ9jqqOGXyLc2htIW0FAmmaEt0ACgkQGXyLc2ht
IW0HMBAAvWE97pcuuPoj/3edacMTsUkmeRNssLd5PNwMrt7MjtZiH+2L01/EJ+U0
JrGaTLVEWzghOZX5TvdbaWzo6sfU9MvKmRx7mHJbx6EN+NoYSZ0eTN0LndQEQtVm
64VPYXRCiy06w6GsPcVaY4CVuqk+BLfZfom2nP/bDbgi3SwBi+nuQurrzw4f/JzJ
zLDG4hzTkWIp2JTZLNHhxGWVOumKkZYTYAfkgpzy8ihLZou32fhftOAuFqs33qOm
vYD4PVaszQcJsCoHkevLFRPVQ/Ew2B4M2vZZgWnCgfVgxmnOcwqjhj/8KhHqQv21
QYdUa+NEsSDjcuGJcPEZee0a4bp8EoumhTH0/BsVuxsgol3PTY5Y5jM7aBmsOlu5
lhhcmh3bJ8Srxpa4U2zCy+AMNR8ZLGR9QQNm0YpfhG+Z1is7Yg/XBB+sCuP7CdB0
JI1RNQVVmY3M11AtJB4xtT8NEu4HDf90NQa8RVNR824XHGiix2wVM2lBCr/CJCGK
kTeM1Fb9Lqsb29qFCq12ZbUUgsVpvF/H+L5uOKzsINetWRbpJLBbC8nghCydVzxb
1bytEBk6zLMG5we1m1wLUeVtMvwfL/ut5ptiRExufgMf/BLU/f7QdSyKE1ZtvBbX
Ed20io8EChQFdcKkFHiyeYY1xuLl9ViFN80SH7LlrNGxp6eJEdA=
=DOG1
-----END PGP SIGNATURE-----
Merge tag 'rust-fixes-7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/ojeda/linux
Pull rust fixes from Miguel Ojeda:
"Toolchain and infrastructure:
- Pass '-Zunstable-options' flag required by the future Rust 1.95.0
- Fix 'objtool' warning for Rust 1.84.0
'kernel' crate:
- 'irq' module: add missing bound detected by the future Rust 1.95.0
- 'list' module: add missing 'unsafe' blocks and placeholder safety
comments to macros (an issue for future callers within the crate)
'pin-init' crate:
- Clean Clippy warning that changed behavior in the future Rust
1.95.0"
* tag 'rust-fixes-7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/ojeda/linux:
rust: list: Add unsafe blocks for container_of and safety comments
rust: pin-init: replace clippy `expect` with `allow`
rust: irq: add `'static` bounds to irq callbacks
objtool/rust: add one more `noreturn` Rust function
rust: kbuild: pass `-Zunstable-options` for Rust 1.95.0
This commit is contained in:
commit
1dd419145d
5 changed files with 32 additions and 15 deletions
|
|
@ -570,6 +570,8 @@ $(obj)/$(libpin_init_internal_name): $(src)/pin-init/internal/src/lib.rs \
|
|||
$(obj)/libproc_macro2.rlib $(obj)/libquote.rlib $(obj)/libsyn.rlib FORCE
|
||||
+$(call if_changed_dep,rustc_procmacro)
|
||||
|
||||
# `rustc` requires `-Zunstable-options` to use custom target specifications
|
||||
# since Rust 1.95.0 (https://github.com/rust-lang/rust/pull/151534).
|
||||
quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L $@
|
||||
cmd_rustc_library = \
|
||||
OBJTREE=$(abspath $(objtree)) \
|
||||
|
|
@ -580,6 +582,7 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L
|
|||
--crate-type rlib -L$(objtree)/$(obj) \
|
||||
--crate-name $(patsubst %.o,%,$(notdir $@)) $< \
|
||||
--sysroot=/dev/null \
|
||||
-Zunstable-options \
|
||||
$(if $(rustc_objcopy),;$(OBJCOPY) $(rustc_objcopy) $@) \
|
||||
$(cmd_objtool)
|
||||
|
||||
|
|
|
|||
|
|
@ -260,7 +260,10 @@ impl<T: Handler + 'static> Registration<T> {
|
|||
/// # Safety
|
||||
///
|
||||
/// This function should be only used as the callback in `request_irq`.
|
||||
unsafe extern "C" fn handle_irq_callback<T: Handler>(_irq: i32, ptr: *mut c_void) -> c_uint {
|
||||
unsafe extern "C" fn handle_irq_callback<T: Handler + 'static>(
|
||||
_irq: i32,
|
||||
ptr: *mut c_void,
|
||||
) -> c_uint {
|
||||
// SAFETY: `ptr` is a pointer to `Registration<T>` set in `Registration::new`
|
||||
let registration = unsafe { &*(ptr as *const Registration<T>) };
|
||||
// SAFETY: The irq callback is removed before the device is unbound, so the fact that the irq
|
||||
|
|
@ -478,7 +481,7 @@ impl<T: ThreadedHandler + 'static> ThreadedRegistration<T> {
|
|||
/// # Safety
|
||||
///
|
||||
/// This function should be only used as the callback in `request_threaded_irq`.
|
||||
unsafe extern "C" fn handle_threaded_irq_callback<T: ThreadedHandler>(
|
||||
unsafe extern "C" fn handle_threaded_irq_callback<T: ThreadedHandler + 'static>(
|
||||
_irq: i32,
|
||||
ptr: *mut c_void,
|
||||
) -> c_uint {
|
||||
|
|
@ -494,7 +497,10 @@ unsafe extern "C" fn handle_threaded_irq_callback<T: ThreadedHandler>(
|
|||
/// # Safety
|
||||
///
|
||||
/// This function should be only used as the callback in `request_threaded_irq`.
|
||||
unsafe extern "C" fn thread_fn_callback<T: ThreadedHandler>(_irq: i32, ptr: *mut c_void) -> c_uint {
|
||||
unsafe extern "C" fn thread_fn_callback<T: ThreadedHandler + 'static>(
|
||||
_irq: i32,
|
||||
ptr: *mut c_void,
|
||||
) -> c_uint {
|
||||
// SAFETY: `ptr` is a pointer to `ThreadedRegistration<T>` set in `ThreadedRegistration::new`
|
||||
let registration = unsafe { &*(ptr as *const ThreadedRegistration<T>) };
|
||||
// SAFETY: The irq callback is removed before the device is unbound, so the fact that the irq
|
||||
|
|
|
|||
|
|
@ -84,11 +84,12 @@ macro_rules! impl_has_list_links_self_ptr {
|
|||
// right type.
|
||||
unsafe impl$(<$($generics)*>)? $crate::list::HasSelfPtr<$item_type $(, $id)?> for $self {}
|
||||
|
||||
// SAFETY: TODO.
|
||||
unsafe impl$(<$($generics)*>)? $crate::list::HasListLinks$(<$id>)? for $self {
|
||||
#[inline]
|
||||
unsafe fn raw_get_list_links(ptr: *mut Self) -> *mut $crate::list::ListLinks$(<$id>)? {
|
||||
// SAFETY: The caller promises that the pointer is not dangling.
|
||||
let ptr: *mut $crate::list::ListLinksSelfPtr<$item_type $(, $id)?> =
|
||||
// SAFETY: The caller promises that the pointer is not dangling.
|
||||
unsafe { ::core::ptr::addr_of_mut!((*ptr)$(.$field)*) };
|
||||
ptr.cast()
|
||||
}
|
||||
|
|
@ -217,7 +218,7 @@ macro_rules! impl_list_item {
|
|||
// SAFETY: `me` originates from the most recent call to `prepare_to_insert`, so it
|
||||
// points at the field `$field` in a value of type `Self`. Thus, reversing that
|
||||
// operation is still in-bounds of the allocation.
|
||||
$crate::container_of!(me, Self, $($field).*)
|
||||
unsafe { $crate::container_of!(me, Self, $($field).*) }
|
||||
}
|
||||
|
||||
// GUARANTEES:
|
||||
|
|
@ -242,7 +243,7 @@ macro_rules! impl_list_item {
|
|||
// SAFETY: `me` originates from the most recent call to `prepare_to_insert`, so it
|
||||
// points at the field `$field` in a value of type `Self`. Thus, reversing that
|
||||
// operation is still in-bounds of the allocation.
|
||||
$crate::container_of!(me, Self, $($field).*)
|
||||
unsafe { $crate::container_of!(me, Self, $($field).*) }
|
||||
}
|
||||
}
|
||||
)*};
|
||||
|
|
@ -270,9 +271,12 @@ macro_rules! impl_list_item {
|
|||
// SAFETY: The caller promises that `me` points at a valid value of type `Self`.
|
||||
let links_field = unsafe { <Self as $crate::list::ListItem<$num>>::view_links(me) };
|
||||
|
||||
let container = $crate::container_of!(
|
||||
links_field, $crate::list::ListLinksSelfPtr<Self, $num>, inner
|
||||
);
|
||||
// SAFETY: TODO.
|
||||
let container = unsafe {
|
||||
$crate::container_of!(
|
||||
links_field, $crate::list::ListLinksSelfPtr<Self, $num>, inner
|
||||
)
|
||||
};
|
||||
|
||||
// SAFETY: By the same reasoning above, `links_field` is a valid pointer.
|
||||
let self_ptr = unsafe {
|
||||
|
|
@ -319,9 +323,12 @@ macro_rules! impl_list_item {
|
|||
// `ListArc` containing `Self` until the next call to `post_remove`. The value cannot
|
||||
// be destroyed while a `ListArc` reference exists.
|
||||
unsafe fn view_value(links_field: *mut $crate::list::ListLinks<$num>) -> *const Self {
|
||||
let container = $crate::container_of!(
|
||||
links_field, $crate::list::ListLinksSelfPtr<Self, $num>, inner
|
||||
);
|
||||
// SAFETY: TODO.
|
||||
let container = unsafe {
|
||||
$crate::container_of!(
|
||||
links_field, $crate::list::ListLinksSelfPtr<Self, $num>, inner
|
||||
)
|
||||
};
|
||||
|
||||
// SAFETY: By the same reasoning above, `links_field` is a valid pointer.
|
||||
let self_ptr = unsafe {
|
||||
|
|
|
|||
|
|
@ -1143,13 +1143,13 @@ pub const unsafe fn init_from_closure<T: ?Sized, E>(
|
|||
///
|
||||
/// - `*mut U` must be castable to `*mut T` and any value of type `T` written through such a
|
||||
/// pointer must result in a valid `U`.
|
||||
#[expect(clippy::let_and_return)]
|
||||
pub const unsafe fn cast_pin_init<T, U, E>(init: impl PinInit<T, E>) -> impl PinInit<U, E> {
|
||||
// SAFETY: initialization delegated to a valid initializer. Cast is valid by function safety
|
||||
// requirements.
|
||||
let res = unsafe { pin_init_from_closure(|ptr: *mut U| init.__pinned_init(ptr.cast::<T>())) };
|
||||
// FIXME: remove the let statement once the nightly-MSRV allows it (1.78 otherwise encounters a
|
||||
// cycle when computing the type returned by this function)
|
||||
#[allow(clippy::let_and_return)]
|
||||
res
|
||||
}
|
||||
|
||||
|
|
@ -1159,13 +1159,13 @@ pub const unsafe fn cast_pin_init<T, U, E>(init: impl PinInit<T, E>) -> impl Pin
|
|||
///
|
||||
/// - `*mut U` must be castable to `*mut T` and any value of type `T` written through such a
|
||||
/// pointer must result in a valid `U`.
|
||||
#[expect(clippy::let_and_return)]
|
||||
pub const unsafe fn cast_init<T, U, E>(init: impl Init<T, E>) -> impl Init<U, E> {
|
||||
// SAFETY: initialization delegated to a valid initializer. Cast is valid by function safety
|
||||
// requirements.
|
||||
let res = unsafe { init_from_closure(|ptr: *mut U| init.__init(ptr.cast::<T>())) };
|
||||
// FIXME: remove the let statement once the nightly-MSRV allows it (1.78 otherwise encounters a
|
||||
// cycle when computing the type returned by this function)
|
||||
#[allow(clippy::let_and_return)]
|
||||
res
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue