rust: sync: fix safety comment for `static_lock_class`
Benno Lossin
reviewerPATCH 1/1 rust: sync: fix safety comment for `static_lock_class`
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create LockClassKey as uninitialized memory.
---
I don't think we need to backport this.
--- rust/kernel/sync.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
rust/kernel/sync.rs +5 -2
@@ -93,8 +93,11 @@ fn drop(self: Pin<&mut Self>) {macro_rules! static_lock_class { () => {{static CLASS : $crate::sync::LockClassKey = -// SAFETY: lockdep expects uninitialized memory when it's handed a statically allocated -// lock_class_key +// Lockdep expects uninitialized memory when it's handed a statically allocated `struct +// lock_class_key`. +// +// SAFETY: `LockClassKey` transparently wraps `Opaque` which permits uninitialized +// memory. unsafe { ::core::mem::MaybeUninit ::uninit ().assume_init () }; $crate::prelude::Pin ::static_ref (&CLASS ) }};
base-commit: a5806cd506af5a7c19bcd596e4708b5c464bfd21
Signature · 1 line
2.49.0
Quoted 6 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>
Benno Lossin
reviewerQuoted 19 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>---
I don't think we need to backport this.
--- rust/kernel/sync.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)rust/kernel/sync.rs +0
-0@@ -93,8 +93,11 @@ fn drop(self: Pin<&mut Self>) {macro_rules! static_lock_class {
rust/kernel/sync.rs fn drop(self: Pin<&mut Self>) { · line 101
Quoted 10 lines
rust/kernel/sync.rs +5
-2() => {{static CLASS : $crate::sync::LockClassKey = -// SAFETY: lockdep expects uninitialized memory when it's handed a statically allocated -// lock_class_key +// Lockdep expects uninitialized memory when it's handed a statically allocated `struct +// lock_class_key`. +// +// SAFETY: `LockClassKey` transparently wraps `Opaque` which permits uninitialized +// memory. unsafe { ::core::mem::MaybeUninit ::uninit ().assume_init () };
Looking at this patch with fresh eyes (thanks for the bump, Alice :) I think we should rather have a public unsafe function on LockClassKey that creates an uninitialized lock class key. I'd like to avoid the MaybeUninit::uninit().assume_init() pattern, as it might confuse people & it looks very wrong.
We can take this patch, as it definitely is an improvement, but I think we should also just fix this properly. Any thoughts?
---
Cheers,
Benno
Quoted 4 lines
rust/kernel/sync.rs +0
-0$crate::prelude::Pin ::static_ref (&CLASS ) }};base-commit:
a5806cd506af5a7c19bcd596e4708b5c464bfd21
Alice Ryhl
maintainerQuoted 38 lines · Benno Lossin
Quoted 19 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>---
I don't think we need to backport this.
--- rust/kernel/sync.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)rust/kernel/sync.rs +0
-0@@ -93,8 +93,11 @@ fn drop(self: Pin<&mut Self>) {macro_rules! static_lock_class {rust/kernel/sync.rs fn drop(self: Pin<&mut Self>) { · line 101
Quoted 10 lines
rust/kernel/sync.rs +5
-2() => {{static CLASS : $crate::sync::LockClassKey = -// SAFETY: lockdep expects uninitialized memory when it's handed a statically allocated -// lock_class_key +// Lockdep expects uninitialized memory when it's handed a statically allocated `struct +// lock_class_key`. +// +// SAFETY: `LockClassKey` transparently wraps `Opaque` which permits uninitialized +// memory. unsafe { ::core::mem::MaybeUninit ::uninit ().assume_init () };Looking at this patch with fresh eyes (thanks for the bump, Alice :) I think we should rather have a public unsafe function on
LockClassKeythat creates an uninitialized lock class key. I'd like to avoid theMaybeUninit::uninit().assume_init()pattern, as it might confuse people & it looks very wrong.
Quoted 2 lines
We can take this patch, as it definitely is an improvement, but I think we should also just fix this properly. Any thoughts?
Could that constructor be used in non-static cases?
Alice
Benno Lossin
reviewerQuoted 38 lines · Alice Ryhl
Quoted 37 lines · Benno Lossin
Quoted 19 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>---
I don't think we need to backport this.
--- rust/kernel/sync.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)rust/kernel/sync.rs +0
-0@@ -93,8 +93,11 @@ fn drop(self: Pin<&mut Self>) {macro_rules! static_lock_class {rust/kernel/sync.rs fn drop(self: Pin<&mut Self>) { · line 101
Quoted 10 lines
rust/kernel/sync.rs +5
-2() => {{static CLASS : $crate::sync::LockClassKey = -// SAFETY: lockdep expects uninitialized memory when it's handed a statically allocated -// lock_class_key +// Lockdep expects uninitialized memory when it's handed a statically allocated `struct +// lock_class_key`. +// +// SAFETY: `LockClassKey` transparently wraps `Opaque` which permits uninitialized +// memory. unsafe { ::core::mem::MaybeUninit ::uninit ().assume_init () };Looking at this patch with fresh eyes (thanks for the bump, Alice :) I think we should rather have a public unsafe function on
LockClassKeythat creates an uninitialized lock class key. I'd like to avoid theMaybeUninit::uninit().assume_init()pattern, as it might confuse people & it looks very wrong.
Quoted 4 lines
Quoted 2 lines
We can take this patch, as it definitely is an improvement, but I think we should also just fix this properly. Any thoughts?
Could that constructor be used in non-static cases?
I don't know lockdep, so maybe yes? Or do you mean that it could be abused?
---
Cheers,
Benno
Quoted 39 lines · Benno Lossin
Quoted 38 lines · Alice Ryhl
Quoted 37 lines · Benno Lossin
Quoted 19 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>---
I don't think we need to backport this.
--- rust/kernel/sync.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)rust/kernel/sync.rs +0
-0@@ -93,8 +93,11 @@ fn drop(self: Pin<&mut Self>) {macro_rules! static_lock_class {rust/kernel/sync.rs fn drop(self: Pin<&mut Self>) { · line 101
Quoted 10 lines
rust/kernel/sync.rs +5
-2() => {{static CLASS : $crate::sync::LockClassKey = -// SAFETY: lockdep expects uninitialized memory when it's handed a statically allocated -// lock_class_key +// Lockdep expects uninitialized memory when it's handed a statically allocated `struct +// lock_class_key`. +// +// SAFETY: `LockClassKey` transparently wraps `Opaque` which permits uninitialized +// memory. unsafe { ::core::mem::MaybeUninit ::uninit ().assume_init () };Looking at this patch with fresh eyes (thanks for the bump, Alice :) I think we should rather have a public unsafe function on
LockClassKeythat creates an uninitialized lock class key. I'd like to avoid theMaybeUninit::uninit().assume_init()pattern, as it might confuse people & it looks very wrong.
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
We can take this patch, as it definitely is an improvement, but I think we should also just fix this properly. Any thoughts?
Could that constructor be used in non-static cases?
I don't know lockdep, so maybe yes? Or do you mean that it could be
Using in non-static cases is wrong. For static keys, lockdep could use it address as keys but for dynamic keys, since they can be freed, they have to be registered before use (that's what LockClassKey::new_dynamic() is about.
See this:
https://lore.kernel.org/rust-for-linux/[email protected]/
We would need to add "for static only" for the proposed unsafe function.
Regards,
Boqun
Quoted 5 lines
abused?
---
Cheers,
Benno
Benno Lossin
reviewerQuoted 52 lines · Boqun Feng
Quoted 39 lines · Benno Lossin
Quoted 38 lines · Alice Ryhl
Quoted 37 lines · Benno Lossin
Quoted 19 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>---
I don't think we need to backport this.
--- rust/kernel/sync.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)rust/kernel/sync.rs +0
-0@@ -93,8 +93,11 @@ fn drop(self: Pin<&mut Self>) {macro_rules! static_lock_class {rust/kernel/sync.rs fn drop(self: Pin<&mut Self>) { · line 101
Quoted 10 lines
rust/kernel/sync.rs +5
-2() => {{static CLASS : $crate::sync::LockClassKey = -// SAFETY: lockdep expects uninitialized memory when it's handed a statically allocated -// lock_class_key +// Lockdep expects uninitialized memory when it's handed a statically allocated `struct +// lock_class_key`. +// +// SAFETY: `LockClassKey` transparently wraps `Opaque` which permits uninitialized +// memory. unsafe { ::core::mem::MaybeUninit ::uninit ().assume_init () };Looking at this patch with fresh eyes (thanks for the bump, Alice :) I think we should rather have a public unsafe function on
LockClassKeythat creates an uninitialized lock class key. I'd like to avoid theMaybeUninit::uninit().assume_init()pattern, as it might confuse people & it looks very wrong.Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
We can take this patch, as it definitely is an improvement, but I think we should also just fix this properly. Any thoughts?
Could that constructor be used in non-static cases?
I don't know lockdep, so maybe yes? Or do you mean that it could be
Using in non-static cases is wrong. For static keys, lockdep could use it address as keys but for dynamic keys, since they can be freed, they have to be registered before use (that's what
LockClassKey::new_dynamic()is about.
Quoted 5 lines
See this:
https://lore.kernel.org/rust-for-linux/[email protected]/We would need to add "for static only" for the proposed unsafe function.
Yeah sounds good, I like it better than using the pattern above. We can also make it #[doc(hidden)], so people don't use it :)
---
Cheers,
Benno
Quoted 2 lines · Benno Lossin
We can take this patch, as it definitely is an improvement, but I think
Yeah, thanks, that was the intention -- we were checking a few older series :)
Cheers,
Miguel
Miguel Ojeda
AppliedQuoted 6 lines · Benno Lossin
The safety comment mentions lockdep -- which from a Rust perspective isn't important -- and doesn't mention the real reason for why it's sound to create
LockClassKeyas uninitialized memory.Signed-off-by Benno Lossin <[email protected]>
Applied to rust-next -- thanks everyone!
Cheers,
Miguel