From: "Danilo Krummrich" <dakr@kernel.org>
To: "Timur Tabi" <ttabi@nvidia.com>
Cc: Gary Guo <gary@garyguo.net>, Alice Ryhl <aliceryhl@google.com>,
mmaurer@google.com, Alexandre Courbot <acourbot@nvidia.com>,
Joel Fernandes <joelagnelf@nvidia.com>,
nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v6 2/7] rust: uaccess: add write_dma() for copying from DMA buffers to userspace
Date: Sat, 31 Jan 2026 01:14:53 +0100 [thread overview]
Message-ID: <DG2CANK7QMY0.2W8S2R1ZML3UW@kernel.org> (raw)
In-Reply-To: <20260129022837.4133832-3-ttabi@nvidia.com>
On Thu Jan 29, 2026 at 3:28 AM CET, Timur Tabi wrote:
> + /// Writes raw data to this user pointer from a DMA coherent allocation.
> + ///
> + /// Returns error if the offset+count exceeds the allocation size.
> + ///
> + /// Fails with [`EFAULT`] if the write happens on a bad address, or if the write goes out of
> + /// bounds of this [`UserSliceWriter`]. This call may modify the associated userspace slice
> + /// even if it returns an error.
> + ///
> + /// Note: The memory may be concurrently modified by hardware (e.g., DMA). In such cases,
> + /// the copied data may be inconsistent, but this does not cause undefined behavior.
> + pub fn write_dma(
> + &mut self,
> + alloc: &CoherentAllocation<u8>,
> + offset: usize,
> + count: usize,
> + ) -> Result {
> + let len = alloc.count();
> + if offset.checked_add(count).ok_or(EOVERFLOW)? > len {
> + return Err(ERANGE);
> + }
> +
> + // SAFETY: `start_ptr()` returns a valid pointer to a memory region of `count()` bytes,
> + // as guaranteed by the `CoherentAllocation` invariants. The check above ensures
> + // `offset + count <= len`.
> + let src_ptr = unsafe { alloc.start_ptr().add(offset) };
> +
> + // SAFETY: `src_ptr` is valid for reads of `count` bytes per the above.
> + let res = unsafe {
> + bindings::copy_to_user(self.ptr.as_mut_ptr(), src_ptr.cast::<c_void>(), count)
> + };
> + if res != 0 {
> + return Err(EFAULT);
> + }
> +
> + self.ptr = self.ptr.wrapping_byte_add(count);
> + self.length -= count;
> +
> + Ok(())
> + }
I think the idea was to have a common read_slice_raw() method that can be shared
between write_dma() and write_slice(). Can you please factor this out?
WARNING: multiple messages have this Message-ID (diff)
From: "Danilo Krummrich" <dakr@kernel.org>
To: "Timur Tabi" <ttabi@nvidia.com>
Cc: "Gary Guo" <gary@garyguo.net>,
"Alice Ryhl" <aliceryhl@google.com>, <mmaurer@google.com>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"John Hubbard" <jhubbard@nvidia.com>,
"Joel Fernandes" <joelagnelf@nvidia.com>,
<nouveau@lists.freedesktop.org>, <rust-for-linux@vger.kernel.org>
Subject: Re: [PATCH v6 2/7] rust: uaccess: add write_dma() for copying from DMA buffers to userspace
Date: Sat, 31 Jan 2026 01:14:53 +0100 [thread overview]
Message-ID: <DG2CANK7QMY0.2W8S2R1ZML3UW@kernel.org> (raw)
In-Reply-To: <20260129022837.4133832-3-ttabi@nvidia.com>
On Thu Jan 29, 2026 at 3:28 AM CET, Timur Tabi wrote:
> + /// Writes raw data to this user pointer from a DMA coherent allocation.
> + ///
> + /// Returns error if the offset+count exceeds the allocation size.
> + ///
> + /// Fails with [`EFAULT`] if the write happens on a bad address, or if the write goes out of
> + /// bounds of this [`UserSliceWriter`]. This call may modify the associated userspace slice
> + /// even if it returns an error.
> + ///
> + /// Note: The memory may be concurrently modified by hardware (e.g., DMA). In such cases,
> + /// the copied data may be inconsistent, but this does not cause undefined behavior.
> + pub fn write_dma(
> + &mut self,
> + alloc: &CoherentAllocation<u8>,
> + offset: usize,
> + count: usize,
> + ) -> Result {
> + let len = alloc.count();
> + if offset.checked_add(count).ok_or(EOVERFLOW)? > len {
> + return Err(ERANGE);
> + }
> +
> + // SAFETY: `start_ptr()` returns a valid pointer to a memory region of `count()` bytes,
> + // as guaranteed by the `CoherentAllocation` invariants. The check above ensures
> + // `offset + count <= len`.
> + let src_ptr = unsafe { alloc.start_ptr().add(offset) };
> +
> + // SAFETY: `src_ptr` is valid for reads of `count` bytes per the above.
> + let res = unsafe {
> + bindings::copy_to_user(self.ptr.as_mut_ptr(), src_ptr.cast::<c_void>(), count)
> + };
> + if res != 0 {
> + return Err(EFAULT);
> + }
> +
> + self.ptr = self.ptr.wrapping_byte_add(count);
> + self.length -= count;
> +
> + Ok(())
> + }
I think the idea was to have a common read_slice_raw() method that can be shared
between write_dma() and write_slice(). Can you please factor this out?
next prev parent reply other threads:[~2026-01-31 0:15 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-29 2:28 [PATCH v6 0/7] gpu: nova-core: expose the logging buffers via debugfs Timur Tabi
2026-01-29 2:28 ` [PATCH v6 1/7] rust: device: add device name method Timur Tabi
2026-01-29 2:28 ` [PATCH v6 2/7] rust: uaccess: add write_dma() for copying from DMA buffers to userspace Timur Tabi
2026-01-29 17:24 ` Gary Guo
2026-01-31 0:14 ` Danilo Krummrich [this message]
2026-01-31 0:14 ` Danilo Krummrich
2026-01-29 2:28 ` [PATCH v6 3/7] gpu: nova-core: implement BinaryWriter for CoherentAllocation<u8> Timur Tabi
2026-01-30 8:31 ` Alice Ryhl
2026-01-30 8:31 ` Alice Ryhl
2026-01-30 18:53 ` Timur Tabi
2026-01-30 18:53 ` Timur Tabi
2026-01-29 2:28 ` [PATCH v6 4/7] gpu: nova-core: Replace module_pci_driver! with explicit module init Timur Tabi
2026-01-29 2:28 ` [PATCH v6 5/7] gpu: nova-core: use pin projection in method boot() Timur Tabi
2026-01-29 2:28 ` [PATCH v6 6/7] gpu: nova-core: create debugfs root in module init Timur Tabi
2026-01-30 8:34 ` Alice Ryhl
2026-01-30 8:34 ` Alice Ryhl
2026-01-30 14:59 ` Timur Tabi
2026-01-30 14:59 ` Timur Tabi
2026-01-29 2:28 ` [PATCH v6 7/7] gpu: nova-core: create GSP-RM logging buffers debugfs entries Timur Tabi
2026-01-30 23:36 ` Timur Tabi
2026-01-30 23:58 ` Gary Guo
2026-01-31 0:07 ` John Hubbard
2026-01-31 0:10 ` Danilo Krummrich
2026-01-31 0:10 ` Danilo Krummrich
2026-01-31 0:16 ` John Hubbard
2026-01-31 0:16 ` John Hubbard
2026-01-31 0:20 ` Danilo Krummrich
2026-01-31 0:20 ` Danilo Krummrich
2026-01-31 0:24 ` John Hubbard
2026-01-31 0:24 ` John Hubbard
2026-01-31 4:11 ` Timur Tabi
2026-01-31 0:26 ` Timur Tabi
2026-01-31 0:26 ` Timur Tabi
2026-01-31 0:35 ` Danilo Krummrich
2026-01-31 0:35 ` Danilo Krummrich
2026-01-31 0:51 ` Timur Tabi
2026-01-31 0:51 ` Timur Tabi
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=DG2CANK7QMY0.2W8S2R1ZML3UW@kernel.org \
--to=dakr@kernel.org \
--cc=acourbot@nvidia.com \
--cc=aliceryhl@google.com \
--cc=gary@garyguo.net \
--cc=joelagnelf@nvidia.com \
--cc=mmaurer@google.com \
--cc=nouveau@lists.freedesktop.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=ttabi@nvidia.com \
/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.