Re: [PATCH v3 1/2] rust: irq: add support for request_irq()

From: Alice Ryhl
Date: Tue Jun 03 2025 - 05:19:13 EST


On Tue, Jun 3, 2025 at 11:10 AM Danilo Krummrich <dakr@xxxxxxxxxx> wrote:
>
> On Tue, Jun 03, 2025 at 08:54:56AM +0000, Alice Ryhl wrote:
> > On Tue, Jun 03, 2025 at 10:46:28AM +0200, Danilo Krummrich wrote:
> > > On Tue, Jun 03, 2025 at 08:28:42AM +0000, Alice Ryhl wrote:
> > > > That optimization sounds like something we definitely want, but I have
> > > > one question: is free_irq() safe to use in atomic context / inside
> > > > rcu_read_lock()? What about the threaded-irq variant?
> > >
> > > No, free_irq() must not be called from atomic context. Hence, it's not valid to
> > > call it from within an RCU read-side critical section.
> > >
> > > I assume you're confusing something, free_irq() is called from the destructor of
> > > the irq::Registration object, hence it is either called when the object itself
> > > is dropped or from the devres callback, which is called after the
> > > synchronize_rcu(), but not from an RCU read-side critical section.
> >
> > Ok hold on ... I guess the issue I thought was there manifests itself in
> > another way. What about this situation?
> >
> > Thread 1 Thread 2
> > device removal starts
> > Drop for Devres starts running
> > devm_remove_action() = 0
> > device is fully unbound
> > free_irq()
> >
> > Now the call to free_irq() happens too late, because there's nothing in
> > the devm callback stack to wait for it.
>
> This is indeed a flaw in the Devres implementation.
>
> In my initial implementation I even thought of this, but then obviously forgot
> about it and introduced this bug in commit 8ff656643d30 ("rust: devres: remove
> action in `Devres::drop`").
>
> In order to fix this, we should just revert this commit -- thanks for catching
> this!

I don't think that helps. If Devres::drop gets to swap is_available
before the devm callback performs the swap, then the devm callback is
just a no-op and the device still doesn't wait for free_irq() to
finish running.

Alice