Linux PCI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Gary Guo" <gary@garyguo.net>
Cc: ojeda@kernel.org, "Alexandre Courbot" <acourbot@nvidia.com>,
	"Danilo Krummrich" <dakr@kernel.org>,
	dri-devel@lists.freedesktop.org, linux-pci@vger.kernel.org
Subject: Re: [PATCH v6 18/20] rust: dma: drop `dma_read!` and `dma_write!` API
Date: Mon, 06 Jul 2026 13:10:33 +0000	[thread overview]
Message-ID: <20260706131034.175F51F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260706-io_projection-v6-18-72cd5d055d54@garyguo.net>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

Pre-existing issues:
- [High] The memory barrier intended to order command data writes before the doorbell ring is placed after the doorbell is updated, failing to prevent the hardware from reading stale command data.
- [High] Missing read memory barrier after reading the GSP write pointer doorbell, which can cause the CPU to read stale message queue data due to speculative execution or memory reordering.
--

commit 4f52030a2d0bed4fa2789f818006faedda8d1221
Author: Gary Guo <gary@garyguo.net>

rust: dma: drop dma_read! and dma_write! API

This patch removes the dma_read and dma_write APIs. It states that primitive
read and write use cases are now covered by the io_read and io_write macros,
and non-primitive cases should use CoherentBox or as_ref/as_mut to ensure
lack of concurrent access.

[ ... ]

> --- a/drivers/gpu/nova-core/gsp/cmdq.rs
> +++ b/drivers/gpu/nova-core/gsp/cmdq.rs
> @@ -317,7 +317,7 @@
>      fn driver_read_area(&self) -> (&[[u8; GSP_PAGE_SIZE]], &[[u8; GSP_PAGE_SIZE]]) {
>          let tx = self.gsp_write_ptr();
>          let rx = self.cpu_read_ptr();
>  
>          // Pointer to the first entry of the GSP message queue.
>          let data = ptr::project!(self.0.as_ptr(), .gspq.msgq.data[build: 0]);
>  
>          let (tail_end, wrap_end) = if rx <= tx {

[Severity: High]
This isn't a bug introduced by this patch, but is a read memory barrier needed
after reading the GSP write pointer doorbell?

When polling the GSP write pointer via self.gsp_write_ptr(), there is no
intervening Acquire memory barrier (such as fence(Ordering::Acquire) or
dma_rmb()) before the buffer is accessed via slice creation.

On weakly-ordered memory models like ARM64, could the CPU speculatively prefetch
the message data before the doorbell read completes or is validated, causing the
driver to read stale message queue data?

>              // Read area is non-wrapping and stops right before tx.
>              (tx, 0)

[ ... ]

> @@ -448,7 +448,7 @@
>      fn advance_cpu_write_ptr(&mut self, elem_count: u32) {
>          let tx = io_project!(self.0, .cpuq.tx);
>          let wptr = MsgqTxHeader::write_ptr(tx).wrapping_add(elem_count) % MSGQ_NUM_PAGES;
>          MsgqTxHeader::set_write_ptr(tx, wptr);
>  
>          // Ensure all command data is visible before triggering the GSP read.
>          fence(Ordering::SeqCst);

[Severity: High]
This is a pre-existing issue, but is the memory barrier placed correctly here?

The fence is placed after the volatile write to the doorbell
(MsgqTxHeader::set_write_ptr). Without a barrier before the doorbell write,
couldn't the CPU or compiler reorder the doorbell volatile write to become
globally visible before the preceding command data writes?

If so, could the GSP observe the updated doorbell and process the command before
the payload is actually flushed to memory, leading to the hardware reading stale
command data?

>      }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260706-io_projection-v6-0-72cd5d055d54@garyguo.net?part=18

  reply	other threads:[~2026-07-06 13:10 UTC|newest]

Thread overview: 41+ 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-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-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-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-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-06 12:44 ` [PATCH v6 06/20] rust: io: rename `Mmio` to `MmioOwned` Gary Guo
2026-07-06 12:57   ` sashiko-bot
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-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-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-06 12:44 ` [PATCH v6 10/20] pwm: th1520: remove unnecessary `deref` Gary Guo
2026-07-06 12:48   ` sashiko-bot
2026-07-06 12:44 ` [PATCH v6 11/20] rust: io: remove `MmioOwned` Gary Guo
2026-07-06 12:54   ` sashiko-bot
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-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-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-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-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-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 [this message]
2026-07-06 12:44 ` [PATCH v6 19/20] rust: io: add copying methods Gary Guo
2026-07-06 13:09   ` sashiko-bot
2026-07-06 12:44 ` [PATCH v6 20/20] rust: io: implement `IoSysMap` Gary Guo
2026-07-06 12:59   ` sashiko-bot

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=20260706131034.175F51F000E9@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox