From: Boqun Feng <boqun.feng@gmail.com>
To: Filipe Xavier <felipe_life@live.com>
Cc: aliceryhl@google.com, ojeda@kernel.org, gary@garyguo.net,
benno.lossin@proton.me, will@kernel.org, longman@redhat.com,
rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v2] rust: add trylock method support for lock backend
Date: Tue, 24 Sep 2024 00:02:46 -0700 [thread overview]
Message-ID: <ZvJkFr6kdVx8kIMq@boqun-archlinux> (raw)
In-Reply-To: <DM4PR14MB727673292DEC9134C3FE559CE9672@DM4PR14MB7276.namprd14.prod.outlook.com>
On Sun, Sep 15, 2024 at 12:23:39PM -0300, Filipe Xavier wrote:
> Add a non-blocking trylock method to lock backend interface, mutex
> and spinlock implementations. It includes a C helper for spin_trylock.
> Rust Binder will use this method together with the new shrinker abstractions
> to avoid deadlocks in the memory shrinker.
>
Getting better, thanks! Please see below:
> Link: https://lore.kernel.org/all/20240912-shrinker-v1-1-18b7f1253553@google.com
> Signed-off-by: Filipe Xavier <felipe_life@live.com>
> ---
> rust/helpers/spinlock.c | 5 +++++
> rust/kernel/sync/lock.rs | 16 ++++++++++++++++
> rust/kernel/sync/lock/mutex.rs | 11 +++++++++++
> rust/kernel/sync/lock/spinlock.rs | 11 +++++++++++
> 4 files changed, 43 insertions(+)
>
> diff --git a/rust/helpers/spinlock.c b/rust/helpers/spinlock.c
> index acc1376b833c..775ed4d549ae 100644
> --- a/rust/helpers/spinlock.c
> +++ b/rust/helpers/spinlock.c
> @@ -22,3 +22,8 @@ void rust_helper_spin_unlock(spinlock_t *lock)
> {
> spin_unlock(lock);
> }
> +
> +int rust_helper_spin_trylock(spinlock_t *lock)
> +{
> + return spin_trylock(lock);
> +}
> diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs
> index f6c34ca4d819..f4e51a5a1f23 100644
> --- a/rust/kernel/sync/lock.rs
> +++ b/rust/kernel/sync/lock.rs
> @@ -58,6 +58,13 @@ unsafe fn init(
> #[must_use]
> unsafe fn lock(ptr: *mut Self::State) -> Self::GuardState;
>
> + /// Tries to acquire the lock without blocking.
As I suggested in v1, "without blocking" is not accurate here because
a lock can be a spinlock. So you can just remove it. I think the word
"Tries" itself implies "neither busy waiting nor blocking".
> + ///
> + /// # Safety
> + ///
> + /// Callers must ensure that [`Backend::init`] has been previously called.
> + unsafe fn try_lock(ptr: *mut Self::State) -> Option<Self::GuardState>;
> +
> /// Releases the lock, giving up its ownership.
> ///
> /// # Safety
> @@ -128,6 +135,15 @@ pub fn lock(&self) -> Guard<'_, T, B> {
> // SAFETY: The lock was just acquired.
> unsafe { Guard::new(self, state) }
> }
> +
> + /// Tries to acquire the lock and returns immediately
Please remove the "and returns immediately", as the meaning is vague: a
normal lock function also "returns immediately" after acquiring the
lock.
Otherwise, the patch looks good to me, thanks!
Regards,
Boqun
> + ///
> + /// Returns a guard that can be used to access the data protected by the lock if successful.
> + pub fn try_lock(&self) -> Option<Guard<'_, T, B>> {
> + // SAFETY: The constructor of the type calls `init`, so the existence of the object proves
> + // that `init` was called.
> + unsafe { B::try_lock(self.state.get()).map(|state| Guard::new(self, state)) }
> + }
> }
>
> /// A lock guard.
> diff --git a/rust/kernel/sync/lock/mutex.rs b/rust/kernel/sync/lock/mutex.rs
> index 30632070ee67..c4f3b6cbfe48 100644
> --- a/rust/kernel/sync/lock/mutex.rs
> +++ b/rust/kernel/sync/lock/mutex.rs
> @@ -115,4 +115,15 @@ unsafe fn unlock(ptr: *mut Self::State, _guard_state: &Self::GuardState) {
> // caller is the owner of the mutex.
> unsafe { bindings::mutex_unlock(ptr) };
> }
> +
> + unsafe fn try_lock(ptr: *mut Self::State) -> Option<Self::GuardState> {
> + // SAFETY: The `ptr` pointer is guaranteed to be valid and initialized before use.
> + let result = unsafe { bindings::mutex_trylock(ptr) };
> +
> + if result != 0 {
> + Some(())
> + } else {
> + None
> + }
> + }
> }
> diff --git a/rust/kernel/sync/lock/spinlock.rs b/rust/kernel/sync/lock/spinlock.rs
> index ea5c5bc1ce12..c900ae23db76 100644
> --- a/rust/kernel/sync/lock/spinlock.rs
> +++ b/rust/kernel/sync/lock/spinlock.rs
> @@ -114,4 +114,15 @@ unsafe fn unlock(ptr: *mut Self::State, _guard_state: &Self::GuardState) {
> // caller is the owner of the spinlock.
> unsafe { bindings::spin_unlock(ptr) }
> }
> +
> + unsafe fn try_lock(ptr: *mut Self::State) -> Option<Self::GuardState> {
> + // SAFETY: The `ptr` pointer is guaranteed to be valid and initialized before use.
> + let result = unsafe { bindings::spin_trylock(ptr) };
> +
> + if result != 0 {
> + Some(())
> + } else {
> + None
> + }
> + }
> }
> --
> 2.46.0
>
next prev parent reply other threads:[~2024-09-24 7:03 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-15 15:23 [PATCH v2] rust: add trylock method support for lock backend Filipe Xavier
2024-09-24 7:02 ` Boqun Feng [this message]
2024-09-24 18:31 ` Waiman Long
2024-09-24 22:36 ` Boqun Feng
2024-09-25 1:27 ` Waiman Long
2024-09-24 20:24 ` Gary Guo
2024-09-24 23:33 ` Boqun Feng
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=ZvJkFr6kdVx8kIMq@boqun-archlinux \
--to=boqun.feng@gmail.com \
--cc=aliceryhl@google.com \
--cc=benno.lossin@proton.me \
--cc=felipe_life@live.com \
--cc=gary@garyguo.net \
--cc=longman@redhat.com \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--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.