From: Wedson Almeida Filho <wedsonaf@gmail.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: rust-for-linux@vger.kernel.org, "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>,
"Ingo Molnar" <mingo@redhat.com>, "Will Deacon" <will@kernel.org>,
"Waiman Long" <longman@redhat.com>
Subject: Re: [PATCH 12/13] rust: sync: introduce `CondVar`
Date: Mon, 3 Apr 2023 10:35:58 -0300 [thread overview]
Message-ID: <ZCrWPiqfAxsBNL+W@wedsonaf-dev> (raw)
In-Reply-To: <20230403085959.GS4253@hirez.programming.kicks-ass.net>
On Mon, Apr 03, 2023 at 10:59:59AM +0200, Peter Zijlstra wrote:
> On Thu, Mar 30, 2023 at 11:56:33AM -0300, Wedson Almeida Filho wrote:
> > On Thu, Mar 30, 2023 at 02:59:27PM +0200, Peter Zijlstra wrote:
> > > On Thu, Mar 30, 2023 at 01:39:53AM -0300, Wedson Almeida Filho wrote:
> > >
> > > > + fn wait_internal<T: ?Sized, B: Backend>(&self, wait_state: u32, guard: &mut Guard<'_, T, B>) {
> > > > + let wait = Opaque::<bindings::wait_queue_entry>::uninit();
> > > > +
> > > > + // SAFETY: `wait` points to valid memory.
> > > > + unsafe { bindings::init_wait(wait.get()) };
> > > > +
> > > > + // SAFETY: Both `wait` and `wait_list` point to valid memory.
> > > > + unsafe {
> > > > + bindings::prepare_to_wait_exclusive(self.wait_list.get(), wait.get(), wait_state as _)
> > > > + };
> > >
> > > I can't read this rust gunk, but where is the condition test gone?
> > >
> > > Also, where is the loop gone to?
> >
> > They're both at the caller. The usage of condition variables is something like:
> >
> > while guard.value != v {
> > condvar.wait_uninterruptible(&mut guard);
> > }
> >
> > (Note that this is not specific to the kernel or to Rust: this is how condvars
> > work in general. You'll find this in any textbook on the topic.)
> >
> > In the implementation of wait_internal(), we add the local wait entry to the
> > wait queue _before_ releasing the lock (i.e., before the test result can
> > change), so we guarantee that we don't miss wake up attempts.
>
> Ah, so you've not yet been exposed to the wonderful 'feature' where
> pthread_cond_timedwait() gets called with .mutex=NULL and people expect
> things to just work :/ (luckily not accepted by the majority of
> implementations)
Rust doesn't have this problem: a `Guard` cannot exist without a lock, and one
cannot call `wait` or `wait_uninterruptible` without a `Guard`.
> Or a little more devious, calling signal and not holding the same mutex.
We don't require that callers hold the lock while singaling. If they signal when
the condition isn't satisfied (with or without the lock held, it doesn't
matter), it will just look like a spurious signal to the waiting thread.
> I just got alarm bells going off because I see prepare_to_wait without an
> obvious loop around it.
Fair enough, we do need a loop.
next prev parent reply other threads:[~2023-04-03 13:36 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-30 4:39 [PATCH 01/13] rust: sync: introduce `LockClassKey` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 02/13] rust: sync: introduce `Lock` and `Guard` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 03/13] rust: lock: introduce `Mutex` Wedson Almeida Filho
2023-03-30 13:01 ` Peter Zijlstra
2023-03-30 18:47 ` Boqun Feng
2023-03-30 18:51 ` [DRAFT 1/2] locking/selftest: Add test infrastructure for Rust locking APIs Boqun Feng
2023-03-30 18:51 ` [DRAFT 2/2] locking/selftest: Add AA deadlock selftest for Mutex and SpinLock Boqun Feng
2023-03-30 18:56 ` [PATCH 03/13] rust: lock: introduce `Mutex` Boqun Feng
2023-04-03 8:20 ` Peter Zijlstra
2023-04-03 13:50 ` Wedson Almeida Filho
2023-04-03 15:25 ` Gary Guo
2023-04-03 15:44 ` Boqun Feng
2023-04-03 14:04 ` Boqun Feng
2023-03-30 4:39 ` [PATCH 04/13] locking/spinlock: introduce spin_lock_init_with_key Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 05/13] rust: lock: introduce `SpinLock` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 06/13] rust: lock: add support for `Lock::lock_irqsave` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 07/13] rust: lock: implement `IrqSaveBackend` for `SpinLock` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 08/13] rust: introduce `ARef` Wedson Almeida Filho
2023-03-30 14:17 ` Gary Guo
2023-03-30 4:39 ` [PATCH 09/13] rust: add basic `Task` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 10/13] rust: introduce `Task::current` Wedson Almeida Filho
2023-03-31 2:47 ` Gary Guo
2023-03-31 7:32 ` Alice Ryhl
2023-04-01 4:09 ` Wedson Almeida Filho
2023-04-01 7:01 ` Gary Guo
2023-03-30 4:39 ` [PATCH 11/13] rust: lock: add `Guard::do_unlocked` Wedson Almeida Filho
2023-03-30 4:39 ` [PATCH 12/13] rust: sync: introduce `CondVar` Wedson Almeida Filho
2023-03-30 12:52 ` Peter Zijlstra
2023-03-30 14:43 ` Wedson Almeida Filho
2023-03-30 12:59 ` Peter Zijlstra
2023-03-30 14:56 ` Wedson Almeida Filho
2023-04-03 8:59 ` Peter Zijlstra
2023-04-03 13:35 ` Wedson Almeida Filho [this message]
2023-03-30 4:39 ` [PATCH 13/13] rust: sync: introduce `LockedBy` Wedson Almeida Filho
2023-03-30 11:28 ` Benno Lossin
2023-03-30 11:45 ` Benno Lossin
2023-03-30 21:04 ` Wedson Almeida Filho
2023-03-30 21:10 ` Benno Lossin
2023-03-30 20:44 ` Wedson Almeida Filho
2023-03-30 11:10 ` [PATCH 01/13] rust: sync: introduce `LockClassKey` Gary Guo
2023-03-31 7:28 ` Alice Ryhl
2023-04-05 17:42 ` Wedson Almeida Filho
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=ZCrWPiqfAxsBNL+W@wedsonaf-dev \
--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=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=ojeda@kernel.org \
--cc=peterz@infradead.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=walmeida@microsoft.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 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).