From: sashiko-bot@kernel.org
To: "Gary Guo" <gary@garyguo.net>
Cc: dri-devel@lists.freedesktop.org,
"Danilo Krummrich" <dakr@kernel.org>,
linux-pci@vger.kernel.org,
"Alexandre Courbot" <acourbot@nvidia.com>,
ojeda@kernel.org
Subject: Re: [PATCH v6 19/20] rust: io: add copying methods
Date: Mon, 06 Jul 2026 13:09:41 +0000 [thread overview]
Message-ID: <20260706130941.EA2F11F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260706-io_projection-v6-19-72cd5d055d54@garyguo.net>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [High] Exposing `copy_read` and `copy_write` for arbitrary generic types (`T: FromBytes`/`IntoBytes`) on `MmioBackend` maps to stream accessors (`memcpy_{from,to}io`), which bypasses CPU-to-device byte-swapping. This conflates stream and register I/O semantics, creating a severe footgun for MMIO register structs on big-endian architectures.
Pre-existing issues:
- [High] The use of `fence(Ordering::SeqCst)` emits a CPU-domain memory barrier, which is insufficient for synchronizing memory between the CPU and the device (GSP) when updating command queues.
--
commit b39304c44ce9723636b250bacb9f2e99203d514d
Author: Gary Guo <gary@garyguo.net>
rust: io: add copying methods
This commit introduces copy_read and copy_write methods to the Io trait
to allow reading and writing structures and slices. It implements the
IoCopyable trait for I/O backends, mapping the MMIO operations to
memcpy_fromio and memcpy_toio.
> diff --git a/rust/kernel/io.rs b/rust/kernel/io.rs
> index c423125870b75..9df4e982c5d8a 100644
> --- a/rust/kernel/io.rs
> +++ b/rust/kernel/io.rs
[ ... ]
> @@ -442,6 +524,121 @@ fn write_val(self, value: Self::Target)
> Self::Backend::io_write(self.as_view(), value)
> }
>
> + /// Copy-read from I/O memory.
> + ///
> + /// This is equivalent to reading from the I/O memory with byte-wise copy, although the actual
> + /// implementation might be more efficient. There is no atomicity guarantee. Note that for some
> + /// backends (e.g. `Mmio`), this can read different value compared to [`read_val`] as
> + /// byte-swapping is not performed.
> + ///
> + /// [`read_val`]: Io::read_val
> + ///
> + /// # Examples
> + ///
> + /// ```no_run
> + /// # use kernel::io::*;
> + /// # fn test_copy_read(mmio: Mmio<'_, [u8; 6]>) {
> + /// // let mmio: Mmio<'_, [u8; 6]>;
> + /// let val: [u8; 6] = mmio.copy_read();
> + /// # }
> + /// ```
> + #[inline]
> + fn copy_read(self) -> Self::Target
> + where
> + Self::Backend: IoCopyable,
> + Self::Target: Sized + FromBytes,
> + {
> + Self::Backend::copy_read(self.as_view())
> + }
[Severity: High]
Does exposing this generic copy_read() for any FromBytes target conflate
stream and register I/O semantics?
When used with a struct representing MMIO control registers, this method
eventually maps to stream accessors like memcpy_fromio() in MmioBackend,
which bypasses CPU-to-device byte-swapping.
Could this lead to data corruption on big-endian systems, where drivers might
expect the byteswapped register layout but receive unswapped data instead?
Would it be safer to restrict bulk stream copying strictly to [u8] targets
via copy_from_slice and copy_to_slice?
[ ... ]
While reviewing these I/O accessor changes, I also noticed an issue in
the GPU driver code introduced earlier in the series.
drivers/gpu/nova-core/gsp/cmdq.rs:advance_cpu_read_ptr() {
...
// Ensure read pointer is properly ordered.
fence(Ordering::SeqCst);
...
}
drivers/gpu/nova-core/gsp/cmdq.rs:advance_cpu_write_ptr() {
...
// Ensure all command data is visible before triggering the GSP read.
fence(Ordering::SeqCst);
...
}
[Severity: High]
This isn't a bug introduced by this patch, but is this CPU-domain memory
barrier sufficient for synchronizing memory between the CPU and the device
when updating command queues?
Rust's atomic fences map to CPU-domain memory barriers (e.g., dmb ish on
ARM64), which only guarantee ordering within the inner-shareable domain
between CPUs.
To properly order memory accesses visible to a device in the outer-shareable
domain, a device DMA barrier like dma_wmb() or dma_rmb() is strictly
required.
Can using a CPU fence here lead to data corruption or lost commands on weakly
ordered architectures, since the GSP could read stale command payloads before
the CPU writes are visible?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260706-io_projection-v6-0-72cd5d055d54@garyguo.net?part=19
next prev parent reply other threads:[~2026-07-06 13:09 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-06 12:44 [PATCH v6 00/20] rust: I/O type generalization and projection Gary Guo
2026-07-06 12:44 ` [PATCH v6 01/20] rust: io: add dynamically-sized `Region` type Gary Guo
2026-07-06 12:54 ` sashiko-bot
2026-07-07 17:14 ` Daniel Almeida
2026-07-07 20:02 ` Gary Guo
2026-07-08 10:34 ` Miguel Ojeda
2026-07-06 12:44 ` [PATCH v6 02/20] rust: io: add missing safety requirement in `IoCapable` methods Gary Guo
2026-07-06 13:00 ` sashiko-bot
2026-07-07 18:40 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 03/20] rust: io: restrict untyped IO access and `register!` to `Region` Gary Guo
2026-07-06 13:03 ` sashiko-bot
2026-07-08 0:23 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 04/20] rust: io: implement `Io` on reference types instead Gary Guo
2026-07-06 12:53 ` sashiko-bot
2026-07-08 11:58 ` Daniel Almeida
2026-07-08 12:05 ` Gary Guo
2026-07-06 12:44 ` [PATCH v6 05/20] rust: io: generalize `MmioRaw` to pointer to arbitrary type Gary Guo
2026-07-06 12:56 ` sashiko-bot
2026-07-08 12:22 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 06/20] rust: io: rename `Mmio` to `MmioOwned` Gary Guo
2026-07-06 12:57 ` sashiko-bot
2026-07-08 12:26 ` Daniel Almeida
2026-07-08 12:35 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 07/20] rust: io: implement `Mmio` as view type Gary Guo
2026-07-06 12:59 ` sashiko-bot
2026-07-08 13:10 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 08/20] rust: pci: io: make `ConfigSpace` a view Gary Guo
2026-07-06 12:51 ` sashiko-bot
2026-07-08 13:28 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 09/20] rust: io: use view types instead of addresses for `Io` Gary Guo
2026-07-06 12:57 ` sashiko-bot
2026-07-08 14:36 ` Daniel Almeida
2026-07-08 15:25 ` Miguel Ojeda
2026-07-06 12:44 ` [PATCH v6 10/20] pwm: th1520: remove unnecessary `deref` Gary Guo
2026-07-06 12:48 ` sashiko-bot
2026-07-08 14:37 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 11/20] rust: io: remove `MmioOwned` Gary Guo
2026-07-06 12:54 ` sashiko-bot
2026-07-08 14:48 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 12/20] rust: io: move `Io` methods to extension trait Gary Guo
2026-07-06 12:51 ` sashiko-bot
2026-07-08 15:15 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 13/20] rust: io: add projection macro and methods Gary Guo
2026-07-06 12:58 ` sashiko-bot
2026-07-08 17:58 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 14/20] rust: io: add I/O backend for system memory with volatile access Gary Guo
2026-07-06 13:01 ` sashiko-bot
2026-07-11 1:26 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 15/20] rust: io: implement a view type for `Coherent` Gary Guo
2026-07-06 13:03 ` sashiko-bot
2026-07-11 1:32 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 16/20] rust: io: add `read_val` and `write_val` functions on `Io` Gary Guo
2026-07-06 12:59 ` sashiko-bot
2026-07-11 1:56 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 17/20] gpu: nova-core: use I/O projection for cleaner encapsulation Gary Guo
2026-07-06 13:07 ` sashiko-bot
2026-07-06 12:44 ` [PATCH v6 18/20] rust: dma: drop `dma_read!` and `dma_write!` API Gary Guo
2026-07-06 13:10 ` sashiko-bot
2026-07-11 2:04 ` Daniel Almeida
2026-07-06 12:44 ` [PATCH v6 19/20] rust: io: add copying methods Gary Guo
2026-07-06 13:09 ` sashiko-bot [this message]
2026-07-07 12:17 ` Alexandre Courbot
2026-07-06 12:44 ` [PATCH v6 20/20] rust: io: implement `IoSysMap` Gary Guo
2026-07-06 12:59 ` sashiko-bot
2026-07-11 16:10 ` [PATCH v6 00/20] rust: I/O type generalization and projection Danilo Krummrich
2026-07-13 22:46 ` 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=20260706130941.EA2F11F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=acourbot@nvidia.com \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=linux-pci@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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.