[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <D8KJVUZUHCMQ.1WS0MBO4ZJLLM@proton.me>
Date: Wed, 19 Mar 2025 21:12:01 +0000
From: Benno Lossin <benno.lossin@...ton.me>
To: Christian Schrefl <chrisi.schrefl@...il.com>, Alice Ryhl <aliceryhl@...gle.com>, Andreas Hindborg <a.hindborg@...nel.org>
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>, Alexander Viro <viro@...iv.linux.org.uk>, Arnd Bergmann <arnd@...db.de>, Miguel Ojeda <ojeda@...nel.org>, Boqun Feng <boqun.feng@...il.com>, Gary Guo <gary@...yguo.net>, Björn Roy Baron <bjorn3_gh@...tonmail.com>, Trevor Gross <tmgross@...ch.edu>, Danilo Krummrich <dakr@...nel.org>, Matthew Maurer <mmaurer@...gle.com>, Lee Jones <lee@...nel.org>, linux-kernel@...r.kernel.org, rust-for-linux@...r.kernel.org
Subject: Re: [PATCH 2/5] rust: iov: add iov_iter abstractions for ITER_DEST
On Wed Mar 19, 2025 at 9:01 PM CET, Christian Schrefl wrote:
> On 19.03.25 8:14 PM, Andreas Hindborg wrote:
>> "Christian Schrefl" <chrisi.schrefl@...il.com> writes:
>>> On 11.03.25 3:25 PM, Alice Ryhl wrote:
>>>> +/// An IO vector that acts as a destination for data.
>>>> +///
>>>> +/// # Invariants
>>>> +///
>>>> +/// Must hold a valid `struct iov_iter` with `data_source` set to `ITER_DEST`. The buffers
>>>> +/// referenced by the IO vector must be valid for writing for the duration of `'data`.
>>>> +///
>>>> +/// Note that if the IO vector is backed by a userspace pointer, it is always considered valid for
>>>> +/// writing.
>>>> +#[repr(transparent)]
>>>> +pub struct IovIterDest<'data> {
>>>> + iov: Opaque<bindings::iov_iter>,
>>>> + /// Represent to the type system that this value contains a pointer to writable data it does
>>>> + /// not own.
>>>> + _source: PhantomData<&'data mut [u8]>,
>>>> +}
>>>
>>> It might be a bit nicer to add a (private) struct 'IovIter' that implements the common operations.
>>> Then 'IovIterDest' and 'IovIterSource' could store that struct and forward the implementations to
>>> it.
>>> But I'm not sure if that's really much better.
>>
>> Yea, I was thinking the same. Maybe we could have an `IovInner` and a
>> local `AsIovInner` trait that would give all the shared methods?
>>
>> I am sure Alice knows the idiomatic way to achieve code sharing here.
>>
>
> It would also be possible to use generics here.
>
> Something like (Maybe using types instead of the const-generic):
>
> pub struct IovIter<const DEST: bool> {
> ...
> }
>
> impl <const DEST: bool> IovIter<DEST> {
> // Common functions
> }
>
> impl IovIter<false> {
> // Source functions
> }
>
> impl IovIter<false> {
> // Dest functions
> }
I would prefer generic types, so `IovIter<Dest>` similar to what Danilo
implemented for `Device<Core>` and `Device<Normal>`. `false` and `true`
aren't descriptive and you also made a typo above :)
---
Cheers,
Benno
Powered by blists - more mailing lists