rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Benno Lossin" <lossin@kernel.org>
To: "Danilo Krummrich" <dakr@kernel.org>
Cc: "Matthew Maurer" <mmaurer@google.com>,
	"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>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	"Sami Tolvanen" <samitolvanen@google.com>,
	"Timur Tabi" <ttabi@nvidia.com>,
	linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v5 4/4] rust: samples: Add debugfs sample
Date: Wed, 14 May 2025 11:54:39 +0200	[thread overview]
Message-ID: <D9VSJTPCSNXV.1LCXKGKVDGP96@kernel.org> (raw)
In-Reply-To: <aCRdNJ2oq-REBotd@pollux>

On Wed May 14, 2025 at 11:07 AM CEST, Danilo Krummrich wrote:
> On Wed, May 14, 2025 at 09:20:49AM +0200, Benno Lossin wrote:
>> On Tue May 6, 2025 at 1:51 AM CEST, Matthew Maurer wrote:
>> > +impl kernel::Module for RustDebugFs {
>> > +    fn init(_this: &'static ThisModule) -> Result<Self> {
>> > +        // Create a debugfs directory in the root of the filesystem called "sample_debugfs".
>> > +        let debugfs = Dir::new(c_str!("sample_debugfs"));
>> > +
>> > +        {
>> > +            // Create a subdirectory, so "sample_debugfs/subdir" now exists.
>> > +            // We wrap it in `ManuallyDrop` so that the subdirectory is not automatically discarded
>> > +            // at the end of the scope - it will be cleaned up when `debugfs` is.
>> > +            let sub = ManuallyDrop::new(debugfs.subdir(c_str!("subdir")));
>> 
>> I dislike the direct usage of `ManuallyDrop`. To me the usage of
>> `ManuallyDrop` signifies that one has to opt out of `Drop` without the
>> support of the wrapped type. But in this case, `Dir` is sometimes
>> intended to not be dropped, so I'd rather have a `.keep()` function I
>> saw mentioned somewhere.
>
> I agree, if we really want to "officially" support to forget() (sub-)directories
> and files in order to rely on the recursive cleanup of the "root" directory, it
> should be covered explicitly by the API. I.e. (sub-)directories and files should
> have some kind of keep() and / or forget() method, to make it clear that this is
> supported and by design and won't lead to any leaks.
>
> Consequently, this would mean that we'd need something like your proposed const
> generic on the Dir type, such that keep() / forget() cannot be called on the
> "root" directory.
>
> However, I really think we should keep the code as it is in this version and
> just don't provide an example that utilizes ManuallyDrop and forget().
>
> I don't see how the idea of "manually dropping" (sub-)directories and files
> provides any real value compared to just storing their instance in a driver
> structure as long as they should stay alive, which is much more intuitive
> anyways.

Yeah that's whats normally done in Rust anyways. But I think that
lifetimes bite us in this case:

    let debugfs: Dir<'static> = Dir::new(cstr!("sample_debugfs"));

    let sub: Dir<'a> = debugfs.subdir(cstr!("subdir"));
    // lifetime `'a` starts in the line above and `sub` borrows `debugfs`

    /* code for creating the file etc */

    Ok(Self { _debugfs: debugfs, _sub: sub })
    // lifetime `'a` has to end in the line above, since debugfs is moved but `sub` still borrows from it!

This code won't compile, since we can't store the "root" dir in the same
struct that we want to store the subdir, because the subdir borrows from
the root dir.

Essentially this would require self-referential structs like the
`ouroboros` crate [1] from user-space Rust. We should rather have the
`.keep()` function in the API than use self-referential structs.

[1]: https://docs.rs/ouroboros/latest/ouroboros/attr.self_referencing.html

Another problem that only affects complicated debugfs structures is that
you would have to store all subdirs & files somewhere. If the structure
is dynamic and changes over the lifetime of the driver, then you'll need
a `Vec` or store the dirs in `Arc` or similar, leading to extra
allocations.

> It either just adds complexity to the API (due to the need to distingish between
> the "root" directory and sub-directories) or makes the API error prone by
> providing a *valid looking* option to users to leak the "root" directory.

I agree with this, I want that `ManuallyDrop` & `forget` are only used
rarely mostly for low-level operations.

---
Cheers,
Benno

  reply	other threads:[~2025-05-14  9:54 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-05 23:51 [PATCH v5 0/4] rust: DebugFS Bindings Matthew Maurer
2025-05-05 23:51 ` [PATCH v5 1/4] rust: debugfs: Bind DebugFS directory creation Matthew Maurer
2025-05-07 18:46   ` Timur Tabi
2025-05-14 22:26     ` Matthew Maurer
2025-05-14  7:33   ` Benno Lossin
2025-05-14  8:49     ` Greg Kroah-Hartman
2025-05-14  9:38       ` Benno Lossin
2025-05-05 23:51 ` [PATCH v5 2/4] rust: debugfs: Bind file creation for long-lived Display Matthew Maurer
2025-05-07 19:04   ` Timur Tabi
2025-05-07 19:41   ` Timur Tabi
2025-05-09 12:56   ` Alice Ryhl
2025-05-12 20:51   ` Timur Tabi
2025-05-14  8:06   ` Benno Lossin
2025-05-05 23:51 ` [PATCH v5 3/4] rust: debugfs: Support format hooks Matthew Maurer
2025-05-05 23:51 ` [PATCH v5 4/4] rust: samples: Add debugfs sample Matthew Maurer
2025-05-14  7:20   ` Benno Lossin
2025-05-14  9:07     ` Danilo Krummrich
2025-05-14  9:54       ` Benno Lossin [this message]
2025-05-14 11:24         ` Danilo Krummrich
2025-05-14 12:21           ` Benno Lossin
2025-05-14 13:04             ` Danilo Krummrich
2025-05-14 22:14           ` Matthew Maurer
2025-05-14 22:08         ` Matthew Maurer
2025-05-14 22:14           ` Danilo Krummrich
2025-05-14 22:23             ` Matthew Maurer
2025-05-14 22:32               ` Matthew Maurer
2025-05-14 22:40                 ` Timur Tabi
2025-05-14 22:42                   ` Matthew Maurer
2025-05-15  7:43                     ` gregkh
2025-05-15  8:50           ` Benno Lossin
2025-05-14 21:55       ` Matthew Maurer
2025-05-14 22:18         ` Danilo Krummrich
2025-05-15  8:59         ` Benno Lossin
2025-05-15 11:43           ` Greg Kroah-Hartman
2025-05-15 12:37             ` Danilo Krummrich
2025-05-15 12:55               ` Benno Lossin
2025-05-20 21:24             ` Alice Ryhl
2025-05-21  4:47               ` Greg Kroah-Hartman
2025-05-21 22:40                 ` Alice Ryhl
2025-05-21  7:57               ` Danilo Krummrich
2025-05-21 22:43                 ` Alice Ryhl
2025-05-22  6:25                   ` Danilo Krummrich
2025-05-22  8:28                     ` Greg Kroah-Hartman
2025-05-22 14:01                     ` Alice Ryhl
2025-05-22 14:15                       ` Greg Kroah-Hartman
2025-05-22 17:40                         ` Alice Ryhl
2025-05-22 20:26                           ` Benno Lossin
2025-05-23  9:15                           ` Greg Kroah-Hartman
2025-05-22 17:53                         ` Danilo Krummrich
2025-05-23  9:14                           ` Greg Kroah-Hartman
2025-05-23  9:42                             ` Danilo Krummrich
2025-05-23 10:22                               ` Greg Kroah-Hartman
2025-05-23 17:09                               ` Alice Ryhl
2025-05-24 12:25                                 ` Danilo Krummrich
2025-05-27 11:38                                   ` Alice Ryhl
2025-05-27 11:50                                     ` Danilo Krummrich
2025-06-10 17:54                                       ` Matthew Maurer
2025-05-23 17:06                             ` Alice Ryhl
2025-05-07 16:49 ` [PATCH v5 0/4] rust: DebugFS Bindings Danilo Krummrich

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=D9VSJTPCSNXV.1LCXKGKVDGP96@kernel.org \
    --to=lossin@kernel.org \
    --cc=a.hindborg@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mmaurer@google.com \
    --cc=ojeda@kernel.org \
    --cc=rafael@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=samitolvanen@google.com \
    --cc=tmgross@umich.edu \
    --cc=ttabi@nvidia.com \
    /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).