[PATCH] rust: devres: initialize Devres::inner::data last

Danilo Krummrich posted 1 patch 2 months, 3 weeks ago
rust/kernel/devres.rs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
[PATCH] rust: devres: initialize Devres::inner::data last
Posted by Danilo Krummrich 2 months, 3 weeks ago
Users may want to access the Devres object from callbacks registered
through the initialization of Devres::inner::data.

For those accesses to be valid, Devres::inner::data must be initialized
last [1].

Credit to Boqun for spotting this [2].

Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1]
Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
---
 rust/kernel/devres.rs | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/rust/kernel/devres.rs b/rust/kernel/devres.rs
index a8a2d24cac24..152a89b78943 100644
--- a/rust/kernel/devres.rs
+++ b/rust/kernel/devres.rs
@@ -137,14 +137,10 @@ pub fn new<'a, E>(
         let callback = Self::devres_callback;
 
         try_pin_init!(&this in Self {
-            // INVARIANT: `inner` is properly initialized.
-            inner <- Opaque::pin_init(try_pin_init!(Inner {
-                data <- Revocable::new(data),
-                devm <- Completion::new(),
-                revoke <- Completion::new(),
-            })),
+            dev: dev.into(),
             callback,
-            dev: {
+            // INVARIANT: `inner` is properly initialized.
+            inner <- {
                 // SAFETY: `this` is a valid pointer to uninitialized memory.
                 let inner = unsafe { &raw mut (*this.as_ptr()).inner };
 
@@ -158,7 +154,11 @@ pub fn new<'a, E>(
                     bindings::devm_add_action(dev.as_raw(), Some(callback), inner.cast())
                 })?;
 
-                dev.into()
+                Opaque::pin_init(try_pin_init!(Inner {
+                    devm <- Completion::new(),
+                    revoke <- Completion::new(),
+                    data <- Revocable::new(data),
+                }))
             },
         })
     }

base-commit: 3964d07dd821efe9680e90c51c86661a98e60a0f
prerequisite-patch-id: 12a88f7c46bec668e4f71ec0d94b1782d9446d0b
-- 
2.50.0
Re: [PATCH] rust: devres: initialize Devres::inner::data last
Posted by Danilo Krummrich 2 months, 3 weeks ago
On Mon Jul 14, 2025 at 1:32 PM CEST, Danilo Krummrich wrote:
> Users may want to access the Devres object from callbacks registered
> through the initialization of Devres::inner::data.
>
> For those accesses to be valid, Devres::inner::data must be initialized
> last [1].
>
> Credit to Boqun for spotting this [2].
>
> Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1]
> Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2]
> Signed-off-by: Danilo Krummrich <dakr@kernel.org>

Applied to driver-core-testing, thanks!
Re: [PATCH] rust: devres: initialize Devres::inner::data last
Posted by Alice Ryhl 2 months, 3 weeks ago
On Mon, Jul 14, 2025 at 01:32:35PM +0200, Danilo Krummrich wrote:
> Users may want to access the Devres object from callbacks registered
> through the initialization of Devres::inner::data.
> 
> For those accesses to be valid, Devres::inner::data must be initialized
> last [1].
> 
> Credit to Boqun for spotting this [2].
> 
> Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1]
> Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2]
> Signed-off-by: Danilo Krummrich <dakr@kernel.org>
> ---
> base-commit: 3964d07dd821efe9680e90c51c86661a98e60a0f

I couldn't find this commit. Where does this apply?

Alice
Re: [PATCH] rust: devres: initialize Devres::inner::data last
Posted by Danilo Krummrich 2 months, 3 weeks ago
On Tue Jul 15, 2025 at 9:24 AM CEST, Alice Ryhl wrote:
> On Mon, Jul 14, 2025 at 01:32:35PM +0200, Danilo Krummrich wrote:
>> Users may want to access the Devres object from callbacks registered
>> through the initialization of Devres::inner::data.
>> 
>> For those accesses to be valid, Devres::inner::data must be initialized
>> last [1].
>> 
>> Credit to Boqun for spotting this [2].
>> 
>> Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1]
>> Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2]
>> Signed-off-by: Danilo Krummrich <dakr@kernel.org>
>> ---
>> base-commit: 3964d07dd821efe9680e90c51c86661a98e60a0f
>
> I couldn't find this commit. Where does this apply?

The commit is in driver-core-next.
Re: [PATCH] rust: devres: initialize Devres::inner::data last
Posted by Alice Ryhl 2 months, 3 weeks ago
On Tue, Jul 15, 2025 at 10:22 AM Danilo Krummrich <dakr@kernel.org> wrote:
>
> On Tue Jul 15, 2025 at 9:24 AM CEST, Alice Ryhl wrote:
> > On Mon, Jul 14, 2025 at 01:32:35PM +0200, Danilo Krummrich wrote:
> >> Users may want to access the Devres object from callbacks registered
> >> through the initialization of Devres::inner::data.
> >>
> >> For those accesses to be valid, Devres::inner::data must be initialized
> >> last [1].
> >>
> >> Credit to Boqun for spotting this [2].
> >>
> >> Link: https://lore.kernel.org/lkml/DBBPHO26CPBS.2OVI1OERCB2J5@kernel.org/ [1]
> >> Link: https://lore.kernel.org/lkml/aHSmxWeIy3L-AKIV@Mac.home/ [2]
> >> Signed-off-by: Danilo Krummrich <dakr@kernel.org>
> >> ---
> >> base-commit: 3964d07dd821efe9680e90c51c86661a98e60a0f
> >
> > I couldn't find this commit. Where does this apply?
>
> The commit is in driver-core-next.

Reviewed-by: Alice Ryhl <aliceryhl@google.com>