Rust for Linux List
 help / color / mirror / Atom feed
* [PATCH] rust: revocable: clarify invariants in safety documentation
@ 2025-05-01  0:57 Marcelo Moreira
  2025-05-01 10:18 ` Miguel Ojeda
  0 siblings, 1 reply; 4+ messages in thread
From: Marcelo Moreira @ 2025-05-01  0:57 UTC (permalink / raw)
  To: benno.lossin, ojeda, aliceryhl, rust-for-linux, skhan,
	linux-kernel-mentees, ~lkcamp/patches

Clarify the safety invariants for `Revocable<T>`, documenting that `data`
is only valid if `is_available` is `true`, and that access requires
holding the RCU read-side lock.

This helps developers understand when it is safe to access the wrapped
data and the role of RCU in ensuring memory safety.

This is part of issue #1160 ("correct safety comments and documentation
in revocable.rs"), reported by Miguel Ojeda and Benno Lossin.

Reported-by: Miguel Ojeda <ojeda@kernel.org>
Closes: https://github.com/Rust-for-Linux/linux/issues/1160
Reported-by: Benno Lossin <benno.lossin@proton.me>
Closes: https://github.com/Rust-for-Linux/linux/issues/1160
Tested-by: Marcelo Moreira <marcelomoreira1905@gmail.com>
Signed-off-by: Marcelo Moreira <marcelomoreira1905@gmail.com>
---
 rust/kernel/revocable.rs | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/rust/kernel/revocable.rs b/rust/kernel/revocable.rs
index 1e5a9d25c21b..2da3e9460c07 100644
--- a/rust/kernel/revocable.rs
+++ b/rust/kernel/revocable.rs
@@ -61,6 +61,15 @@
 /// v.revoke();
 /// assert_eq!(add_two(&v), None);
 /// ```
+///
+/// # Invariants
+///
+/// - The wrapped object `data` is valid if and only if `is_available` is `true`.
+/// - Access to `data` must occur only while holding the RCU read-side lock (e.g., via
+///   [`Revocable::try_access`] or [`Revocable::try_access_with_guard`]).
+/// - Once `is_available` is set to `false`, further access to `data` is disallowed,
+///   and the object is dropped either after an RCU grace period (in [`revoke`]),
+///   or immediately (in [`revoke_nosync`]).
 #[pin_data(PinnedDrop)]
 pub struct Revocable<T> {
     is_available: AtomicBool,
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] rust: revocable: clarify invariants in safety documentation
  2025-05-01  0:57 [PATCH] rust: revocable: clarify invariants in safety documentation Marcelo Moreira
@ 2025-05-01 10:18 ` Miguel Ojeda
  2025-05-02  7:33   ` Benno Lossin
  0 siblings, 1 reply; 4+ messages in thread
From: Miguel Ojeda @ 2025-05-01 10:18 UTC (permalink / raw)
  To: Marcelo Moreira
  Cc: benno.lossin, ojeda, aliceryhl, rust-for-linux, skhan,
	linux-kernel-mentees, ~lkcamp/patches

On Thu, May 1, 2025 at 2:57 AM Marcelo Moreira
<marcelomoreira1905@gmail.com> wrote:
>
> This is part of issue #1160 ("correct safety comments and documentation
> in revocable.rs"), reported by Miguel Ojeda and Benno Lossin.
>
> Reported-by: Miguel Ojeda <ojeda@kernel.org>
> Closes: https://github.com/Rust-for-Linux/linux/issues/1160

I think it was just Benno. :)

> Tested-by: Marcelo Moreira <marcelomoreira1905@gmail.com>

Normally one is supposed to test a patch before submitting it, i.e. it
is implicit.

> +/// # Invariants

We also place `// INVARIANT: ...` comments in the places that need to
ensure the type invariants hold, e.g. in constructors.

Given the issue, I think Benno may have also wanted that you then
refer to the type invariants to justify some of the comments, e.g. in
the "Since `self.is_available` is true, ..." ones.

> +/// - Access to `data` must occur only while holding the RCU read-side lock (e.g., vi

The "must occur" wording seems a bit strange for a type invariant, but
maybe Benno had something in mind here?

Thanks for the patch!

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] rust: revocable: clarify invariants in safety documentation
  2025-05-01 10:18 ` Miguel Ojeda
@ 2025-05-02  7:33   ` Benno Lossin
  2025-05-02 17:10     ` Marcelo Moreira
  0 siblings, 1 reply; 4+ messages in thread
From: Benno Lossin @ 2025-05-02  7:33 UTC (permalink / raw)
  To: Miguel Ojeda, Marcelo Moreira
  Cc: benno.lossin, ojeda, aliceryhl, rust-for-linux, skhan,
	linux-kernel-mentees, ~lkcamp/patches

On Thu May 1, 2025 at 12:18 PM CEST, Miguel Ojeda wrote:
> On Thu, May 1, 2025 at 2:57 AM Marcelo Moreira
> <marcelomoreira1905@gmail.com> wrote:
>>
>> This is part of issue #1160 ("correct safety comments and documentation
>> in revocable.rs"), reported by Miguel Ojeda and Benno Lossin.
>>
>> Reported-by: Miguel Ojeda <ojeda@kernel.org>
>> Closes: https://github.com/Rust-for-Linux/linux/issues/1160
>
> I think it was just Benno. :)
>
>> Tested-by: Marcelo Moreira <marcelomoreira1905@gmail.com>
>
> Normally one is supposed to test a patch before submitting it, i.e. it
> is implicit.
>
>> +/// # Invariants
>
> We also place `// INVARIANT: ...` comments in the places that need to
> ensure the type invariants hold, e.g. in constructors.
>
> Given the issue, I think Benno may have also wanted that you then
> refer to the type invariants to justify some of the comments, e.g. in
> the "Since `self.is_available` is true, ..." ones.

Indeed, we also need the comments that establish/make use of the
invariant. For example in the `try_access_with_guard` function.

There also is a missing invariant on `RevocableGuard` that the
`data_ref` pointer is valid.

>> +/// - Access to `data` must occur only while holding the RCU read-side lock (e.g., vi
>
> The "must occur" wording seems a bit strange for a type invariant, but
> maybe Benno had something in mind here?

Yeah, I don't think that using RCU is even a hard requirement. One could
also call `revoke_nosync`, since one knows the revocable is only used by
a single kernel thread. I also don't think that it's needed for memory
correctness, but I could be wrong there.

The most important invariant is that `data` is valid while
`is_available` is true. That's what's needed by the different functions
accessing it.

---
Cheers,
Benno

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] rust: revocable: clarify invariants in safety documentation
  2025-05-02  7:33   ` Benno Lossin
@ 2025-05-02 17:10     ` Marcelo Moreira
  0 siblings, 0 replies; 4+ messages in thread
From: Marcelo Moreira @ 2025-05-02 17:10 UTC (permalink / raw)
  To: Benno Lossin
  Cc: Miguel Ojeda, benno.lossin, ojeda, aliceryhl, rust-for-linux,
	skhan, linux-kernel-mentees, ~lkcamp/patches

Hey Miguel, hey Benno,

Thanks a lot for the feedback! =)

I now get what you meant about the invariants: it's not just about
documenting them at the top, but also about adding // INVARIANT: ...
comments in the code where they actually matter — like in the
constructors and in try_access_with_guard.

Benno, thanks for pointing out the missing invariant in
RevocableGuard. I’ll add a comment explaining that data_ref is only
valid when is_available is true.

And regarding RCU, your comments made things clearer. Instead of
saying it's a hard requirement, I’ll reword it to focus on the
is_available check as the actual safety condition, and just mention
RCU as a typical way to ensure safety — but not the only one.

I’ll get v2 ready with those improvements and send it soon.

Cheers,
Marcelo M.


Em sex., 2 de mai. de 2025 às 04:33, Benno Lossin <lossin@kernel.org> escreveu:
>
> On Thu May 1, 2025 at 12:18 PM CEST, Miguel Ojeda wrote:
> > On Thu, May 1, 2025 at 2:57 AM Marcelo Moreira
> > <marcelomoreira1905@gmail.com> wrote:
> >>
> >> This is part of issue #1160 ("correct safety comments and documentation
> >> in revocable.rs"), reported by Miguel Ojeda and Benno Lossin.
> >>
> >> Reported-by: Miguel Ojeda <ojeda@kernel.org>
> >> Closes: https://github.com/Rust-for-Linux/linux/issues/1160
> >
> > I think it was just Benno. :)
> >
> >> Tested-by: Marcelo Moreira <marcelomoreira1905@gmail.com>
> >
> > Normally one is supposed to test a patch before submitting it, i.e. it
> > is implicit.
> >
> >> +/// # Invariants
> >
> > We also place `// INVARIANT: ...` comments in the places that need to
> > ensure the type invariants hold, e.g. in constructors.
> >
> > Given the issue, I think Benno may have also wanted that you then
> > refer to the type invariants to justify some of the comments, e.g. in
> > the "Since `self.is_available` is true, ..." ones.
>
> Indeed, we also need the comments that establish/make use of the
> invariant. For example in the `try_access_with_guard` function.
>
> There also is a missing invariant on `RevocableGuard` that the
> `data_ref` pointer is valid.
>
> >> +/// - Access to `data` must occur only while holding the RCU read-side lock (e.g., vi
> >
> > The "must occur" wording seems a bit strange for a type invariant, but
> > maybe Benno had something in mind here?
>
> Yeah, I don't think that using RCU is even a hard requirement. One could
> also call `revoke_nosync`, since one knows the revocable is only used by
> a single kernel thread. I also don't think that it's needed for memory
> correctness, but I could be wrong there.
>
> The most important invariant is that `data` is valid while
> `is_available` is true. That's what's needed by the different functions
> accessing it.
>
> ---
> Cheers,
> Benno

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-05-02 17:10 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-01  0:57 [PATCH] rust: revocable: clarify invariants in safety documentation Marcelo Moreira
2025-05-01 10:18 ` Miguel Ojeda
2025-05-02  7:33   ` Benno Lossin
2025-05-02 17:10     ` Marcelo Moreira

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox