From: "Benno Lossin" <lossin@kernel.org>
To: "Danilo Krummrich" <dakr@kernel.org>
Cc: "Matthew Maurer" <mmaurer@google.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"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>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"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,
"Dirk Behme" <dirk.behme@de.bosch.com>
Subject: Re: [PATCH v8 4/6] rust: debugfs: Support arbitrary owned backing for File
Date: Tue, 01 Jul 2025 22:03:09 +0200 [thread overview]
Message-ID: <DB0ZJVL0682F.ZNNOXEIDL5NN@kernel.org> (raw)
In-Reply-To: <3c928a0e-ccd4-4ba0-9f42-9f2bb0203e75@kernel.org>
On Tue Jul 1, 2025 at 9:58 PM CEST, Danilo Krummrich wrote:
> On 7/1/25 9:46 PM, Benno Lossin wrote:
>> On Tue Jul 1, 2025 at 9:21 PM CEST, Danilo Krummrich wrote:
>>> On Tue, Jul 01, 2025 at 11:11:13AM -0700, Matthew Maurer wrote:
>>>> On Tue, Jul 1, 2025 at 8:10 AM Danilo Krummrich <dakr@kernel.org> wrote:
>>>>> impl Firmware {
>>>>> pub fn new(&dir: debugfs::Dir, buffer: [u8]) -> impl PinInit<Self> {
>>>>> pin_init!(Self {
>>>>> minor <- dir.create_file("minor", 1),
>>>>> major <- dir.create_file("major", 2),
>>>>> buffer <- dir.create_file("buffer", buffer),
>>>>> })
>>>>> }
>>>>> }
>>>>>
>>>>> // This is the only allocation we need.
>>>>> let fw = KBox::pin_init(Firmware::new(...), GFP_KERNEL)?;
>>>>>
>>>>> With this everything is now in a single allocation and since we're using
>>>>> pin-init, Dir::create_file() can safely store pointers of the corresponding data
>>>>> in debugfs_create_file(), since this structure is guaranteed to be pinned in
>>>>> memory.
>>>>>
>>>>> Actually, we can also implement *only this*, since with this my previous example
>>>>> would just become this:
>>>>
>>>> If we implement *only* pinned files, we run into an additional problem
>>>> - you can't easily extend a pinned vector. This means that you cannot
>>>> have dynamically created devices unless you're willing to put every
>>>> new `File` into its own `Box`, because you aren't allowed to move any
>>>> of the previously allocated `File`s for a resize.
>>>>
>>>> Where previously you would have had
>>>>
>>>> ```
>>>> debug_files: Vec<File>
>>>> ```
>>>>
>>>> you would now have
>>>>
>>>> ```
>>>> debug_files: Vec<PinBox<File<T>>>
>>>> ```
>>>
>>> Stuffing single File instances into a Vec seems like the wrong thing to do.
>>>
>>> Instead you may have instances of some data structure that is created
>>> dynamically in your driver that you want to expose through debugfs.
>>>
>>> Let's say you have (userspace) clients that can be registered arbitrarily, then
>>> you want a Vec<Client>, which contains the client instances. In order to provide
>>> information about the Client in debugfs you then have the client embed things as
>>> discussed above.
>>>
>>> struct Client {
>>> id: File<ClientId>,
>>> data: File<ClientData>,
>>> ...
>>> }
>>>
>>> I think that makes much more sense than keeping a Vec<Arc<Client>> *and* a
>>> Vec<File> separately. Also, note that with the above, your Client instances
>>> don't need to be reference counted anymore.
>>>
>>> I think this addresses the concerns below.
>>
>> You still have the issue that `Client` now needs to be pinned and the
>> vector can't be resized. But if you know that it's bounded, then we
>> could just make `Pin<Vec<T>>` work as expected (not relocating the
>> underlying allocation by not exposing `push`, only
>> `push_within_capacity`).
>>
>> We also could have a `SegmentedVec<T>` that doesn't move elements.
>> Essentially it is
>>
>> enum SegmentedVec<T> {
>> Cons(Segment<T>, KBox<SegmentedVec<T>>)
>> Nul,
>> }
>>
>> struct Segment<T> {
>> elements: [T; 16]
>> }
>>
>> or make the segments variable-sized and grow them accordingly.
>
> That sounds a lot like the perfect application for XArray. :)
Haha I didn't know this already existed in the kernel :) Yeah then we
should make XArray work for this use-case.
---
Cheers,
Benno
next prev parent reply other threads:[~2025-07-01 20:03 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-27 23:18 [PATCH v8 0/6] rust: DebugFS Bindings Matthew Maurer
2025-06-27 23:18 ` [PATCH v8 1/6] rust: debugfs: Bind DebugFS directory creation Matthew Maurer
2025-06-27 23:18 ` [PATCH v8 2/6] rust: debugfs: Bind file creation for long-lived Display Matthew Maurer
2025-06-27 23:18 ` [PATCH v8 3/6] rust: types: Support &'static and &'static mut ForeignOwnable Matthew Maurer
2025-07-01 11:41 ` Dirk Behme
2025-07-01 11:46 ` Danilo Krummrich
2025-06-27 23:18 ` [PATCH v8 4/6] rust: debugfs: Support arbitrary owned backing for File Matthew Maurer
2025-06-30 17:29 ` Danilo Krummrich
2025-06-30 17:34 ` Matthew Maurer
2025-06-30 17:36 ` Matthew Maurer
2025-06-30 17:39 ` Danilo Krummrich
2025-06-30 17:49 ` Matthew Maurer
2025-06-30 18:16 ` Danilo Krummrich
2025-07-01 13:58 ` Greg Kroah-Hartman
2025-07-01 14:13 ` Danilo Krummrich
2025-07-01 14:21 ` Greg Kroah-Hartman
2025-07-01 15:10 ` Danilo Krummrich
2025-07-01 18:11 ` Matthew Maurer
2025-07-01 19:21 ` Danilo Krummrich
2025-07-01 19:46 ` Benno Lossin
2025-07-01 19:58 ` Danilo Krummrich
2025-07-01 20:03 ` Benno Lossin [this message]
2025-07-01 20:09 ` Benno Lossin
2025-07-01 20:16 ` Danilo Krummrich
2025-07-01 21:53 ` Matthew Maurer
2025-07-01 22:26 ` Danilo Krummrich
2025-07-01 20:07 ` Benno Lossin
2025-07-03 10:02 ` Alice Ryhl
2025-07-03 10:33 ` Benno Lossin
2025-07-03 10:54 ` Alice Ryhl
2025-07-03 11:41 ` Greg Kroah-Hartman
2025-07-03 12:29 ` Danilo Krummrich
2025-07-03 12:50 ` Greg Kroah-Hartman
2025-07-03 14:00 ` Danilo Krummrich
2025-07-03 13:34 ` Benno Lossin
2025-07-03 14:04 ` Danilo Krummrich
2025-07-03 13:35 ` Benno Lossin
2025-07-03 13:38 ` Alice Ryhl
2025-07-03 12:34 ` Benno Lossin
2025-07-03 12:45 ` Greg Kroah-Hartman
2025-07-03 11:00 ` Danilo Krummrich
2025-06-27 23:18 ` [PATCH v8 5/6] rust: debugfs: Support format hooks Matthew Maurer
2025-06-27 23:18 ` [PATCH v8 6/6] rust: samples: Add debugfs sample Matthew Maurer
2025-07-01 14:03 ` Greg Kroah-Hartman
2025-07-01 17:24 ` Matthew Maurer
2025-07-01 17:34 ` Danilo Krummrich
2025-07-01 18:32 ` Matthew Maurer
2025-07-01 19:40 ` Danilo Krummrich
2025-07-01 10:57 ` [PATCH v8 0/6] rust: DebugFS Bindings Alice Ryhl
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=DB0ZJVL0682F.ZNNOXEIDL5NN@kernel.org \
--to=lossin@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=dirk.behme@de.bosch.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.