| From 19a5e1160fe36f9c2c57dd3896f003c8fb2a6d60 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 14 Feb 2026 10:27:40 +0100 |
| Subject: rust: irq: add `'static` bounds to irq callbacks |
| |
| From: Benno Lossin <lossin@kernel.org> |
| |
| [ Upstream commit 621609f1e5ca43a75edd497dd1c28bd84aa66433 ] |
| |
| These callback functions take a generic `T` that is used in the body as |
| the generic argument in `Registration` and `ThreadedRegistration`. Those |
| types require `T: 'static`, but due to a compiler bug this requirement |
| isn't propagated to the function. Thus add the bound. This was caught in |
| the upstream Rust CI [1]. |
| |
| [ The three errors looked similar and will start appearing with Rust |
| 1.95.0 (expected 2026-04-16). The first one was: |
| |
| error[E0310]: the parameter type `T` may not live long enough |
| Error: --> rust/kernel/irq/request.rs:266:43 |
| | |
| 266 | let registration = unsafe { &*(ptr as *const Registration<T>) }; |
| | ^^^^^^^^^^^^^^^^^^^^^^ |
| | | |
| | the parameter type `T` must be valid for the static lifetime... |
| | ...so that the type `T` will meet its required lifetime bounds |
| | |
| help: consider adding an explicit lifetime bound |
| | |
| 264 | unsafe extern "C" fn handle_irq_callback<T: Handler + 'static>(_irq: i32, ptr: *mut c_void) -> c_uint { |
| | +++++++++ |
| |
| - Miguel ] |
| |
| Link: https://github.com/rust-lang/rust/pull/149389 [1] |
| Signed-off-by: Benno Lossin <lossin@kernel.org> |
| Cc: stable@vger.kernel.org |
| Fixes: 29e16fcd67ee ("rust: irq: add &Device<Bound> argument to irq callbacks") |
| Reviewed-by: Gary Guo <gary@garyguo.net> |
| Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> |
| Acked-by: Danilo Krummrich <dakr@kernel.org> |
| Link: https://lore.kernel.org/rust-for-linux/20260217222425.8755-1-cole@unwrap.rs/ |
| Link: https://patch.msgid.link/20260214092740.3201946-1-lossin@kernel.org |
| Signed-off-by: Miguel Ojeda <ojeda@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| rust/kernel/irq/request.rs | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| diff --git a/rust/kernel/irq/request.rs b/rust/kernel/irq/request.rs |
| index b150563fdef80..2ceeaeb0543a4 100644 |
| --- a/rust/kernel/irq/request.rs |
| +++ b/rust/kernel/irq/request.rs |
| @@ -261,7 +261,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 |
| @@ -480,7 +483,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 { |
| @@ -496,7 +499,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 |
| -- |
| 2.51.0 |
| |