[PATCH v16 16/17] rust: sync: lock/global: Add BackendInContext support to GlobalLock

Lyude Paul posted 17 patches 1 month, 3 weeks ago
There is a newer version of this series
[PATCH v16 16/17] rust: sync: lock/global: Add BackendInContext support to GlobalLock
Posted by Lyude Paul 1 month, 3 weeks ago
Now that we have the ability to provide an explicit lifetime for a
GlobalGuard and an explicit Backend for a GlobalGuard, we can finally
implement lock_with() and try_lock_with().

Signed-off-by: Lyude Paul <lyude@redhat.com>
---
 rust/kernel/sync/lock/global.rs | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/rust/kernel/sync/lock/global.rs b/rust/kernel/sync/lock/global.rs
index 64fc7e7a4b282..7aee9b25baefc 100644
--- a/rust/kernel/sync/lock/global.rs
+++ b/rust/kernel/sync/lock/global.rs
@@ -89,6 +89,34 @@ pub fn try_lock(&'static self) -> Option<GlobalGuard<'static, G, G::Backend>> {
             inner: self.inner.try_lock()?,
         })
     }
+
+    /// Lock this global lock with the provided `context`.
+    pub fn lock_with<'a, B>(
+        &'static self,
+        context: <G::Backend as Backend>::Context<'a>,
+    ) -> GlobalGuard<'a, G, B>
+    where
+        G::Backend: Backend<BackendInContext = B>,
+        B: Backend,
+    {
+        GlobalGuard {
+            inner: self.inner.lock_with(context),
+        }
+    }
+
+    /// Try to lock this global lock with the provided `context`.
+    pub fn try_lock_with<'a, B>(
+        &'static self,
+        context: <G::Backend as Backend>::Context<'a>,
+    ) -> Option<GlobalGuard<'a, G, B>>
+    where
+        G::Backend: Backend<BackendInContext = B>,
+        B: Backend,
+    {
+        Some(GlobalGuard {
+            inner: self.inner.try_lock_with(context)?,
+        })
+    }
 }
 
 /// A guard for a [`GlobalLock`].
-- 
2.52.0
Re: [PATCH v16 16/17] rust: sync: lock/global: Add BackendInContext support to GlobalLock
Posted by Benno Lossin 1 month, 2 weeks ago
On Mon Dec 15, 2025 at 6:58 PM CET, Lyude Paul wrote:
> Now that we have the ability to provide an explicit lifetime for a
> GlobalGuard and an explicit Backend for a GlobalGuard, we can finally
> implement lock_with() and try_lock_with().
>
> Signed-off-by: Lyude Paul <lyude@redhat.com>
> ---
>  rust/kernel/sync/lock/global.rs | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
>
> diff --git a/rust/kernel/sync/lock/global.rs b/rust/kernel/sync/lock/global.rs
> index 64fc7e7a4b282..7aee9b25baefc 100644
> --- a/rust/kernel/sync/lock/global.rs
> +++ b/rust/kernel/sync/lock/global.rs
> @@ -89,6 +89,34 @@ pub fn try_lock(&'static self) -> Option<GlobalGuard<'static, G, G::Backend>> {
>              inner: self.inner.try_lock()?,
>          })
>      }
> +
> +    /// Lock this global lock with the provided `context`.
> +    pub fn lock_with<'a, B>(
> +        &'static self,
> +        context: <G::Backend as Backend>::Context<'a>,
> +    ) -> GlobalGuard<'a, G, B>
> +    where
> +        G::Backend: Backend<BackendInContext = B>,
> +        B: Backend,

Since `BackendInContext` is an associated type, you don't need this type
parameter and can write instead:

    pub fn lock_with<'a>(
        &'static self,
        context: <G::Backend as Backend>::Context<'a>,
    ) -> GlobalGuard<'a, G, <G::Backend as Backend>::BackendInContext>
    where
        <G::Backend as Backend>::BackendInContext: Backend,

Cheers,
Benno

> +    {
> +        GlobalGuard {
> +            inner: self.inner.lock_with(context),
> +        }
> +    }
> +
> +    /// Try to lock this global lock with the provided `context`.
> +    pub fn try_lock_with<'a, B>(
> +        &'static self,
> +        context: <G::Backend as Backend>::Context<'a>,
> +    ) -> Option<GlobalGuard<'a, G, B>>
> +    where
> +        G::Backend: Backend<BackendInContext = B>,
> +        B: Backend,
> +    {
> +        Some(GlobalGuard {
> +            inner: self.inner.try_lock_with(context)?,
> +        })
> +    }
>  }
>  
>  /// A guard for a [`GlobalLock`].