On Tue Jun 24, 2025 at 4:33 PM CEST, Boqun Feng wrote: > On Tue, Jun 24, 2025 at 02:50:23PM +0100, Alice Ryhl wrote: >> On Tue, Jun 24, 2025 at 1:46 PM Benno Lossin <lossin@xxxxxxxxxx> wrote: >> > On Tue Jun 24, 2025 at 2:31 PM CEST, Daniel Almeida wrote: >> > > On 23 Jun 2025, at 16:28, Benno Lossin <lossin@xxxxxxxxxx> wrote: >> > >> On Mon Jun 23, 2025 at 9:18 PM CEST, Boqun Feng wrote: >> > >>> try_pin_init!(&this in Self { >> > >>> handler, >> > >>> inner: Devres::new( >> > >>> dev, >> > >>> RegistrationInner { >> > >>> // Needs to use `handler` address as cookie, same for >> > >>> // request_irq(). >> > >>> cookie: &raw (*(this.as_ptr().cast()).handler), >> > >>> irq: { >> > >>> to_result(unsafe { bindings::request_irq(...) })?; >> > >>> irq >> > >>> } >> > >>> }, >> > >>> GFP_KERNEL, >> > >>> )?, >> > >>> _pin: PhantomPinned >> > >>> }) >> > >> >> > >> Well yes and no, with the Devres changes, the `cookie` can just be the >> > >> address of the `RegistrationInner` & we can do it this way :) >> > >> >> > >> --- >> > >> Cheers, >> > >> Benno >> > > >> > > >> > > No, we need this to be the address of the the whole thing (i.e. >> > > Registration<T>), otherwise you can’t access the handler in the irq >> > > callback. > > You only need the access of `handler` in the irq callback, right? I.e. > passing the address of `handler` would suffice (of course you need > to change the irq callback as well). > >> > >> > Gotcha, so you keep the cookie field, but you should still be able to >> > use `try_pin_init` & the devres improvements to avoid the use of >> > `pin_init_from_closure`. >> >> It sounds like this is getting too complicated and that >> `pin_init_from_closure` is the simpler way to go. The current code is not correct and the version that Boqun has below looks pretty correct (and much simpler). > Even if we use `pin_init_from_closure`, we still need the other > `try_pin_init` anyway for `Devres::new()` (or alternatively we can > implement a `RegistrationInner::new()`). > > Below is what would look like with the Devres changes in mind: > > > try_pin_init!(&this in Self { > handler, > inner: <- Devres::new( > dev, > try_pin_init!( RegistrationInner { > // Needs to use `handler` address as cookie, same for > // request_irq(). > cookie: &raw (*(this.as_ptr().cast()).handler), > // @Benno, would this "this" work here? Yes. > irq: { > to_result(unsafe { bindings::request_irq(...) })?; > irq > } > }), > )?, > _pin: PhantomPinned > }) --- Cheers, Benno