All of lore.kernel.org
 help / color / mirror / Atom feed
From: Danilo Krummrich <dakr@kernel.org>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "Abdiel Janulgue" <abdiel.janulgue@gmail.com>,
	rust-for-linux@vger.kernel.org, daniel.almeida@collabora.com,
	robin.murphy@arm.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>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Valentin Obst" <kernel@valentinobst.de>,
	"open list" <linux-kernel@vger.kernel.org>,
	"Christoph Hellwig" <hch@lst.de>,
	"Marek Szyprowski" <m.szyprowski@samsung.com>,
	airlied@redhat.com,
	"open list:DMA MAPPING HELPERS" <iommu@lists.linux.dev>
Subject: Re: [PATCH v11 2/3] rust: add dma coherent allocator abstraction.
Date: Mon, 27 Jan 2025 14:34:22 +0100	[thread overview]
Message-ID: <Z5eLXn2jo-r4WgGN@pollux> (raw)
In-Reply-To: <CAH5fLgiQcJcR+DYr7g3AfRPufAmM_4ZqHraGsYz7k1vU7=TZ-g@mail.gmail.com>

On Mon, Jan 27, 2025 at 02:25:03PM +0100, Alice Ryhl wrote:
> On Mon, Jan 27, 2025 at 1:14 PM Danilo Krummrich <dakr@kernel.org> wrote:
> >
> > On Mon, Jan 27, 2025 at 11:43:39AM +0100, Alice Ryhl wrote:
> > > On Mon, Jan 27, 2025 at 11:37 AM Danilo Krummrich <dakr@kernel.org> wrote:
> > > >
> > > > On Fri, Jan 24, 2025 at 08:27:36AM +0100, Alice Ryhl wrote:
> > > > > On Thu, Jan 23, 2025 at 11:43 AM Abdiel Janulgue
> > > > > <abdiel.janulgue@gmail.com> wrote:
> > > > > > +    /// Reads data from the region starting from `offset` as a slice.
> > > > > > +    /// `offset` and `count` are in units of `T`, not the number of bytes.
> > > > > > +    ///
> > > > > > +    /// Due to the safety requirements of slice, the data returned should be regarded by the
> > > > > > +    /// caller as a snapshot of the region when this function is called, as the region could
> > > > > > +    /// be modified by the device at anytime. For ringbuffer type of r/w access or use-cases
> > > > > > +    /// where the pointer to the live data is needed, `start_ptr()` or `start_ptr_mut()`
> > > > > > +    /// could be used instead.
> > > > > > +    ///
> > > > > > +    /// # Safety
> > > > > > +    ///
> > > > > > +    /// Callers must ensure that no hardware operations that involve the buffer are currently
> > > > > > +    /// taking place while the returned slice is live.
> > > > > > +    pub unsafe fn as_slice(&self, offset: usize, count: usize) -> Result<&[T]> {
> > > > >
> > > > > You were asked to rename this function because it returns a slice, but
> > > > > I wonder if it's better to take an `&mut [T]` argument and to have
> > > > > this function copy data into that argument. That way, we could make
> > > > > the function itself safe. Perhaps the actual copy needs to be
> > > > > volatile?
> > > >
> > > > Why do we consider the existing one unsafe?
> > > >
> > > > Surely, it's not desirable that the contents of the buffer are modified by the
> > > > HW unexpectedly, but is this a concern in terms of Rust safety requirements?
> > > >
> > > > And if so, how does this go away with the proposed approach?
> > >
> > > In Rust, it is undefined behavior if the value behind an immutable
> > > reference changes (unless the type uses UnsafeCell / Opaque or
> > > similar). That is, any two consecutive reads of the same immutable
> > > reference must return the same byte value no matter what happened in
> > > between those reads.
> >
> > Undefined as in the sense of anything is allowed to happen?
> 
> Yes.
> 
> > I thought undefined
> > as in you might still see the old value on two consecutive reads.
> 
> That is the optimization that motivates this being UB, but it's
> defined as full UB.
> 
> > Do you have a pointer to the corresponding docs?
> 
> Sure, it's on the "behavior considered undefined" page:
> Moreover, the bytes pointed to by a shared reference, including
> transitively through other references (both shared and mutable) and
> Boxes, are immutable; transitivity includes those references stored in
> fields of compound types.
> 
> https://doc.rust-lang.org/reference/behavior-considered-undefined.html#r-undefined.immutable
> 
> > > If we manually perform the read as a volatile read, then it is
> > > arguably allowed for the value to be modified by the hardware while we
> > > read the value.
> >
> > From read_volatile() [1]: "In particular, a race between a read_volatile and any
> > write operation to the same location is undefined behavior."
> 
> I mean, ultimately we are a bit on our own here. In C code you just
> use an ordinary read / write, so we could use the ordinary
> core::ptr::copy_nonoverlapping method to mirror that. We've been told
> from the Rust project that we should just do these kinds of things
> like we do in C - technically these things aren't okay in C either,
> but because LLVM will try to avoid breaking patterns used in the
> kernel, they shouldn't break in Rust either.
> 
> But using an immutable reference should be avoided because that gives
> LLVM optimization hints that we are not giving to LLVM in C code.

Thanks for clarifying.

I think we should add this as a note to the corresponding code.

  reply	other threads:[~2025-01-27 13:34 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-23 10:42 [PATCH v11 0/3] Add dma coherent allocator abstraction Abdiel Janulgue
2025-01-23 10:42 ` [PATCH v11 1/3] rust: error: Add EOVERFLOW Abdiel Janulgue
2025-01-23 10:42 ` [PATCH v11 2/3] rust: add dma coherent allocator abstraction Abdiel Janulgue
2025-01-23 12:30   ` Petr Tesařík
2025-01-23 13:38     ` Abdiel Janulgue
2025-01-23 14:44       ` Miguel Ojeda
2025-01-23 22:54         ` Daniel Almeida
2025-01-24  7:27   ` Alice Ryhl
2025-01-27  6:16     ` Petr Tesařík
2025-01-27  9:45       ` Alice Ryhl
2025-01-27 10:37     ` Danilo Krummrich
2025-01-27 10:43       ` Alice Ryhl
2025-01-27 12:14         ` Danilo Krummrich
2025-01-27 13:25           ` Alice Ryhl
2025-01-27 13:34             ` Danilo Krummrich [this message]
2025-01-27 13:42               ` Alice Ryhl
2025-01-27 16:59         ` Boqun Feng
2025-01-27 18:32           ` Alice Ryhl
2025-01-27 18:38             ` Boqun Feng
2025-01-27 18:46               ` Alice Ryhl
2025-01-27 19:01                 ` Boqun Feng
2025-01-27 19:05                   ` Alice Ryhl
2025-01-27 19:21                     ` Boqun Feng
2025-01-27 19:37                       ` Boqun Feng
2025-01-27 10:52       ` Daniel Almeida
2025-01-27 10:59     ` Daniel Almeida
2025-01-27 11:34       ` Alice Ryhl
2025-01-28 10:22         ` Daniel Almeida
2025-01-28 10:25           ` Alice Ryhl
2025-01-28 10:36             ` Daniel Almeida
2025-01-28 11:28               ` Alice Ryhl
2025-02-15 21:40   ` Daniel Almeida
2025-02-17 13:52     ` Robin Murphy
2025-02-17 17:37       ` Abdiel Janulgue
2025-02-18  9:58       ` Abdiel Janulgue
2025-02-18 12:19         ` Daniel Almeida
2025-02-18 12:44           ` Robin Murphy
2025-01-23 10:42 ` [PATCH v11 3/3] MAINTAINERS: add entry for Rust dma mapping helpers device driver API Abdiel Janulgue
2025-01-30 11:49   ` Robin Murphy
2025-01-30 12:00     ` Danilo Krummrich
2025-02-03  8:37     ` Abdiel Janulgue

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=Z5eLXn2jo-r4WgGN@pollux \
    --to=dakr@kernel.org \
    --cc=a.hindborg@kernel.org \
    --cc=abdiel.janulgue@gmail.com \
    --cc=airlied@redhat.com \
    --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=daniel.almeida@collabora.com \
    --cc=gary@garyguo.net \
    --cc=hch@lst.de \
    --cc=iommu@lists.linux.dev \
    --cc=kernel@valentinobst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=ojeda@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tmgross@umich.edu \
    /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.