All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boqun Feng <boqun.feng@gmail.com>
To: Benno Lossin <benno.lossin@proton.me>
Cc: "Lyude Paul" <lyude@redhat.com>,
	rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	"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>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Andreas Hindborg" <a.hindborg@samsung.com>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"FUJITA Tomonori" <fujita.tomonori@gmail.com>,
	"Aakash Sen Sharma" <aakashsensharma@gmail.com>,
	"Valentin Obst" <kernel@valentinobst.de>,
	"Thomas Gleixner" <tglx@linutronix.de>
Subject: Re: [PATCH v3 1/3] rust: Introduce irq module
Date: Wed, 14 Aug 2024 21:53:03 -0700	[thread overview]
Message-ID: <Zr2JryyeoZPn3JGC@boqun-archlinux> (raw)
In-Reply-To: <Zr0aUwTqJXOxE-ju@boqun-archlinux>

On Wed, Aug 14, 2024 at 01:57:55PM -0700, Boqun Feng wrote:
> On Wed, Aug 14, 2024 at 08:44:15PM +0000, Benno Lossin wrote:
> > On 14.08.24 22:17, Boqun Feng wrote:
> > > On Wed, Aug 14, 2024 at 03:38:47PM -0400, Lyude Paul wrote:
> > >> On Wed, 2024-08-14 at 10:35 -0700, Boqun Feng wrote:
> > >>> On Thu, Aug 01, 2024 at 08:10:00PM -0400, Lyude Paul wrote:
> > >>> [...]
> > >>>> +/// 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.
> > >>>> +///
> > >>>> +/// # 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 {
> > >>>
> > >>> Given the current signature, can `cb` return with interrupts enabled (if
> > >>> it re-enables interrupt itself)? For example:
> > >>>
> > >>> 	with_irqs_disabled(|irq_disabled| {
> > >>>
> > >>> 	    // maybe a unsafe function.
> > >>> 	    reenable_irq(irq_disabled);
> > >>
> > >> JFYI: this wouldn't be unsafe, it would be broken code in all circumstances
> > >> Simply put: `with_irqs_disabled()` does not provide the guarantee that
> > >> interrupts were enabled previously, only that they're disabled now. And it is
> > >> never a sound operation in C or Rust to ever enable interrupts without a
> > >> matching disable in the same scope because that immediately risks a deadlock
> > >> or other undefined behavior. There's no usecase for this, I'd consider any
> > >> kind of function that returns with a different interrupt state then it had
> > >> upon being called to simply be broken.
> > >>
> > >> Also - like we previously mentioned, `IrqDisabled` is just a marker type. It
> > >> doesn't enable or disable anything itself, the most it does is run a debug
> > > 
> > > Yes, I know, but my question is more that should `cb` return a
> > > `IrqDisabled` to prove the interrupt is still in the disabled state?
> > > I.e. no matter what `cb` does, the interrupt remains disabled.
> > 
> > What does this help with? I don't think this will add value (at least
> > with how `IrqDisabled` is designed at the moment).
> > 
> 
> I was trying to make sure that user shouldn't mess up with interrupt
> state in the callback function, but as you mention below, type system
> cannot help here.
> 
[...]
> > > 
> > > I haven't found a problem with `&IrqDisabled` as the closure parameter,
> > > but I may miss something.
> > 
> > We could also use `&'a IrqDisabled` instead of `IrqDisabled<'a>` (note
> > the first one doesn't have a lifetime). But there is no behavioral
> > difference between the two. Originally the intended API was to use `&'a
> > IrqDisabled<'a>` as the closure parameter and `IrqDisabled<'a>` in
> > functions that require irqs being disabled. As long as we decide on a
> > consistent type, I don't mind either (since then we can avoid
> > reborrowing).
> > 
> > > So the key ask from me is: it looks like we are on the same page that
> > > when `cb` returns, the IRQ should be in the same disabled state as when
> > > it gets called. So how do we express this "requirement" then? Type
> > > sytem, comments, safety comments?
> > 
> > I don't think that expressing this in the type system makes sense, since
> > the type that we select (`&'a IrqDisabled` or `IrqDisabled<'a>`) will be
> > `Copy`. And thus you can just produce as many of those as you want.
> > 

Hmm.. on a second thought, `Copy` doesn't affect what I'm proposing
here, yes one could have as many `IrqDisabled<'a>` as one wants, but
making `cb` returns a `(IrqDisabled<'a>, T)` means the `cb` has to prove
at least one of the `IrqDisabled<'a>` exists, i.e. it must prove the irq
is still disabled, which the requirement of `with_irqs_disabled`, right?
Or you're saying there could exist an `IrqDisabled<'a>` but the
interrupts are enabled?

Regards,
Boqun

> 
> You're right, we then probably need a doc part of the function saying
> the `cb` cannot return with interrupt enabled.
> 
> Regards,
> Boqun
> 
> > ---
> > Cheers,
> > Benno
> > 
> > 

  reply	other threads:[~2024-08-15  5:11 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-02  0:09 [PATCH v3 0/3] rust: Add irq abstraction, SpinLockIrq Lyude Paul
2024-08-02  0:10 ` [PATCH v3 1/3] rust: Introduce irq module Lyude Paul
2024-08-14 17:10   ` Boqun Feng
2024-08-14 17:35   ` Boqun Feng
2024-08-14 19:38     ` Lyude Paul
2024-08-14 20:17       ` Boqun Feng
2024-08-14 20:44         ` Benno Lossin
2024-08-14 20:57           ` Boqun Feng
2024-08-15  4:53             ` Boqun Feng [this message]
2024-08-15  6:40               ` Benno Lossin
2024-08-15 16:02                 ` Boqun Feng
2024-08-15 21:05                   ` Lyude Paul
2024-08-15 21:31                     ` Lyude Paul
2024-08-15 21:46                       ` Benno Lossin
2024-08-15 22:13                         ` Lyude Paul
2024-08-16 15:28                           ` Boqun Feng
2024-08-15 21:41                     ` Benno Lossin
2024-08-15 21:43                       ` Lyude Paul
2024-08-15 20:31         ` Lyude Paul
2024-08-15 21:48           ` Benno Lossin
2024-08-26 11:21   ` Dirk Behme
2024-08-26 14:21     ` Boqun Feng
2024-08-26 14:59       ` Dirk Behme
2024-08-26 15:34         ` Boqun Feng
2024-08-02  0:10 ` [PATCH v3 2/3] rust: sync: Introduce lock::Backend::Context Lyude Paul
2024-08-20 10:26   ` Dirk Behme
2024-08-02  0:10 ` [PATCH v3 3/3] rust: sync: Add SpinLockIrq Lyude Paul
2024-08-13 20:26 ` [PATCH v3 0/3] rust: Add irq abstraction, SpinLockIrq Lyude Paul

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=Zr2JryyeoZPn3JGC@boqun-archlinux \
    --to=boqun.feng@gmail.com \
    --cc=a.hindborg@samsung.com \
    --cc=aakashsensharma@gmail.com \
    --cc=airlied@redhat.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=dakr@redhat.com \
    --cc=fujita.tomonori@gmail.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=tglx@linutronix.de \
    --cc=wedsonaf@gmail.com \
    --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.