* [PATCH v2 0/4] Update thread safety markers
@ 2023-05-23 14:44 Alice Ryhl
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
` (3 more replies)
0 siblings, 4 replies; 17+ messages in thread
From: Alice Ryhl @ 2023-05-23 14:44 UTC (permalink / raw)
To: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Alice Ryhl, Ingo Molnar, Peter Zijlstra, Will Deacon,
Mark Rutland, rust-for-linux, linux-kernel, patches
In Rust, the `Send` and `Sync` traits are used to mark in what ways a
specific type is thread safe. In this patch series, I add some missing
thread safety markers and improve the documentation related to them.
This change will let you compile some code that would currently fail to
compile even though it doesn't actually violate any thread safety rules.
You can find a definition of what these marker traits mean at [1].
[1]: https://stackoverflow.com/a/68708557/1704411
Alice Ryhl (4):
rust: sync: reword the `Arc` safety comment for `Send`
rust: sync: reword the `Arc` safety comment for `Sync`
rust: specify when `ARef` is thread safe
rust: task: add `Send` marker to `Task`
rust/kernel/sync/arc.rs | 12 +++++++-----
rust/kernel/task.rs | 10 ++++++++--
rust/kernel/types.rs | 13 +++++++++++++
3 files changed, 28 insertions(+), 7 deletions(-)
base-commit: ac9a78681b921877518763ba0e89202254349d1b
--
2.40.1.698.g37aff9b760-goog
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send`
2023-05-23 14:44 [PATCH v2 0/4] Update thread safety markers Alice Ryhl
@ 2023-05-23 14:44 ` Alice Ryhl
2023-05-23 15:49 ` Gary Guo
` (2 more replies)
2023-05-23 14:44 ` [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync` Alice Ryhl
` (2 subsequent siblings)
3 siblings, 3 replies; 17+ messages in thread
From: Alice Ryhl @ 2023-05-23 14:44 UTC (permalink / raw)
To: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Alice Ryhl, Ingo Molnar, Peter Zijlstra, Will Deacon,
Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
The safety comment on `impl Send for Arc` talks about "directly"
accessing the value, when it really means "accessing the value with a
mutable reference". This commit clarifies that.
Suggested-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
---
rust/kernel/sync/arc.rs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
index e6d206242465..87a4c9ed712b 100644
--- a/rust/kernel/sync/arc.rs
+++ b/rust/kernel/sync/arc.rs
@@ -146,8 +146,8 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Ar
// SAFETY: It is safe to send `Arc<T>` to another thread when the underlying `T` is `Sync` because
// it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
-// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` directly, for
-// example, when the reference count reaches zero and `T` is dropped.
+// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` using a
+// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
--
2.40.1.698.g37aff9b760-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync`
2023-05-23 14:44 [PATCH v2 0/4] Update thread safety markers Alice Ryhl
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
@ 2023-05-23 14:44 ` Alice Ryhl
2023-05-23 15:50 ` Gary Guo
` (2 more replies)
2023-05-23 14:44 ` [PATCH v2 3/4] rust: specify when `ARef` is thread safe Alice Ryhl
2023-05-23 14:44 ` [PATCH v2 4/4] rust: task: add `Send` marker to `Task` Alice Ryhl
3 siblings, 3 replies; 17+ messages in thread
From: Alice Ryhl @ 2023-05-23 14:44 UTC (permalink / raw)
To: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Alice Ryhl, Ingo Molnar, Peter Zijlstra, Will Deacon,
Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
The safety comment on `impl Sync for Arc` references the Send safety
comment. This commit avoids that in case the two comments drift apart in
the future.
Suggested-by: Andreas Hindborg <a.hindborg@samsung.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
---
rust/kernel/sync/arc.rs | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
index 87a4c9ed712b..4d10f9868d9e 100644
--- a/rust/kernel/sync/arc.rs
+++ b/rust/kernel/sync/arc.rs
@@ -150,9 +150,11 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Ar
// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
-// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
-// same reason as above. `T` needs to be `Send` as well because a thread can clone an `&Arc<T>`
-// into an `Arc<T>`, which may lead to `T` being accessed by the same reasoning as above.
+// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync`
+// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
+// it needs `T` to be `Send` because any thread that has a `&Arc<T>` may clone it and get an
+// `Arc<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
+// example, when the reference count reaches zero and `T` is dropped.
unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
impl<T> Arc<T> {
--
2.40.1.698.g37aff9b760-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 3/4] rust: specify when `ARef` is thread safe
2023-05-23 14:44 [PATCH v2 0/4] Update thread safety markers Alice Ryhl
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
2023-05-23 14:44 ` [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync` Alice Ryhl
@ 2023-05-23 14:44 ` Alice Ryhl
2023-05-23 16:31 ` Martin Rodriguez Reboredo
2023-05-23 14:44 ` [PATCH v2 4/4] rust: task: add `Send` marker to `Task` Alice Ryhl
3 siblings, 1 reply; 17+ messages in thread
From: Alice Ryhl @ 2023-05-23 14:44 UTC (permalink / raw)
To: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Alice Ryhl, Ingo Molnar, Peter Zijlstra, Will Deacon,
Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
An `ARef` behaves just like the `Arc` when it comes to thread safety, so
we can reuse the thread safety comments from `Arc` here.
This is necessary because without this change, the Rust compiler will
assume that things are not thread safe even though they are.
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
---
rust/kernel/types.rs | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/rust/kernel/types.rs b/rust/kernel/types.rs
index 29db59d6119a..1e5380b16ed5 100644
--- a/rust/kernel/types.rs
+++ b/rust/kernel/types.rs
@@ -321,6 +321,19 @@ pub struct ARef<T: AlwaysRefCounted> {
_p: PhantomData<T>,
}
+// SAFETY: It is safe to send `ARef<T>` to another thread when the underlying `T` is `Sync` because
+// it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
+// `T` to be `Send` because any thread that has an `ARef<T>` may ultimately access `T` using a
+// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
+unsafe impl<T: AlwaysRefCounted + Sync + Send> Send for ARef<T> {}
+
+// SAFETY: It is safe to send `&ARef<T>` to another thread when the underlying `T` is `Sync`
+// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
+// it needs `T` to be `Send` because any thread that has a `&ARef<T>` may clone it and get an
+// `ARef<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
+// example, when the reference count reaches zero and `T` is dropped.
+unsafe impl<T: AlwaysRefCounted + Sync + Send> Sync for ARef<T> {}
+
impl<T: AlwaysRefCounted> ARef<T> {
/// Creates a new instance of [`ARef`].
///
--
2.40.1.698.g37aff9b760-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 4/4] rust: task: add `Send` marker to `Task`
2023-05-23 14:44 [PATCH v2 0/4] Update thread safety markers Alice Ryhl
` (2 preceding siblings ...)
2023-05-23 14:44 ` [PATCH v2 3/4] rust: specify when `ARef` is thread safe Alice Ryhl
@ 2023-05-23 14:44 ` Alice Ryhl
2023-05-23 15:56 ` Gary Guo
` (2 more replies)
3 siblings, 3 replies; 17+ messages in thread
From: Alice Ryhl @ 2023-05-23 14:44 UTC (permalink / raw)
To: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Alice Ryhl, Ingo Molnar, Peter Zijlstra, Will Deacon,
Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
When a type also implements `Sync`, the meaning of `Send` is just "this
type may be accessed mutably from threads other than the one it is
created on". That's ok for this type.
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
---
rust/kernel/task.rs | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs
index 526d29a0ae27..7eda15e5f1b3 100644
--- a/rust/kernel/task.rs
+++ b/rust/kernel/task.rs
@@ -64,8 +64,14 @@ macro_rules! current {
#[repr(transparent)]
pub struct Task(pub(crate) Opaque<bindings::task_struct>);
-// SAFETY: It's OK to access `Task` through references from other threads because we're either
-// accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
+// SAFETY: By design, the only way to access a `Task` is via the `current` function or via an
+// `ARef<Task>` obtained through the `AlwaysRefCounted` impl. This means that the only situation in
+// which a `Task` can be accessed mutably is when the refcount drops to zero and the destructor
+// runs. It is safe for that to happen on any thread, so it is ok for this type to be `Send`.
+unsafe impl Send for Task {}
+
+// SAFETY: It's OK to access `Task` through shared references from other threads because we're
+// either accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
// synchronised by C code (e.g., `signal_pending`).
unsafe impl Sync for Task {}
--
2.40.1.698.g37aff9b760-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send`
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
@ 2023-05-23 15:49 ` Gary Guo
2023-05-23 16:27 ` Martin Rodriguez Reboredo
2023-05-25 13:35 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Gary Guo @ 2023-05-23 15:49 UTC (permalink / raw)
To: Alice Ryhl
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Björn Roy Baron, Benno Lossin, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
On Tue, 23 May 2023 14:44:15 +0000
Alice Ryhl <aliceryhl@google.com> wrote:
> The safety comment on `impl Send for Arc` talks about "directly"
> accessing the value, when it really means "accessing the value with a
> mutable reference". This commit clarifies that.
>
> Suggested-by: Boqun Feng <boqun.feng@gmail.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
> ---
> rust/kernel/sync/arc.rs | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index e6d206242465..87a4c9ed712b 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -146,8 +146,8 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Ar
>
> // SAFETY: It is safe to send `Arc<T>` to another thread when the underlying `T` is `Sync` because
> // it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
> -// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` directly, for
> -// example, when the reference count reaches zero and `T` is dropped.
> +// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` using a
> +// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
>
> // SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync`
2023-05-23 14:44 ` [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync` Alice Ryhl
@ 2023-05-23 15:50 ` Gary Guo
2023-05-23 17:08 ` Alice Ryhl
2023-05-23 16:29 ` Martin Rodriguez Reboredo
2023-05-25 13:43 ` Benno Lossin
2 siblings, 1 reply; 17+ messages in thread
From: Gary Guo @ 2023-05-23 15:50 UTC (permalink / raw)
To: Alice Ryhl
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Björn Roy Baron, Benno Lossin, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
On Tue, 23 May 2023 14:44:16 +0000
Alice Ryhl <aliceryhl@google.com> wrote:
> The safety comment on `impl Sync for Arc` references the Send safety
> comment. This commit avoids that in case the two comments drift apart in
> the future.
>
> Suggested-by: Andreas Hindborg <a.hindborg@samsung.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
> ---
> rust/kernel/sync/arc.rs | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index 87a4c9ed712b..4d10f9868d9e 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -150,9 +150,11 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Ar
> // mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
>
> -// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
> -// same reason as above. `T` needs to be `Send` as well because a thread can clone an `&Arc<T>`
> -// into an `Arc<T>`, which may lead to `T` being accessed by the same reasoning as above.
> +// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync`
> +// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
> +// it needs `T` to be `Send` because any thread that has a `&Arc<T>` may clone it and get an
> +// `Arc<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
> +// example, when the reference count reaches zero and `T` is dropped.
"for example" here implies that there are other case to get a mutable
reference? I don't think that's true for our `Arc` since we don't
provide a `get_mut` method.
> unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
>
> impl<T> Arc<T> {
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/4] rust: task: add `Send` marker to `Task`
2023-05-23 14:44 ` [PATCH v2 4/4] rust: task: add `Send` marker to `Task` Alice Ryhl
@ 2023-05-23 15:56 ` Gary Guo
2023-05-23 16:41 ` Martin Rodriguez Reboredo
2023-05-25 13:46 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Gary Guo @ 2023-05-23 15:56 UTC (permalink / raw)
To: Alice Ryhl
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Björn Roy Baron, Benno Lossin, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
On Tue, 23 May 2023 14:44:18 +0000
Alice Ryhl <aliceryhl@google.com> wrote:
> When a type also implements `Sync`, the meaning of `Send` is just "this
> type may be accessed mutably from threads other than the one it is
> created on". That's ok for this type.
>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
> ---
> rust/kernel/task.rs | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs
> index 526d29a0ae27..7eda15e5f1b3 100644
> --- a/rust/kernel/task.rs
> +++ b/rust/kernel/task.rs
> @@ -64,8 +64,14 @@ macro_rules! current {
> #[repr(transparent)]
> pub struct Task(pub(crate) Opaque<bindings::task_struct>);
>
> -// SAFETY: It's OK to access `Task` through references from other threads because we're either
> -// accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
> +// SAFETY: By design, the only way to access a `Task` is via the `current` function or via an
> +// `ARef<Task>` obtained through the `AlwaysRefCounted` impl. This means that the only situation in
> +// which a `Task` can be accessed mutably is when the refcount drops to zero and the destructor
> +// runs. It is safe for that to happen on any thread, so it is ok for this type to be `Send`.
> +unsafe impl Send for Task {}
> +
> +// SAFETY: It's OK to access `Task` through shared references from other threads because we're
> +// either accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
> // synchronised by C code (e.g., `signal_pending`).
> unsafe impl Sync for Task {}
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send`
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
2023-05-23 15:49 ` Gary Guo
@ 2023-05-23 16:27 ` Martin Rodriguez Reboredo
2023-05-25 13:35 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Martin Rodriguez Reboredo @ 2023-05-23 16:27 UTC (permalink / raw)
To: Alice Ryhl, Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Ingo Molnar, Peter Zijlstra, Will Deacon, Mark Rutland,
rust-for-linux, linux-kernel, patches, Andreas Hindborg
On 5/23/23 11:44, Alice Ryhl wrote:
> The safety comment on `impl Send for Arc` talks about "directly"
> accessing the value, when it really means "accessing the value with a
> mutable reference". This commit clarifies that.
>
> Suggested-by: Boqun Feng <boqun.feng@gmail.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
> ---
> [...]
>
> // SAFETY: It is safe to send `Arc<T>` to another thread when the underlying `T` is `Sync` because
> // it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
> -// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` directly, for
> -// example, when the reference count reaches zero and `T` is dropped.
> +// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` using a
> +// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
>
> // SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync`
2023-05-23 14:44 ` [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync` Alice Ryhl
2023-05-23 15:50 ` Gary Guo
@ 2023-05-23 16:29 ` Martin Rodriguez Reboredo
2023-05-25 13:43 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Martin Rodriguez Reboredo @ 2023-05-23 16:29 UTC (permalink / raw)
To: Alice Ryhl, Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Ingo Molnar, Peter Zijlstra, Will Deacon, Mark Rutland,
rust-for-linux, linux-kernel, patches, Andreas Hindborg
On 5/23/23 11:44, Alice Ryhl wrote:
> The safety comment on `impl Sync for Arc` references the Send safety
> comment. This commit avoids that in case the two comments drift apart in
> the future.
>
> Suggested-by: Andreas Hindborg <a.hindborg@samsung.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
> ---
> [...]
>
> -// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
> -// same reason as above. `T` needs to be `Send` as well because a thread can clone an `&Arc<T>`
> -// into an `Arc<T>`, which may lead to `T` being accessed by the same reasoning as above.
> +// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync`
> +// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
> +// it needs `T` to be `Send` because any thread that has a `&Arc<T>` may clone it and get an
> +// `Arc<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
> +// example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
>
> impl<T> Arc<T> {
Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/4] rust: specify when `ARef` is thread safe
2023-05-23 14:44 ` [PATCH v2 3/4] rust: specify when `ARef` is thread safe Alice Ryhl
@ 2023-05-23 16:31 ` Martin Rodriguez Reboredo
2023-05-25 13:45 ` Benno Lossin
0 siblings, 1 reply; 17+ messages in thread
From: Martin Rodriguez Reboredo @ 2023-05-23 16:31 UTC (permalink / raw)
To: Alice Ryhl, Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Ingo Molnar, Peter Zijlstra, Will Deacon, Mark Rutland,
rust-for-linux, linux-kernel, patches, Andreas Hindborg
On 5/23/23 11:44, Alice Ryhl wrote:
> An `ARef` behaves just like the `Arc` when it comes to thread safety, so
> we can reuse the thread safety comments from `Arc` here.
>
> This is necessary because without this change, the Rust compiler will
> assume that things are not thread safe even though they are.
>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
> ---
> [...]
>
> +// SAFETY: It is safe to send `ARef<T>` to another thread when the underlying `T` is `Sync` because
> +// it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
> +// `T` to be `Send` because any thread that has an `ARef<T>` may ultimately access `T` using a
> +// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> +unsafe impl<T: AlwaysRefCounted + Sync + Send> Send for ARef<T> {}
> +
> +// SAFETY: It is safe to send `&ARef<T>` to another thread when the underlying `T` is `Sync`
> +// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
> +// it needs `T` to be `Send` because any thread that has a `&ARef<T>` may clone it and get an
> +// `ARef<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
> +// example, when the reference count reaches zero and `T` is dropped.
> +unsafe impl<T: AlwaysRefCounted + Sync + Send> Sync for ARef<T> {}
> +
> impl<T: AlwaysRefCounted> ARef<T> {
> /// Creates a new instance of [`ARef`].
> ///
Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/4] rust: task: add `Send` marker to `Task`
2023-05-23 14:44 ` [PATCH v2 4/4] rust: task: add `Send` marker to `Task` Alice Ryhl
2023-05-23 15:56 ` Gary Guo
@ 2023-05-23 16:41 ` Martin Rodriguez Reboredo
2023-05-25 13:46 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Martin Rodriguez Reboredo @ 2023-05-23 16:41 UTC (permalink / raw)
To: Alice Ryhl, Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor
Cc: Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Ingo Molnar, Peter Zijlstra, Will Deacon, Mark Rutland,
rust-for-linux, linux-kernel, patches, Andreas Hindborg
On 5/23/23 11:44, Alice Ryhl wrote:
> When a type also implements `Sync`, the meaning of `Send` is just "this
> type may be accessed mutably from threads other than the one it is
> created on". That's ok for this type.
>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> ---
> [...]
>
> -// SAFETY: It's OK to access `Task` through references from other threads because we're either
> -// accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
> +// SAFETY: By design, the only way to access a `Task` is via the `current` function or via an
> +// `ARef<Task>` obtained through the `AlwaysRefCounted` impl. This means that the only situation in
> +// which a `Task` can be accessed mutably is when the refcount drops to zero and the destructor
> +// runs. It is safe for that to happen on any thread, so it is ok for this type to be `Send`.
> +unsafe impl Send for Task {}
> +
> +// SAFETY: It's OK to access `Task` through shared references from other threads because we're
> +// either accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
> // synchronised by C code (e.g., `signal_pending`).
> unsafe impl Sync for Task {}
>
Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync`
2023-05-23 15:50 ` Gary Guo
@ 2023-05-23 17:08 ` Alice Ryhl
0 siblings, 0 replies; 17+ messages in thread
From: Alice Ryhl @ 2023-05-23 17:08 UTC (permalink / raw)
To: Gary Guo
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Björn Roy Baron, Benno Lossin, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg, Alice Ryhl
On 5/23/23 17:50, Gary Guo wrote:
>> -// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
>> -// same reason as above. `T` needs to be `Send` as well because a thread can clone an `&Arc<T>`
>> -// into an `Arc<T>`, which may lead to `T` being accessed by the same reasoning as above.
>> +// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync`
>> +// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
>> +// it needs `T` to be `Send` because any thread that has a `&Arc<T>` may clone it and get an
>> +// `Arc<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
>> +// example, when the reference count reaches zero and `T` is dropped.
>
> "for example" here implies that there are other case to get a mutable
> reference? I don't think that's true for our `Arc` since we don't
> provide a `get_mut` method.
Ah, yes, that's true. Good point.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send`
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
2023-05-23 15:49 ` Gary Guo
2023-05-23 16:27 ` Martin Rodriguez Reboredo
@ 2023-05-25 13:35 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Benno Lossin @ 2023-05-25 13:35 UTC (permalink / raw)
To: Alice Ryhl
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Gary Guo, Björn Roy Baron, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
On 5/23/23 16:44, Alice Ryhl wrote:
> The safety comment on `impl Send for Arc` talks about "directly"
> accessing the value, when it really means "accessing the value with a
> mutable reference". This commit clarifies that.
>
> Suggested-by: Boqun Feng <boqun.feng@gmail.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
> ---
> rust/kernel/sync/arc.rs | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index e6d206242465..87a4c9ed712b 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -146,8 +146,8 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Ar
>
> // SAFETY: It is safe to send `Arc<T>` to another thread when the underlying `T` is `Sync` because
> // it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
> -// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` directly, for
> -// example, when the reference count reaches zero and `T` is dropped.
> +// `T` to be `Send` because any thread that has an `Arc<T>` may ultimately access `T` using a
> +// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
>
> // SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
> --
> 2.40.1.698.g37aff9b760-goog
>
--
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync`
2023-05-23 14:44 ` [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync` Alice Ryhl
2023-05-23 15:50 ` Gary Guo
2023-05-23 16:29 ` Martin Rodriguez Reboredo
@ 2023-05-25 13:43 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Benno Lossin @ 2023-05-25 13:43 UTC (permalink / raw)
To: Alice Ryhl
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Gary Guo, Björn Roy Baron, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
On 5/23/23 16:44, Alice Ryhl wrote:
> The safety comment on `impl Sync for Arc` references the Send safety
> comment. This commit avoids that in case the two comments drift apart in
> the future.
>
> Suggested-by: Andreas Hindborg <a.hindborg@samsung.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
> ---
> rust/kernel/sync/arc.rs | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index 87a4c9ed712b..4d10f9868d9e 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -150,9 +150,11 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> core::ops::DispatchFromDyn<Arc<U>> for Ar
> // mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
>
> -// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync` for the
> -// same reason as above. `T` needs to be `Send` as well because a thread can clone an `&Arc<T>`
> -// into an `Arc<T>`, which may lead to `T` being accessed by the same reasoning as above.
> +// SAFETY: It is safe to send `&Arc<T>` to another thread when the underlying `T` is `Sync`
> +// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
> +// it needs `T` to be `Send` because any thread that has a `&Arc<T>` may clone it and get an
> +// `Arc<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
> +// example, when the reference count reaches zero and `T` is dropped.
> unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
>
> impl<T> Arc<T> {
> --
> 2.40.1.698.g37aff9b760-goog
>
--
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/4] rust: specify when `ARef` is thread safe
2023-05-23 16:31 ` Martin Rodriguez Reboredo
@ 2023-05-25 13:45 ` Benno Lossin
0 siblings, 0 replies; 17+ messages in thread
From: Benno Lossin @ 2023-05-25 13:45 UTC (permalink / raw)
To: Martin Rodriguez Reboredo
Cc: Alice Ryhl, Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Ingo Molnar,
Peter Zijlstra, Will Deacon, Mark Rutland, rust-for-linux,
linux-kernel, patches, Andreas Hindborg
On 5/23/23 16:44, Alice Ryhl wrote:
> An `ARef` behaves just like the `Arc` when it comes to thread safety, so
> we can reuse the thread safety comments from `Arc` here.
>
> This is necessary because without this change, the Rust compiler will
> assume that things are not thread safe even though they are.
>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
> Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
> ---
> rust/kernel/types.rs | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/rust/kernel/types.rs b/rust/kernel/types.rs
> index 29db59d6119a..1e5380b16ed5 100644
> --- a/rust/kernel/types.rs
> +++ b/rust/kernel/types.rs
> @@ -321,6 +321,19 @@ pub struct ARef<T: AlwaysRefCounted> {
> _p: PhantomData<T>,
> }
>
> +// SAFETY: It is safe to send `ARef<T>` to another thread when the underlying `T` is `Sync` because
> +// it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally, it needs
> +// `T` to be `Send` because any thread that has an `ARef<T>` may ultimately access `T` using a
> +// mutable reference, for example, when the reference count reaches zero and `T` is dropped.
> +unsafe impl<T: AlwaysRefCounted + Sync + Send> Send for ARef<T> {}
> +
> +// SAFETY: It is safe to send `&ARef<T>` to another thread when the underlying `T` is `Sync`
> +// because it effectively means sharing `&T` (which is safe because `T` is `Sync`); additionally,
> +// it needs `T` to be `Send` because any thread that has a `&ARef<T>` may clone it and get an
> +// `ARef<T>` on that thread, so the thread may ultimately access `T` using a mutable reference, for
> +// example, when the reference count reaches zero and `T` is dropped.
> +unsafe impl<T: AlwaysRefCounted + Sync + Send> Sync for ARef<T> {}
> +
> impl<T: AlwaysRefCounted> ARef<T> {
> /// Creates a new instance of [`ARef`].
> ///
> --
> 2.40.1.698.g37aff9b760-goog
>
--
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/4] rust: task: add `Send` marker to `Task`
2023-05-23 14:44 ` [PATCH v2 4/4] rust: task: add `Send` marker to `Task` Alice Ryhl
2023-05-23 15:56 ` Gary Guo
2023-05-23 16:41 ` Martin Rodriguez Reboredo
@ 2023-05-25 13:46 ` Benno Lossin
2 siblings, 0 replies; 17+ messages in thread
From: Benno Lossin @ 2023-05-25 13:46 UTC (permalink / raw)
To: Alice Ryhl
Cc: Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng,
Gary Guo, Björn Roy Baron, Ingo Molnar, Peter Zijlstra,
Will Deacon, Mark Rutland, rust-for-linux, linux-kernel, patches,
Andreas Hindborg
On 5/23/23 16:44, Alice Ryhl wrote:
> When a type also implements `Sync`, the meaning of `Send` is just "this
> type may be accessed mutably from threads other than the one it is
> created on". That's ok for this type.
>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>
Reviewed-by: Benno Lossin <benno.lossin@proton.me>
> ---
> rust/kernel/task.rs | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs
> index 526d29a0ae27..7eda15e5f1b3 100644
> --- a/rust/kernel/task.rs
> +++ b/rust/kernel/task.rs
> @@ -64,8 +64,14 @@ macro_rules! current {
> #[repr(transparent)]
> pub struct Task(pub(crate) Opaque<bindings::task_struct>);
>
> -// SAFETY: It's OK to access `Task` through references from other threads because we're either
> -// accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
> +// SAFETY: By design, the only way to access a `Task` is via the `current` function or via an
> +// `ARef<Task>` obtained through the `AlwaysRefCounted` impl. This means that the only situation in
> +// which a `Task` can be accessed mutably is when the refcount drops to zero and the destructor
> +// runs. It is safe for that to happen on any thread, so it is ok for this type to be `Send`.
> +unsafe impl Send for Task {}
> +
> +// SAFETY: It's OK to access `Task` through shared references from other threads because we're
> +// either accessing properties that don't change (e.g., `pid`, `group_leader`) or that are properly
> // synchronised by C code (e.g., `signal_pending`).
> unsafe impl Sync for Task {}
>
> --
> 2.40.1.698.g37aff9b760-goog
>
--
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2023-05-25 13:47 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-23 14:44 [PATCH v2 0/4] Update thread safety markers Alice Ryhl
2023-05-23 14:44 ` [PATCH v2 1/4] rust: sync: reword the `Arc` safety comment for `Send` Alice Ryhl
2023-05-23 15:49 ` Gary Guo
2023-05-23 16:27 ` Martin Rodriguez Reboredo
2023-05-25 13:35 ` Benno Lossin
2023-05-23 14:44 ` [PATCH v2 2/4] rust: sync: reword the `Arc` safety comment for `Sync` Alice Ryhl
2023-05-23 15:50 ` Gary Guo
2023-05-23 17:08 ` Alice Ryhl
2023-05-23 16:29 ` Martin Rodriguez Reboredo
2023-05-25 13:43 ` Benno Lossin
2023-05-23 14:44 ` [PATCH v2 3/4] rust: specify when `ARef` is thread safe Alice Ryhl
2023-05-23 16:31 ` Martin Rodriguez Reboredo
2023-05-25 13:45 ` Benno Lossin
2023-05-23 14:44 ` [PATCH v2 4/4] rust: task: add `Send` marker to `Task` Alice Ryhl
2023-05-23 15:56 ` Gary Guo
2023-05-23 16:41 ` Martin Rodriguez Reboredo
2023-05-25 13:46 ` Benno Lossin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox