Re: [PATCH] rust_binder: add Rust Binder driver
From: Danilo Krummrich
Date: Thu Sep 18 2025 - 13:43:04 EST
(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)
> + }