All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wedson Almeida Filho <wedsonaf@gmail.com>
To: rust-for-linux@vger.kernel.org
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	linux-kernel@vger.kernel.org,
	"Wedson Almeida Filho" <walmeida@microsoft.com>
Subject: [PATCH v2 06/13] rust: lock: add support for `Lock::lock_irqsave`
Date: Wed,  5 Apr 2023 14:51:04 -0300	[thread overview]
Message-ID: <20230405175111.5974-6-wedsonaf@gmail.com> (raw)
In-Reply-To: <20230405175111.5974-1-wedsonaf@gmail.com>

From: Wedson Almeida Filho <walmeida@microsoft.com>

This allows locks like spinlocks and raw spinlocks to expose a
`lock_irqsave` variant in Rust that corresponds to the C version.

Signed-off-by: Wedson Almeida Filho <walmeida@microsoft.com>
---
v1 -> v2: No changes

 rust/kernel/sync/lock.rs | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs
index bca9af2a9a5a..491446c3a074 100644
--- a/rust/kernel/sync/lock.rs
+++ b/rust/kernel/sync/lock.rs
@@ -57,6 +57,29 @@ pub unsafe trait Backend {
     unsafe fn unlock(ptr: *mut Self::State, guard_state: &Self::GuardState);
 }
 
+/// The "backend" of a lock that supports the irq-save variant.
+///
+/// # Safety
+///
+/// The same requirements wrt mutual exclusion in [`Backend`] apply for acquiring the lock via
+/// [`IrqSaveBackend::lock_irqsave`].
+///
+/// Additionally, when [`IrqSaveBackend::lock_irqsave`] is used to acquire the lock, implementers
+/// must disable interrupts on lock, and restore interrupt state on unlock. Implementers may use
+/// [`Backend::GuardState`] to store state needed to keep track of the interrupt state.
+pub unsafe trait IrqSaveBackend: Backend {
+    /// Acquires the lock, making the caller its owner.
+    ///
+    /// Before acquiring the lock, it disables interrupts, and returns the previous interrupt state
+    /// as its guard state so that the guard can restore it when it is dropped.
+    ///
+    /// # Safety
+    ///
+    /// Callers must ensure that [`Backend::init`] has been previously called.
+    #[must_use]
+    unsafe fn lock_irqsave(ptr: *mut Self::State) -> Self::GuardState;
+}
+
 /// A mutual exclusion primitive.
 ///
 /// Exposes one of the kernel locking primitives. Which one is exposed depends on the lock banckend
@@ -109,6 +132,21 @@ impl<T: ?Sized, B: Backend> Lock<T, B> {
     }
 }
 
+impl<T: ?Sized, B: IrqSaveBackend> Lock<T, B> {
+    /// Acquires the lock and gives the caller access to the data protected by it.
+    ///
+    /// Before acquiring the lock, it disables interrupts. When the guard is dropped, the interrupt
+    /// state (either enabled or disabled) is restored to its state before
+    /// [`lock_irqsave`](Self::lock_irqsave) was called.
+    pub fn lock_irqsave(&self) -> Guard<'_, T, B> {
+        // SAFETY: The constructor of the type calls `init`, so the existence of the object proves
+        // that `init` was called.
+        let state = unsafe { B::lock_irqsave(self.state.get()) };
+        // SAFETY: The lock was just acquired.
+        unsafe { Guard::new(self, state) }
+    }
+}
+
 /// A lock guard.
 ///
 /// Allows mutual exclusion primitives that implement the `Backend` trait to automatically unlock
-- 
2.34.1


  parent reply	other threads:[~2023-04-05 17:52 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-05 17:50 [PATCH v2 01/13] rust: sync: introduce `LockClassKey` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 02/13] rust: sync: introduce `Lock` and `Guard` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 03/13] rust: lock: introduce `Mutex` Wedson Almeida Filho
2023-04-05 18:03   ` Greg KH
2023-04-05 18:04     ` Greg KH
2023-04-05 19:18       ` Peter Zijlstra
2023-04-05 20:21         ` Wedson Almeida Filho
2023-04-05 20:29           ` Peter Zijlstra
2023-04-05 20:40             ` Wedson Almeida Filho
2023-04-05 20:49               ` Peter Zijlstra
2023-04-06  8:38                 ` David Laight
2023-04-06 11:21                   ` Marco Elver
2023-04-06 16:25                     ` Miguel Ojeda
2023-04-06 16:45                 ` Miguel Ojeda
2023-04-05 17:51 ` [PATCH v2 04/13] locking/spinlock: introduce spin_lock_init_with_key Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 05/13] rust: lock: introduce `SpinLock` Wedson Almeida Filho
2023-04-05 17:51 ` Wedson Almeida Filho [this message]
2023-04-05 17:51 ` [PATCH v2 07/13] rust: lock: implement `IrqSaveBackend` for `SpinLock` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 08/13] rust: introduce `ARef` Wedson Almeida Filho
2023-04-07 21:59   ` Benno Lossin
2023-04-08  4:28     ` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 09/13] rust: add basic `Task` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 10/13] rust: introduce `current` Wedson Almeida Filho
2023-04-07 22:36   ` Benno Lossin
2023-04-08  3:54     ` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 11/13] rust: lock: add `Guard::do_unlocked` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 12/13] rust: sync: introduce `CondVar` Wedson Almeida Filho
2023-04-05 17:51 ` [PATCH v2 13/13] rust: sync: introduce `LockedBy` Wedson Almeida Filho
2023-04-07 21:00   ` Benno Lossin
2023-04-08  4:11     ` Wedson Almeida Filho
2023-04-08  7:52       ` Benno Lossin
2023-04-05 18:00 ` [PATCH v2 01/13] rust: sync: introduce `LockClassKey` Greg KH
2023-04-05 20:05   ` Wedson Almeida Filho
2023-04-05 20:21 ` Gary Guo

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=20230405175111.5974-6-wedsonaf@gmail.com \
    --to=wedsonaf@gmail.com \
    --cc=alex.gaynor@gmail.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=gary@garyguo.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=walmeida@microsoft.com \
    /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.