From: Andreas Hindborg <a.hindborg@kernel.org>
To: Lyude Paul <lyude@redhat.com>
Cc: "Boqun Feng" <boqun.feng@gmail.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
rust-for-linux@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>,
linux-kernel@vger.kernel.org,
"Benno Lossin" <benno.lossin@proton.me>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Gary Guo" <gary@garyguo.net>, "Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Wedson Almeida Filho" <wedsonaf@gmail.com>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@samsung.com>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Martin Rodriguez Reboredo" <yakoyoku@gmail.com>,
"Valentin Obst" <kernel@valentinobst.de>
Subject: Re: [PATCH v6 3/3] rust: sync: Add SpinLockIrq
Date: Thu, 17 Oct 2024 15:34:50 +0200 [thread overview]
Message-ID: <87a5f2svid.fsf@kernel.org> (raw)
In-Reply-To: <b33299c95e6f0031b6c4099cb1cff7d25462d687.camel@redhat.com> (Lyude Paul's message of "Wed, 16 Oct 2024 16:57:38 -0400")
Lyude Paul <lyude@redhat.com> writes:
> On Tue, 2024-10-15 at 13:21 -0700, Boqun Feng wrote:
>> On Tue, Oct 15, 2024 at 01:17:37PM -0700, Boqun Feng wrote:
>> > On Tue, Oct 15, 2024 at 02:57:11PM +0200, Andreas Hindborg wrote:
>> > > Boqun Feng <boqun.feng@gmail.com> writes:
>> > >
>> > > > On Sat, Oct 05, 2024 at 02:19:38PM -0400, Lyude Paul wrote:
>> > > > > On Fri, 2024-10-04 at 14:48 -0400, Lyude Paul wrote:
>> > > > > >
>> > > > > > FWIW: I agree we want things to map C closely wherever we can, but part of the
>> > > > > > reason of having rust in the kernel at all is to take advantage of the
>> > > > > > features it provides us that aren't in C - so there's always going to be
>> > > > > > differences in some places. This being said though, I'm more then happy to
>> > > > > > minimize those as much as possible and explore ways to figure out how to make
>> > > > > > it so that correctly using these interfaces is as obvious and not-error prone
>> > > > > > as possible. The last thing I want is to encourage bad patterns in drivers
>> > > > > > that maintainers have to deal with the headaches of for ages to come,
>> > > > > > especially when rust should be able to help with this as opposed to harm :).
>> > > > >
>> > > > > I was thinking about this a bit more today and I realized I might actually
>> > > > > have a better solution that I think would actually map a lot closer to the C
>> > > > > primitives and I feel a bit silly it didn't occur to me before.
>> > > > >
>> > > > > What if instead of with_interrupts_disabled, we extended Lock so that types
>> > > > > like SpinLockIrq that require a context like IrqDisabled can require the use
>> > > > > of two new methods:
>> > > > >
>> > > > > * first_lock<R>(&self, cb: impl for<'a> FnOnce(Guard<'a, T, B>, B::Context<'a>) -> R) -> R
>> > > >
>> > > > I think you really want to use a `&mut T` instead of `Guard<'a, T, B>`,
>> > > > otherwise people can do:
>> > > >
>> > > > let g = lock1.first_lock(|guard, _ctx| { guard });
>> > > > // here the lock is held, but the interrupts might be enabled.
>> > >
>> > > Is it impossible to limit the lifetime of the guard such that it cannot
>> > > be returned from `first_lock`?
>> > >
>> >
>> > I was wrong saying the original doesn't work, because it has a
>> > `for<'a>`, that means `'a` is lifetime of the closure, which cannot
>> > outlive the return value `R`. So this signature might be valid.
>> >
>>
>> But another problem is that with this signature, `cb` can drop the lock,
>> which is not expected, because the lock dropping should be done by
>> `first_lock` itself.
>
> I thought we agreed on switching this to &mut though? In which case dropping
> the guard doesn't really matter
I think we arrived the following over on Zulip [1]:
pub fn lock_with_new<U>(&self, cb: impl FnOnce(&mut Guard<'_, T, Backend>, IrqDisabled<'a>) -> U) -> U
Best regards,
Andreas
[1] https://rust-for-linux.zulipchat.com/#narrow/channel/288089-General/topic/Spinlocks.20with.20IRQs.3F/near/477072424
next prev parent reply other threads:[~2024-10-17 13:35 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-16 21:28 [PATCH v6 0/3] rust: Add irq abstraction, SpinLockIrq Lyude Paul
2024-09-16 21:28 ` [PATCH v6 1/3] rust: Introduce irq module Lyude Paul
2024-09-29 20:36 ` Trevor Gross
2024-09-29 23:45 ` Boqun Feng
2024-10-02 20:20 ` Thomas Gleixner
2024-10-04 8:58 ` Benno Lossin
2024-10-04 17:18 ` Lyude Paul
2024-10-17 18:51 ` Lyude Paul
2024-10-04 17:02 ` Lyude Paul
2024-10-10 21:00 ` Daniel Almeida
2024-09-16 21:28 ` [PATCH v6 2/3] rust: sync: Introduce lock::Backend::Context Lyude Paul
2024-09-29 20:40 ` Trevor Gross
2024-09-29 23:52 ` Boqun Feng
2024-09-16 21:28 ` [PATCH v6 3/3] rust: sync: Add SpinLockIrq Lyude Paul
2024-09-29 20:50 ` Trevor Gross
2024-09-29 23:59 ` Boqun Feng
2024-10-02 20:53 ` Thomas Gleixner
2024-10-03 12:51 ` Boqun Feng
2024-10-04 18:48 ` Lyude Paul
2024-10-05 18:19 ` Lyude Paul
2024-10-07 12:42 ` Boqun Feng
2024-10-07 18:13 ` Lyude Paul
2024-10-15 12:57 ` Andreas Hindborg
2024-10-15 20:17 ` Boqun Feng
2024-10-15 20:21 ` Boqun Feng
2024-10-16 20:57 ` Lyude Paul
2024-10-17 13:34 ` Andreas Hindborg [this message]
2024-10-07 12:01 ` Thomas Gleixner
2024-10-07 18:30 ` Lyude Paul
2024-10-08 15:21 ` Thomas Gleixner
2024-10-12 8:01 ` Boqun Feng
2024-10-10 16:39 ` [PATCH v6 0/3] rust: Add irq abstraction, SpinLockIrq Daniel Almeida
2024-10-12 5:29 ` Dirk Behme
2024-10-13 19:06 ` Thomas Gleixner
2024-10-13 21:43 ` Boqun Feng
2024-10-16 21:00 ` Thomas Gleixner
2024-10-16 21:31 ` Boqun Feng
2024-10-17 20:49 ` Lyude Paul
2024-10-17 22:27 ` Boqun Feng
2024-10-18 5:51 ` [POC 0/6] Allow SpinLockIrq to use a normal Guard interface Boqun Feng
2024-10-18 5:51 ` [POC 1/6] irq & spin_lock: Add counted interrupt disabling/enabling Boqun Feng
2024-10-21 7:04 ` kernel test robot
2024-10-21 7:35 ` kernel test robot
2024-10-21 20:44 ` Lyude Paul
2024-10-24 16:18 ` Peter Zijlstra
2024-10-23 19:34 ` Thomas Gleixner
2024-10-23 19:51 ` Peter Zijlstra
2024-10-23 20:38 ` Thomas Gleixner
2024-10-24 10:05 ` Peter Zijlstra
2024-10-24 17:22 ` Thomas Gleixner
2024-10-24 21:57 ` Boqun Feng
2024-10-25 15:04 ` Thomas Gleixner
2024-10-25 18:28 ` Peter Zijlstra
2024-10-24 19:12 ` Lyude Paul
2025-07-24 20:36 ` w/r/t "irq & spin_lock: Add counted interrupt disabling/enabling": holes in pcpu_hot? Lyude Paul
2025-07-24 21:59 ` Thomas Gleixner
2024-10-24 5:05 ` [POC 1/6] irq & spin_lock: Add counted interrupt disabling/enabling Boqun Feng
2024-10-24 8:17 ` Thomas Gleixner
2024-10-24 16:20 ` Boqun Feng
2024-10-18 5:51 ` [POC 2/6] rust: Introduce interrupt module Boqun Feng
2024-10-31 20:45 ` Lyude Paul
2024-10-31 20:47 ` Lyude Paul
2024-10-18 5:51 ` [POC 3/6] rust: helper: Add spin_{un,}lock_irq_{enable,disable}() helpers Boqun Feng
2024-10-18 5:51 ` [POC 4/6] rust: sync: Add SpinLockIrq Boqun Feng
2024-10-18 19:23 ` Lyude Paul
2024-10-18 20:22 ` Boqun Feng
2024-10-18 5:51 ` [POC 5/6] rust: sync: Introduce lock::Backend::Context Boqun Feng
2024-10-31 20:54 ` Lyude Paul
2024-10-18 5:51 ` [POC 6/6] rust: sync: lock: Add `Backend::BackendInContext` Boqun Feng
2024-10-18 10:22 ` [POC 0/6] Allow SpinLockIrq to use a normal Guard interface Andreas Hindborg
2024-10-18 12:42 ` Boqun Feng
2024-10-18 11:16 ` Andreas Hindborg
2024-10-18 16:05 ` Dirk Behme
2024-10-31 20:56 ` Lyude Paul
2024-10-17 20:42 ` [PATCH v6 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=87a5f2svid.fsf@kernel.org \
--to=a.hindborg@kernel.org \
--cc=a.hindborg@samsung.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=boqun.feng@gmail.com \
--cc=dakr@redhat.com \
--cc=daniel.almeida@collabora.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=tmgross@umich.edu \
--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 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.