[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <DCW41J94TGVG.1OBWEMPAP3EBK@kernel.org>
Date: Thu, 18 Sep 2025 19:42:54 +0200
From: "Danilo Krummrich" <dakr@...nel.org>
To: "Alice Ryhl" <aliceryhl@...gle.com>
Cc: "Greg Kroah-Hartman" <gregkh@...uxfoundation.org>,
Arve Hjønnevåg <arve@...roid.com>, "Todd Kjos"
<tkjos@...roid.com>, "Martijn Coenen" <maco@...roid.com>, "Joel Fernandes"
<joelagnelf@...dia.com>, "Christian Brauner" <brauner@...nel.org>, "Carlos
Llamas" <cmllamas@...gle.com>, "Suren Baghdasaryan" <surenb@...gle.com>,
"Miguel Ojeda" <ojeda@...nel.org>, "Boqun Feng" <boqun.feng@...il.com>,
"Gary Guo" <gary@...yguo.net>, Björn Roy Baron
<bjorn3_gh@...tonmail.com>, "Benno Lossin" <lossin@...nel.org>, "Andreas
Hindborg" <a.hindborg@...nel.org>, "Trevor Gross" <tmgross@...ch.edu>,
"Lorenzo Stoakes" <lorenzo.stoakes@...cle.com>, "Liam R. Howlett"
<Liam.Howlett@...cle.com>, "Paul Moore" <paul@...l-moore.com>, "Serge
Hallyn" <sergeh@...nel.org>, <linux-kernel@...r.kernel.org>,
<rust-for-linux@...r.kernel.org>, "Wedson Almeida Filho"
<wedsonaf@...il.com>, "Matt Gilbride" <mattgilbride@...gle.com>
Subject: Re: [PATCH] rust_binder: add Rust Binder driver
(Far from a full review, but two minor drive-by comments.)
On Thu Sep 18, 2025 at 12:19 PM CEST, Alice Ryhl wrote:
> + /// Register a vma with this page range. Returns the size of the region.
> + pub(crate) fn register_with_vma(&self, vma: &virt::VmaNew) -> Result<usize> {
> + let num_bytes = usize::min(vma.end() - vma.start(), bindings::SZ_4M as usize);
> + let num_pages = num_bytes >> PAGE_SHIFT;
> +
> + if !ptr::eq::<Mm>(&*self.mm, &**vma.mm()) {
> + pr_debug!("Failed to register with vma: invalid vma->vm_mm");
> + return Err(EINVAL);
> + }
> + if num_pages == 0 {
> + pr_debug!("Failed to register with vma: size zero");
> + return Err(EINVAL);
> + }
> +
> + let layout = Layout::array::<PageInfo>(num_pages).map_err(|_| ENOMEM)?;
> + let pages = KVmalloc::alloc(layout, GFP_KERNEL)?.cast::<PageInfo>();
> +
> + // SAFETY: This just initializes the pages array.
> + unsafe {
> + let self_ptr = self as *const ShrinkablePageRange;
> + for i in 0..num_pages {
> + let info = pages.as_ptr().add(i);
> + ptr::addr_of_mut!((*info).range).write(self_ptr);
> + ptr::addr_of_mut!((*info).page).write(None);
> + let lru = ptr::addr_of_mut!((*info).lru);
> + ptr::addr_of_mut!((*lru).next).write(lru);
> + ptr::addr_of_mut!((*lru).prev).write(lru);
I think we should prefer &raw in new code.
> + }
> + }
> +
> + let mut inner = self.lock.lock();
> + if inner.size > 0 {
> + pr_debug!("Failed to register with vma: already registered");
> + drop(inner);
> + // SAFETY: The `pages` array was allocated with the same layout.
> + unsafe { KVmalloc::free(pages.cast(), layout) };
NIT: If you use KVBox instead, even though you convert to a raw pointer later,
you can probably safe one unsafe.
> + return Err(EBUSY);
> + }
> +
> + inner.pages = pages.as_ptr();
> + inner.size = num_pages;
> + inner.vma_addr = vma.start();
> +
> + Ok(num_pages)
> + }
Powered by blists - more mailing lists