From: "Gary Guo" <gary@garyguo.net>
To: "Peter Zijlstra" <peterz@infradead.org>, "Gary Guo" <gary@garyguo.net>
Cc: "Boqun Feng" <boqun@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Lyude Paul" <lyude@redhat.com>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Onur Özkan" <work@onurozkan.dev>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Tamir Duberstein" <tamird@kernel.org>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Ingo Molnar" <mingo@redhat.com>, "Will Deacon" <will@kernel.org>,
"Waiman Long" <longman@redhat.com>,
linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org
Subject: Re: [PATCH RFC 0/2] rust: sync: create lock class using `#[track_caller]`
Date: Sat, 04 Jul 2026 17:52:35 +0100 [thread overview]
Message-ID: <DJPXYGA9HD3B.30I15MLPUM7DR@garyguo.net> (raw)
In-Reply-To: <20260703223242.GS751831@noisy.programming.kicks-ass.net>
On Fri Jul 3, 2026 at 11:32 PM BST, Peter Zijlstra wrote:
> On Fri, Jul 03, 2026 at 03:24:29PM +0100, Gary Guo wrote:
>> [snip] On the lockdep side,
>> essentially the name will be "(rust)", while the actual name can be retrieved
>> from the lock class key.
>>
>> So for
>>
>> let foo = KBox::pin_init(Mutex::new(42));
>>
>> in, say, foo.c:123
>>
>> it will eventually call
>>
>> struct rust_location *loc = /* static generated by the Rust compiler */;
>> mutex_init_lockdep(foo, "(rust)", (struct lock_class_key *)loc)
>>
>> And when "(rust)" is encountered as lock class name, instead of printing the
>> string as is, lockdep will call
>>
>> lockdep_print_rust_name(loc)
>>
>> which will be doing essentially
>>
>> pr_cont("foo.c:123");
>
> That seems quite terrible. The C names are based on the expression used
> to initialize the class and are thus somewhat descriptive. But file:line
> combos are horrid identifiers for locks.
>
> Why would you want to do this?
I do think this is not ideal, however the current code is already doing this.
This RFC series isn't changing the name at all, just represent this in a
different way.
The reason that file:line is used for names is due to the fundamental difference
between initialization in C and Rust. In C you create something uninitialized
first, and then initialize it, and it'll be UB if the value is used before
initialization or (for some types) initialize a value twice. In Rust we use
pin_init to ensure that a value cannot be used uninitialized.
The way the syntax is write out currently is something like
pin_init!(MyStruct {
my_mutex <- new_mutex!(initial_data),
})
[
which this series is turning it to
pin_init!(MyStruct {
my_mutex <- Mutex::new(initial_data),
})
]
as you can see the `new_mutex!` or `Mutx::new` does not know where it is going
to be initialized to, because we prevent people from being able to name a
yet-to-be-initialized place.
It is possible to use the C approach (which early days of Rust-for-Linux does
use), but doing so require a lot of unsafe keywords because you are relying on
the programmer to not mess things up, instead of having the compiler check.
So the best alternative that we can use for the name under this constraint is
the file:line combo. It is less descriptive, but at least it does tell you where
the lock class is used, so you can still trace it back. Given lockdep is a
debugging feature, I think the less descriptive name, albeit inconvenient, is
not a dealbreaker.
The trade off here is the convenience of creating a lock (safely) vs the
descriptiveness of the name, and I think the former is more important. It is
still possible to explicit give a name if it helps (Binder is actually doing
this already), but this currently cannot be implicitly created.
Best,
Gary
next prev parent reply other threads:[~2026-07-04 16:52 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-03 13:47 [PATCH RFC 0/2] rust: sync: create lock class using `#[track_caller]` Gary Guo
2026-07-03 13:47 ` [PATCH RFC 1/2] rust: sync: introduce a way to create lock class from caller Gary Guo
2026-07-03 13:47 ` [PATCH RFC 2/2] lockdep: delegate Rust lock class printing to Rust code Gary Guo
2026-07-03 14:01 ` [PATCH RFC 0/2] rust: sync: create lock class using `#[track_caller]` Peter Zijlstra
2026-07-03 14:24 ` Gary Guo
2026-07-03 22:32 ` Peter Zijlstra
2026-07-04 16:52 ` Gary Guo [this message]
2026-07-04 17:10 ` Peter Zijlstra
2026-07-04 17:46 ` Gary Guo
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=DJPXYGA9HD3B.30I15MLPUM7DR@garyguo.net \
--to=gary@garyguo.net \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=linux-kernel@vger.kernel.org \
--cc=longman@redhat.com \
--cc=lossin@kernel.org \
--cc=lyude@redhat.com \
--cc=mingo@redhat.com \
--cc=ojeda@kernel.org \
--cc=peterz@infradead.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tamird@kernel.org \
--cc=tmgross@umich.edu \
--cc=will@kernel.org \
--cc=work@onurozkan.dev \
/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