Re: [PATCH] rust: irq: add `'static` bounds to irq callbacks

From: Gary Guo

Date: Sat Feb 14 2026 - 04:34:22 EST


On 2026-02-14 09:27, Benno Lossin wrote:
> 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].
>
> Signed-off-by: Benno Lossin <lossin@xxxxxxxxxx>
> Link: https://github.com/rust-lang/rust/pull/149389 [1]

Reviewed-by: Gary Guo <gary@xxxxxxxxxxx>

> ---
> 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 b150563fdef8..2ceeaeb0543a 100644
> --- a/rust/kernel/irq/request.rs
> +++ b/rust/kernel/irq/request.rs
> @@ -261,7 +261,10 @@ pub fn synchronize(&self, dev: &Device<Bound>) -> Result {
> /// # 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 @@ pub fn synchronize(&self, dev: &Device<Bound>) -> Result {
> /// # 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 @@ pub fn synchronize(&self, dev: &Device<Bound>) -> Result {
> /// # 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
>
> base-commit: 63804fed149a6750ffd28610c5c1c98cce6bd377