All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Gary Guo" <gary@garyguo.net>
Cc: "Danilo Krummrich" <dakr@kernel.org>,
	"Alexandre Courbot" <acourbot@nvidia.com>,
	linux-pci@vger.kernel.org, ojeda@kernel.org,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v5 15/20] rust: io: implement a view type for `Coherent`
Date: Fri, 26 Jun 2026 15:05:18 +0000	[thread overview]
Message-ID: <20260626150519.4D4381F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260626-io_projection-v5-15-d0961471ae50@garyguo.net>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] `CoherentView<'a, T>` automatically implements `Send` when `T: Sync`, but provides an `as_mut()` capability to generate `&mut T`, allowing thread-safety bounds bypass.
- [High] `CoherentView::as_mut` consumes `self` by value on a `Copy` type and returns `&'a mut T`, but its safety documentation fails to require strict exclusivity.
--

commit 12e6f6d7abcd0a26719f3c4f268f24a07774b118
Author: Gary Guo <gary@garyguo.net>

rust: io: implement a view type for `Coherent`

Implement a `CoherentView` type which is a view of `Coherent`. To be able
to give out DMA handles, the view type contains both CPU and DMA pointers,
and the projection method projects both at once.

Delegate most of the `Io` implementation to `SysMemBackend`. Provide a
method to erase the DMA handle and give out a `SysMem` view, if the user
does not need the `dma_handle`.

> diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs
> index 200def84fb69e..ab6504910e4f5 100644
> --- a/rust/kernel/dma.rs
> +++ b/rust/kernel/dma.rs

[ ... ]

> @@ -1133,6 +1140,132 @@ unsafe impl Send for CoherentHandle {}
>  // plain `Copy` values.
>  unsafe impl Sync for CoherentHandle {}
>  
> +/// View type for `Coherent`.
> +///
> +/// This is same as [`SysMem`] but with additional information that allows handing out a DMA handle.
> +pub struct CoherentView<'a, T: ?Sized> {
> +    cpu_addr: SysMem<'a, T>,
> +    dma_handle: DmaAddress,
> +}

[Severity: High]
Since SysMem<'a, T> automatically implements Send when T: Sync, CoherentView
also implements Send when T: Sync.

If T is !Send, can a caller move CoherentView to another thread and call
as_mut() to get a mutable reference? This appears to allow bypassing Rust's
concurrency guarantees and could lead to data races or memory corruption if
the type relies on thread-local invariants.

Note that this same pattern seems to pre-exist in Coherent<T> as well.

[ ... ]

> +    /// Returns a mutable reference to the data in the region.
> +    ///
> +    /// # Safety
> +    ///
> +    /// * Callers must ensure that the device does not read/write to/from memory while the returned
> +    ///   reference is live.
> +    /// * Callers must ensure that this call does not race with a read or write to the same region
> +    ///   while the returned reference is live.
> +    #[inline]
> +    pub unsafe fn as_mut(self) -> &'a mut T {

[Severity: High]
Because CoherentView derives Copy and as_mut() takes self by value instead of
taking a mutable borrow, can a caller call as_mut() multiple times in
succession to create overlapping mutable references?

While the safety documentation requires callers to prevent races, it does
not explicitly require strict exclusivity. Could a caller sequentially use
two aliases without data races, believing they adhered to the safety
contract, but still trigger undefined behavior due to aliasing violations?

This documentation omission might also exist in the preexisting
Coherent::as_mut.

> +        // SAFETY: pointer is aligned and valid per type invariant. Aliasing rule is satisfied per
> +        // safety requirement.
> +        unsafe { &mut *self.cpu_addr.as_ptr() }
> +    }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260626-io_projection-v5-0-d0961471ae50@garyguo.net?part=15

  reply	other threads:[~2026-06-26 15:05 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26 14:45 [PATCH v5 00/20] rust: I/O type generalization and projection Gary Guo
2026-06-26 14:45 ` [PATCH v5 01/20] rust: io: add dynamically-sized `Region` type Gary Guo
2026-06-26 14:52   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 02/20] rust: io: add missing safety requirement in `IoCapable` methods Gary Guo
2026-06-26 15:00   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 03/20] rust: io: restrict untyped IO access and `register!` to `Region` Gary Guo
2026-06-26 15:03   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 04/20] rust: io: implement `Io` on reference types instead Gary Guo
2026-06-26 14:57   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 05/20] rust: io: generalize `MmioRaw` to pointer to arbitrary type Gary Guo
2026-06-26 15:02   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 06/20] rust: io: rename `Mmio` to `MmioOwned` Gary Guo
2026-06-26 14:56   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 07/20] rust: io: implement `Mmio` as view type Gary Guo
2026-06-26 15:01   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 08/20] rust: pci: io: make `ConfigSpace` a view Gary Guo
2026-06-26 14:53   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 09/20] rust: io: use view types instead of addresses for `Io` Gary Guo
2026-06-26 14:55   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 10/20] pwm: th1520: remove unnecessary `deref` Gary Guo
2026-06-26 14:52   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 11/20] rust: io: remove `MmioOwned` Gary Guo
2026-06-26 14:53   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 12/20] rust: io: move `Io` methods to extension trait Gary Guo
2026-06-26 14:56   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 13/20] rust: io: add projection macro and methods Gary Guo
2026-06-26 15:00   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 14/20] rust: io: add I/O backend for system memory with volatile access Gary Guo
2026-06-26 14:57   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 15/20] rust: io: implement a view type for `Coherent` Gary Guo
2026-06-26 15:05   ` sashiko-bot [this message]
2026-06-26 14:45 ` [PATCH v5 16/20] rust: io: add `read_val` and `write_val` functions on `Io` Gary Guo
2026-06-26 14:59   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 17/20] gpu: nova-core: use I/O projection for cleaner encapsulation Gary Guo
2026-06-26 15:06   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 18/20] rust: dma: drop `dma_read!` and `dma_write!` API Gary Guo
2026-06-26 15:12   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 19/20] rust: io: add copying methods Gary Guo
2026-06-26 15:02   ` sashiko-bot
2026-06-26 14:45 ` [PATCH v5 20/20] rust: io: implement `IoSysMap` Gary Guo
2026-06-26 14: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=20260626150519.4D4381F00A3A@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.