diff options
| author | Nathan Chancellor <nathan@kernel.org> | 2025-09-19 13:43:11 -0700 | 
|---|---|---|
| committer | Nathan Chancellor <nathan@kernel.org> | 2025-09-19 13:43:11 -0700 | 
| commit | 95ee3364b29313a7587b7d1e42a9d043aaf7e592 (patch) | |
| tree | cefa28373f4ee2c696925a0d68363987150bc8c6 /rust/kernel/devres.rs | |
| parent | aa943a280e88e3585ed5a06d55e78c4123fcead3 (diff) | |
| parent | f83ec76bf285bea5727f478a68b894f5543ca76e (diff) | |
Merge 6.17-rc6 into kbuild-next
Commit bd7c2312128e ("pinctrl: meson: Fix typo in device table macro")
is needed in kbuild-next to avoid a build error with a future change.
While at it, address the conflict between commit 41f9049cff32 ("riscv:
Only allow LTO with CMODEL_MEDANY") and commit 6578a1ff6aa4 ("riscv:
Remove version check for LTO_CLANG selects"), as reported by Stephen
Rothwell [1].
Link: https://lore.kernel.org/20250908134913.68778b7b@canb.auug.org.au/ [1]
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Diffstat (limited to 'rust/kernel/devres.rs')
| -rw-r--r-- | rust/kernel/devres.rs | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/rust/kernel/devres.rs b/rust/kernel/devres.rs index da18091143a6..d04e3fcebafb 100644 --- a/rust/kernel/devres.rs +++ b/rust/kernel/devres.rs @@ -115,10 +115,11 @@ pub struct Devres<T: Send> {      /// Contains all the fields shared with [`Self::callback`].      // TODO: Replace with `UnsafePinned`, once available.      // -    // Subsequently, the `drop_in_place()` in `Devres::drop` and the explicit `Send` and `Sync' -    // impls can be removed. +    // Subsequently, the `drop_in_place()` in `Devres::drop` and `Devres::new` as well as the +    // explicit `Send` and `Sync' impls can be removed.      #[pin]      inner: Opaque<Inner<T>>, +    _add_action: (),  }  impl<T: Send> Devres<T> { @@ -140,7 +141,15 @@ impl<T: Send> Devres<T> {              dev: dev.into(),              callback,              // INVARIANT: `inner` is properly initialized. -            inner <- { +            inner <- Opaque::pin_init(try_pin_init!(Inner { +                    devm <- Completion::new(), +                    revoke <- Completion::new(), +                    data <- Revocable::new(data), +            })), +            // TODO: Replace with "initializer code blocks" [1] once available. +            // +            // [1] https://github.com/Rust-for-Linux/pin-init/pull/69 +            _add_action: {                  // SAFETY: `this` is a valid pointer to uninitialized memory.                  let inner = unsafe { &raw mut (*this.as_ptr()).inner }; @@ -152,13 +161,13 @@ impl<T: Send> Devres<T> {                  //    live at least as long as the returned `impl PinInit<Self, Error>`.                  to_result(unsafe {                      bindings::devm_add_action(dev.as_raw(), Some(callback), inner.cast()) -                })?; +                }).inspect_err(|_| { +                    let inner = Opaque::cast_into(inner); -                Opaque::pin_init(try_pin_init!(Inner { -                    devm <- Completion::new(), -                    revoke <- Completion::new(), -                    data <- Revocable::new(data), -                })) +                    // SAFETY: `inner` is a valid pointer to an `Inner<T>` and valid for both reads +                    // and writes. +                    unsafe { core::ptr::drop_in_place(inner) }; +                })?;              },          })      }  | 
