diff --git a/rust/helpers/mm.c b/rust/helpers/mm.c index 81b510c96fd2..7b72eb065a3e 100644 --- a/rust/helpers/mm.c +++ b/rust/helpers/mm.c @@ -43,8 +43,3 @@ struct vm_area_struct *rust_helper_vma_lookup(struct mm_struct *mm, { return vma_lookup(mm, addr); } - -void rust_helper_vma_end_read(struct vm_area_struct *vma) -{ - vma_end_read(vma); -} diff --git a/rust/kernel/mm.rs b/rust/kernel/mm.rs index 60dc66972576..ee1a062ec7d7 100644 --- a/rust/kernel/mm.rs +++ b/rust/kernel/mm.rs @@ -18,7 +18,6 @@ use crate::{ use core::{ops::Deref, ptr::NonNull}; pub mod virt; -use virt::VmAreaRef; /// A wrapper for the kernel's `struct mm_struct`. /// @@ -161,36 +160,6 @@ impl MmWithUser { unsafe { &*ptr.cast() } } - /// Attempt to access a vma using the vma read lock. - /// - /// This is an optimistic trylock operation, so it may fail if there is contention. In that - /// case, you should fall back to taking the mmap read lock. - /// - /// When per-vma locks are disabled, this always returns `None`. - #[inline] - pub fn lock_vma_under_rcu(&self, vma_addr: usize) -> Option> { - #[cfg(CONFIG_PER_VMA_LOCK)] - { - // SAFETY: Calling `bindings::lock_vma_under_rcu` is always okay given an mm where - // `mm_users` is non-zero. - let vma = unsafe { bindings::lock_vma_under_rcu(self.as_raw(), vma_addr as _) }; - if !vma.is_null() { - return Some(VmaReadGuard { - // SAFETY: If `lock_vma_under_rcu` returns a non-null ptr, then it points at a - // valid vma. The vma is stable for as long as the vma read lock is held. - vma: unsafe { VmAreaRef::from_raw(vma) }, - _nts: NotThreadSafe, - }); - } - } - - // Silence warnings about unused variables. - #[cfg(not(CONFIG_PER_VMA_LOCK))] - let _ = vma_addr; - - None - } - /// Lock the mmap read lock. #[inline] pub fn mmap_read_lock(&self) -> MmapReadGuard<'_> { @@ -259,32 +228,3 @@ impl Drop for MmapReadGuard<'_> { unsafe { bindings::mmap_read_unlock(self.mm.as_raw()) }; } } - -/// A guard for the vma read lock. -/// -/// # Invariants -/// -/// This `VmaReadGuard` guard owns the vma read lock. -pub struct VmaReadGuard<'a> { - vma: &'a VmAreaRef, - // `vma_end_read` must be called on the same thread as where the lock was taken - _nts: NotThreadSafe, -} - -// Make all `VmAreaRef` methods available on `VmaReadGuard`. -impl Deref for VmaReadGuard<'_> { - type Target = VmAreaRef; - - #[inline] - fn deref(&self) -> &VmAreaRef { - self.vma - } -} - -impl Drop for VmaReadGuard<'_> { - #[inline] - fn drop(&mut self) { - // SAFETY: We hold the read lock by the type invariants. - unsafe { bindings::vma_end_read(self.vma.as_ptr()) }; - } -}