[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3535d832-7980-4c95-a2f7-b6d90b172173@de.bosch.com>
Date: Thu, 12 Sep 2024 08:06:24 +0200
From: Dirk Behme <dirk.behme@...bosch.com>
To: Lyude Paul <lyude@...hat.com>, <rust-for-linux@...r.kernel.org>
CC: Danilo Krummrich <dakr@...hat.com>, <airlied@...hat.com>, Ingo Molnar
<mingo@...hat.com>, Will Deacon <will@...nel.org>, Waiman Long
<longman@...hat.com>, Peter Zijlstra <peterz@...radead.org>,
<linux-kernel@...r.kernel.org>, Miguel Ojeda <ojeda@...nel.org>, Alex Gaynor
<alex.gaynor@...il.com>, Wedson Almeida Filho <wedsonaf@...il.com>, "Boqun
Feng" <boqun.feng@...il.com>, Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>, Benno Lossin
<benno.lossin@...ton.me>, Andreas Hindborg <a.hindborg@...sung.com>, "Alice
Ryhl" <aliceryhl@...gle.com>, Asahi Lina <lina@...hilina.net>, Valentin Obst
<kernel@...entinobst.de>
Subject: Re: [PATCH v4 1/3] rust: Introduce irq module
On 12.09.2024 02:55, Lyude Paul wrote:
> This introduces a module for dealing with interrupt-disabled contexts,
> including the ability to enable and disable interrupts
> (with_irqs_disabled()) - along with the ability to annotate functions as
> expecting that IRQs are already disabled on the local CPU.
>
> Signed-off-by: Lyude Paul <lyude@...hat.com>
>
> ---
>
> V2:
> * Actually make it so that we check whether or not we have interrupts
> disabled with debug assertions
> * Fix issues in the documentation (added suggestions, missing periods, made
> sure that all rustdoc examples compile properly)
> * Pass IrqDisabled by value, not reference
> * Ensure that IrqDisabled is !Send and !Sync using
> PhantomData<(&'a (), *mut ())>
> * Add all of the suggested derives from Benno Lossin
>
> V3:
> * Use `impl` for FnOnce bounds in with_irqs_disabled()
> * Use higher-ranked trait bounds for the lifetime of with_irqs_disabled()
> * Wording changes in the documentation for the module itself
>
> V4:
> * Use the actual unsafe constructor for IrqDisabled in
> with_irqs_disabled()
> * Fix comment style in with_irqs_disabled example
> * Check before calling local_irq_restore() in with_irqs_disabled that
> interrupts are still disabled.
This looks correct ...
> It would have been nice to do this from a
> Drop implementation like I hoped, but I realized rust doesn't allow that
> for types that implement Copy.
> * Document that interrupts can't be re-enabled within the `cb` provided to
> `with_irqs_disabled`, and link to the github issue I just filed about
> this that describes the solution for this.
>
> Signed-off-by: Lyude Paul <lyude@...hat.com>
....
> +/// Run the closure `cb` with interrupts disabled on the local CPU.
> +///
> +/// This creates an [`IrqDisabled`] token, which can be passed to functions that must be run
> +/// without interrupts. Note that interrupts must be disabled for the entire duration of `cb`, they
> +/// cannot be re-enabled. In the future, this may be expanded on
> +/// [as documented here](https://github.com/Rust-for-Linux/linux/issues/1115).
> +///
> +/// # Examples
> +///
> +/// Using [`with_irqs_disabled`] to call a function that can only be called with interrupts
> +/// disabled:
> +///
> +/// ```
> +/// use kernel::irq::{IrqDisabled, with_irqs_disabled};
> +///
> +/// // Requiring interrupts be disabled to call a function
> +/// fn dont_interrupt_me(_irq: IrqDisabled<'_>) {
> +/// // When this token is available, IRQs are known to be disabled. Actions that rely on this
> +/// // can be safely performed
> +/// }
> +///
> +/// // Disabling interrupts. They'll be re-enabled once this closure completes.
> +/// with_irqs_disabled(|irq| dont_interrupt_me(irq));
> +/// ```
> +#[inline]
> +pub fn with_irqs_disabled<T>(cb: impl for<'a> FnOnce(IrqDisabled<'a>) -> T) -> T {
> + // SAFETY: FFI call with no special requirements
> + let flags = unsafe { bindings::local_irq_save() };
> +
> + // SAFETY: We just disabled IRQs using `local_irq_save()`
> + let ret = cb(unsafe { IrqDisabled::new() });
> +
> + // Confirm that IRQs are still enabled now that the callback has finished
... so here it should be 'disabled' instead of 'enabled'? "Confirm that
IRQs are still disabled ...".
Dirk
Powered by blists - more mailing lists