From: "Benno Lossin" <lossin@kernel.org>
To: "Daniel Almeida" <daniel.almeida@collabora.com>,
"Peter Zijlstra" <peterz@infradead.org>,
"Ingo Molnar" <mingo@redhat.com>, "Will Deacon" <will@kernel.org>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Waiman Long" <longman@redhat.com>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <rust-for-linux@vger.kernel.org>
Subject: Re: [PATCH 3/3] rust: lock: add a Pin<&mut T> accessor
Date: Thu, 31 Jul 2025 20:52:56 +0200 [thread overview]
Message-ID: <DBQGUGG933BD.3VRM2CTO2WL3Z@kernel.org> (raw)
In-Reply-To: <20250730-lock-t-when-t-is-pinned-v1-3-1b97d5f28aa2@collabora.com>
On Wed Jul 30, 2025 at 7:14 PM CEST, Daniel Almeida wrote:
> In order for callers to be able to access the inner T safely if T: !Unpin,
> there needs to be a way to get a Pin<&mut T>. Add this accessor and a
> corresponding example to tell users how it works.
>
> This is not useful on its own for now, because we do not support pin
> projections yet. This means that the following is not going to compile:
>
> let mut data: MutexGuard<'_, Data> = mutex.lock();
> let mut data: Pin<&mut Data> = data.as_mut();
> let foo = &mut data.foo;
>
> A future patch can enable the behavior above by implementing support for
> pin projections.
I am currently working on a patch that adds pin projections to
`#[pin_data]`. It will most likely land in v6.18.
> Link: https://github.com/Rust-for-Linux/linux/issues/1181
> Suggested-by: Benno Lossin <lossin@kernel.org>
> Suggested-by: Boqun Feng <boqun.feng@gmail.com>
> Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
> ---
> rust/kernel/sync/lock.rs | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs
> index 087bc0391f92a73b9af18ca31461b513bb5a9bcd..27857659a7f1ba4a8b844bb18d009d037e0c5b03 100644
> --- a/rust/kernel/sync/lock.rs
> +++ b/rust/kernel/sync/lock.rs
> @@ -243,6 +243,25 @@ pub(crate) fn do_unlocked<U>(&mut self, cb: impl FnOnce() -> U) -> U {
>
> cb()
> }
> +
> + /// Returns a pinned mutable reference to the protected data.
> + ///
I would mention that the guard implements `DerefMut` when `T: Unpin`, so
in that case it is probably easier to use that instead of calling this
function.
> + /// # Examples
> + ///
> + /// ```
> + /// # use kernel::sync::{Mutex, MutexGuard};
> + /// # use core::pin::Pin;
> + /// struct Data;
> + ///
> + /// fn example(mutex: &Mutex<Data>) {
> + /// let mut data: MutexGuard<'_, Data> = mutex.lock();
> + /// let mut data: Pin<&mut Data> = data.as_mut();
> + /// }
No need to indent the code in the example.
---
Cheers,
Benno
> + /// ```
> + pub fn as_mut(&mut self) -> Pin<&mut T> {
> + // SAFETY: `self.lock.data` is structurally pinned.
> + unsafe { Pin::new_unchecked(&mut *self.lock.data.get()) }
> + }
> }
>
> impl<T: ?Sized, B: Backend> core::ops::Deref for Guard<'_, T, B> {
next prev parent reply other threads:[~2025-07-31 18:53 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-30 17:14 [PATCH 0/3] Groundwork for Lock<T> when T is pinned Daniel Almeida
2025-07-30 17:14 ` [PATCH 1/3] rust: lock: pin the inner data Daniel Almeida
2025-07-31 18:49 ` Benno Lossin
2025-07-30 17:14 ` [PATCH 2/3] rust: lock: guard: add T: Unpin bound to DerefMut Daniel Almeida
2025-07-30 19:32 ` Benno Lossin
2025-07-30 17:14 ` [PATCH 3/3] rust: lock: add a Pin<&mut T> accessor Daniel Almeida
2025-07-31 18:52 ` Benno Lossin [this message]
2025-08-01 9:01 ` [PATCH 0/3] Groundwork for Lock<T> when T is pinned Alice Ryhl
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=DBQGUGG933BD.3VRM2CTO2WL3Z@kernel.org \
--to=lossin@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=ojeda@kernel.org \
--cc=peterz@infradead.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
--cc=will@kernel.org \
/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.