rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Benno Lossin <benno.lossin@proton.me>
To: Lyude Paul <lyude@redhat.com>, rust-for-linux@vger.kernel.org
Cc: "Danilo Krummrich" <dakr@redhat.com>,
	airlied@redhat.com, "Ingo Molnar" <mingo@redhat.com>,
	"Will Deacon" <will@kernel.org>,
	"Waiman Long" <longman@redhat.com>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Wedson Almeida Filho" <wedsonaf@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Andreas Hindborg" <a.hindborg@samsung.com>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Martin Rodriguez Reboredo" <yakoyoku@gmail.com>,
	"Valentin Obst" <kernel@valentinobst.de>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 3/3] rust: sync: Add SpinLockIrq
Date: Thu, 01 Aug 2024 18:38:35 +0000	[thread overview]
Message-ID: <0117ba2d-75f6-4291-9108-35607aab0f1b@proton.me> (raw)
In-Reply-To: <028a84fded53be13d1b2d53e877a958f6f08c24a.camel@redhat.com>

On 01.08.24 19:10, Lyude Paul wrote:
> On Thu, 2024-08-01 at 10:29 +0000, Benno Lossin wrote:
>> On 01.08.24 00:35, Lyude Paul wrote:
>>> +unsafe impl super::Backend for SpinLockIrqBackend {
>>> +    type State = bindings::spinlock_t;
>>> +    type GuardState = ();
>>> +    type Context<'a> = IrqDisabled<'a>;
>>> +
>>> +    unsafe fn init(
>>> +        ptr: *mut Self::State,
>>> +        name: *const core::ffi::c_char,
>>> +        key: *mut bindings::lock_class_key,
>>> +    ) {
>>> +        // SAFETY: The safety requirements ensure that `ptr` is valid for writes, and `name` and
>>> +        // `key` are valid for read indefinitely.
>>> +        unsafe { bindings::__spin_lock_init(ptr, name, key) }
>>> +    }
>>> +
>>> +    unsafe fn lock(ptr: *mut Self::State) -> Self::GuardState {
>>> +        // SAFETY: The safety requirements of this function ensure that `ptr` points to valid
>>> +        // memory, and that it has been initialised before.
>>> +        unsafe { bindings::spin_lock(ptr) }
>>
>> Should this really be the same function as `SpinLock`? (ie is there not
>> a special version that expects IRQ to already be disabled? eg this could
>> add additional debug calls)
> 
> Yes, unless there's some spinlock API function I missed (I checked right
> before sending this response) we don't really have a variant of spin_lock*()
> that assumes IRQs are disabled. You really just have:
> 
> spin_lock() - Grab lock, no IRQ changes
> 
> spin_lock_irq() - Grab lock, unconditionally disable IRQs (regardless of
> current flags) until spin_unlock_irq()
> 
> spin_lock_irqsave() - Grab lock, save IRQ flags and restore upon
> spin_unlock_irqrestore()

I see, I have very limited knowledge of the C side and using the same
function for both seemed strange.

> Usually lockdep is the one to actually warn about the interrupt state being
> incorrect, as it will throw up a warning if you grab a spinlock in both an
> interrupt enabled and disabled context (which means you are forgetting to
> disable interrupts before lock acquisition somewhere).

Cool.

> As well, I think having further debug calls would be unneeded? As of right now
> there's only really two entrypoints for getting IrqDisabled:
> with_irqs_disabled(), and IrqDisabled::new(). And since IrqDisabled::new() now
> has a debug assertion for disabled interrupts, that means all paths to
> creating IrqDisabled are either already guaranteed to disable interrupts - or
> would be making use of the debug assertion for verifying interrupt state.

Yes, but if you eg call some FFI function in the meantime it might
re-enable IRQs (or just a plain old bug in the Rust side). I don't know
how expensive this will be for debug builds, if it is too much, we could
try to introduce different levels of debugging.
But as you already said above, we don't need it for `SpinLockIrq`, since
lockdep should take care of that.

---
Cheers,
Benno


  reply	other threads:[~2024-08-01 18:38 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-31 22:35 [PATCH v2 0/3] rust: Add irq abstraction, SpinLockIrq Lyude Paul
2024-07-31 22:35 ` [PATCH v2 1/3] rust: Introduce irq module Lyude Paul
2024-07-31 23:54   ` Lyude Paul
2024-08-01  9:51   ` Benno Lossin
2024-08-01 10:10     ` Benno Lossin
2024-08-01 16:44     ` Lyude Paul
2024-08-01 18:34       ` Benno Lossin
2024-08-01 18:37         ` Lyude Paul
2024-07-31 22:35 ` [PATCH v2 2/3] rust: sync: Introduce lock::Backend::Context Lyude Paul
2024-08-01 10:11   ` Benno Lossin
2024-08-01 16:52     ` Lyude Paul
2024-07-31 22:35 ` [PATCH v2 3/3] rust: sync: Add SpinLockIrq Lyude Paul
2024-08-01 10:29   ` Benno Lossin
2024-08-01 17:10     ` Lyude Paul
2024-08-01 18:38       ` Benno Lossin [this message]
2024-08-01 20:52         ` Lyude Paul
2024-08-01 21:44           ` Benno Lossin
2024-08-01  9:39 ` [PATCH v2 0/3] rust: Add irq abstraction, SpinLockIrq Benno Lossin

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=0117ba2d-75f6-4291-9108-35607aab0f1b@proton.me \
    --to=benno.lossin@proton.me \
    --cc=a.hindborg@samsung.com \
    --cc=airlied@redhat.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@redhat.com \
    --cc=gary@garyguo.net \
    --cc=kernel@valentinobst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=lyude@redhat.com \
    --cc=mingo@redhat.com \
    --cc=ojeda@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=wedsonaf@gmail.com \
    --cc=will@kernel.org \
    --cc=yakoyoku@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).