[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2025050253-wriggly-pod-e420@gregkh>
Date: Fri, 2 May 2025 09:13:28 +0200
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: Danilo Krummrich <dakr@...nel.org>
Cc: Matthew Maurer <mmaurer@...gle.com>, Miguel Ojeda <ojeda@...nel.org>,
Alex Gaynor <alex.gaynor@...il.com>,
Boqun Feng <boqun.feng@...il.com>, Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>,
Benno Lossin <benno.lossin@...ton.me>,
Andreas Hindborg <a.hindborg@...nel.org>,
Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>,
"Rafael J. Wysocki" <rafael@...nel.org>,
Sami Tolvanen <samitolvanen@...gle.com>,
Timur Tabi <ttabi@...dia.com>, linux-kernel@...r.kernel.org,
rust-for-linux@...r.kernel.org
Subject: Re: [PATCH v3 4/4] rust: samples: Add debugfs sample
On Fri, May 02, 2025 at 09:01:01AM +0200, Danilo Krummrich wrote:
> On Thu, May 01, 2025 at 10:47:44PM +0000, Matthew Maurer wrote:
> > +struct RustDebugFs {
> > + // As we only hold this for drop effect (to remove the directory) we have a leading underscore
> > + // to indicate to the compiler that we don't expect to use this field directly.
>
> This feels like an introduction to Rust in the kernel for Rust beginners, which
> is a great thing!
>
> However, I wonder if, instead, we may want a dedicated (or even multiple) sample
> modules or sample drivers, where we go into such detail and leave those samples
> to focus only on the corresponding API?
People search for the specific example of what they want to do, so I
recommend just leaving all of these comments in for now as knowing to
search for a different example is usually not going to happen :)
>
> > + _debugfs: Dir,
> > +}
> > +
> > +static EXAMPLE: AtomicU32 = AtomicU32::new(8);
> > +
> > +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.
> > + let sub = debugfs.subdir(c_str!("subdir"));
> > +
> > + // Create a single file in the subdirectory called "example" that will read from the
> > + // `EXAMPLE` atomic variable.
> > + sub.fmt_file(c_str!("example"), &EXAMPLE, &|example, f| {
> > + writeln!(f, "Reading atomic: {}", example.load(Ordering::Relaxed))
> > + });
> > + // Now, "sample_debugfs/subdir/example" will print "Reading atomic: 8\n" when read.
> > +
> > + // Change the value in the variable displayed by the file. This is intended to demonstrate
> > + // that the module can continue to change the value used by the file.
> > + EXAMPLE.store(10, Ordering::Relaxed);
> > + // Now, "sample_debugfs/subdir/example" will print "Reading atomic: 10\n" when read.
> > +
> > + // Save the root debugfs directory we created to our module object. It will be
> > + // automatically cleaned up when our module is unloaded because dropping the module object
> > + // will drop the `Dir` handle. The base directory, the subdirectory, and the file will all
> > + // continue to exist until the module is unloaded.
>
> Same with this comment.
>
> @Greg: I know you proposed this one; for educational purposes I suppose. What's
> your take on the above?
I like it and want to see this here as it helps explain both how to use
this, AND how to have maintainers review code that uses the api that are
not that familiar with how Rust does things.
thanks,
greg k-h
Powered by blists - more mailing lists