All of lore.kernel.org
 help / color / mirror / Atom feed
From: Danilo Krummrich <dakr@kernel.org>
To: Gary Guo <gary@garyguo.net>, gregkh@linuxfoundation.org
Cc: rafael@kernel.org, bhelgaas@google.com, ojeda@kernel.org,
	alex.gaynor@gmail.com, boqun.feng@gmail.com,
	bjorn3_gh@protonmail.com, benno.lossin@proton.me,
	tmgross@umich.edu, a.hindborg@samsung.com, aliceryhl@google.com,
	airlied@gmail.com, fujita.tomonori@gmail.com, lina@asahilina.net,
	pstanner@redhat.com, ajanulgu@redhat.com, lyude@redhat.com,
	robh@kernel.org, daniel.almeida@collabora.com,
	saravanak@google.com, dirk.behme@de.bosch.com, j@jannau.net,
	fabien.parent@linaro.org, chrisi.schrefl@gmail.com,
	paulmck@kernel.org, rust-for-linux@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
	devicetree@vger.kernel.org, rcu@vger.kernel.org
Subject: Re: [PATCH v7 08/16] rust: add devres abstraction
Date: Wed, 15 Jan 2025 07:41:54 +0100	[thread overview]
Message-ID: <Z4dYsoKrbP4_Nz_v@pollux> (raw)
In-Reply-To: <Z4aR4OrCQMoF6Boo@pollux>

On Tue, Jan 14, 2025 at 05:33:45PM +0100, Danilo Krummrich wrote:
> > > +impl<T> Drop for Devres<T> {
> > > +    fn drop(&mut self) {
> > > +        // Revoke the data, such that it gets dropped already and the actual resource is freed.
> > > +        //
> > > +        // `DevresInner` has to stay alive until the devres callback has been called. This is
> > > +        // necessary since we don't know when `Devres` is dropped and calling
> > > +        // `devm_remove_action()` instead could race with `devres_release_all()`.
> > 
> > IIUC, the outcome of that race is the `WARN` if
> > devres_release_all takes the spinlock first and has already remvoed the
> > action?
> > 
> > Could you do a custom devres_release here that mimick
> > `devm_remove_action` but omit the `WARN`? This way it allows the memory
> > behind DevresInner to be freed early without keeping it allocated until
> > the end of device lifetime.
> 
> Better late than never, I now remember what's the *actual* race I was preventing
> here:
> 
>   | Task 0                               | Task 1
> --|----------------------------------------------------------------------------
> 1 | Devres::drop() {                     | devres_release_all() {
> 2 |    DevresInner::remove_action() {    |    spin_lock_irqsave();
> 3 |                                      |    remove_nodes(&todo);
> 4 |                                      |    spin_unlock_irqrestore();
> 5 |       devm_remove_action_nowarn();   |
> 6 |       let _ = Arc::from_raw();       |
> 7 |    }                                 |
> 8 | }                                    |
> 9 |                                      |    release_nodes(&todo);
> 10|                                      | }
> 
> So, if devres_release_all() wins the race it stores the devres action within the
> temporary todo list. Which means that in 9 we enter
> DevresInner::devres_callback() even though DevresInner has been freed already.
> 
> Unfortunately, this race can happen with [1], but not with this original version
> of Devres.

Well, actually this can't happen, since obviously we know whether Devres:drop
removed it or whether it will be released by devres_release_all() and we only
free DevresInner conditionally.

So, the code in [1] is fine; I somehow managed to confuse myself.

Sorry for the noise.

- Danilo

> 
> I see two ways to fix it:
> 
> 1) Just revert [1] and stick with the original version.
> 
> 2) Use devm_release_action() instead of devm_remove_action() and don't drop the
>    reference in DevresInner::remove_action() (6). This way the reference is
>    always dropped from the callback.
> 
> With 2) we still have an unnecessary call to revoke() if Devres is dropped
> before the device is detached from the driver, but that's still better than
> keeping DevresInner alive until the device is detached from the driver, which
> the original version did. Hence, I'll go ahead and prepare a patch for this,
> unless there are any concerns.
> 
> - Danilo
> 
> [1] https://lore.kernel.org/rust-for-linux/20250107122609.8135-2-dakr@kernel.org/

  reply	other threads:[~2025-01-15  6:42 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-19 17:04 [PATCH v7 00/16] Device / Driver PCI / Platform Rust abstractions Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 01/16] rust: module: add trait `ModuleMetadata` Danilo Krummrich
2024-12-24 20:51   ` Gary Guo
2024-12-19 17:04 ` [PATCH v7 02/16] rust: implement generic driver registration Danilo Krummrich
2024-12-24 19:58   ` Gary Guo
2025-01-02  9:34     ` Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 03/16] rust: implement `IdArray`, `IdTable` and `RawDeviceId` Danilo Krummrich
2024-12-24 20:10   ` Gary Guo
2025-01-02  9:36     ` Danilo Krummrich
2025-03-15 16:52   ` Tamir Duberstein
2025-03-15 16:59     ` Danilo Krummrich
2025-03-15 17:31       ` Tamir Duberstein
2024-12-19 17:04 ` [PATCH v7 04/16] rust: add rcu abstraction Danilo Krummrich
2024-12-24 20:54   ` Gary Guo
2025-01-02  9:44     ` Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 05/16] rust: types: add `Opaque::pin_init` Danilo Krummrich
2024-12-24 20:21   ` Gary Guo
2024-12-19 17:04 ` [PATCH v7 06/16] rust: add `Revocable` type Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 07/16] rust: add `io::{Io, IoRaw}` base types Danilo Krummrich
2025-01-16 10:31   ` Fiona Behrens
2025-01-20 12:54     ` Danilo Krummrich
2025-02-21  1:20   ` Alistair Popple
2025-02-21  3:58     ` Miguel Ojeda
2025-02-25  5:50       ` Alistair Popple
2025-02-25 11:04         ` Danilo Krummrich
2025-02-27  0:25           ` Alistair Popple
2025-02-27 10:01             ` Danilo Krummrich
2025-02-28  5:29               ` Alistair Popple
2025-02-28 10:12                 ` Danilo Krummrich
2025-02-28 10:22                 ` Miguel Ojeda
2025-02-27 16:06             ` Miguel Ojeda
2024-12-19 17:04 ` [PATCH v7 08/16] rust: add devres abstraction Danilo Krummrich
2024-12-24 21:53   ` Gary Guo
2025-01-02 10:30     ` Danilo Krummrich
2025-01-02 15:59       ` Danilo Krummrich
2025-01-14 16:33     ` Danilo Krummrich
2025-01-15  6:41       ` Danilo Krummrich [this message]
2024-12-19 17:04 ` [PATCH v7 09/16] rust: pci: add basic PCI device / driver abstractions Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 10/16] rust: pci: implement I/O mappable `pci::Bar` Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 11/16] samples: rust: add Rust PCI sample driver Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 12/16] rust: of: add `of::DeviceId` abstraction Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 13/16] rust: driver: implement `Adapter` Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 14/16] rust: platform: add basic platform device / driver abstractions Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 15/16] samples: rust: add Rust platform sample driver Danilo Krummrich
2024-12-19 17:04 ` [PATCH v7 16/16] MAINTAINERS: add Danilo to DRIVER CORE Danilo Krummrich
2024-12-20  7:24 ` [PATCH v7 00/16] Device / Driver PCI / Platform Rust abstractions Dirk Behme
2024-12-20 16:44 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z4dYsoKrbP4_Nz_v@pollux \
    --to=dakr@kernel.org \
    --cc=a.hindborg@samsung.com \
    --cc=airlied@gmail.com \
    --cc=ajanulgu@redhat.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bhelgaas@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=chrisi.schrefl@gmail.com \
    --cc=daniel.almeida@collabora.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dirk.behme@de.bosch.com \
    --cc=fabien.parent@linaro.org \
    --cc=fujita.tomonori@gmail.com \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=j@jannau.net \
    --cc=lina@asahilina.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lyude@redhat.com \
    --cc=ojeda@kernel.org \
    --cc=paulmck@kernel.org \
    --cc=pstanner@redhat.com \
    --cc=rafael@kernel.org \
    --cc=rcu@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=saravanak@google.com \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.