diff --git a/rust/kernel/mm/virt.rs b/rust/kernel/mm/virt.rs index ab89a526d3e4..2c7de0460e0a 100644 --- a/rust/kernel/mm/virt.rs +++ b/rust/kernel/mm/virt.rs @@ -14,15 +14,7 @@ //! ensures that you can't, for example, accidentally call a function that requires holding the //! write lock when you only hold the read lock. -use crate::{ - bindings, - error::{to_result, Result}, - mm::MmWithUser, - page::Page, - types::Opaque, -}; - -use core::ops::Deref; +use crate::{bindings, mm::MmWithUser, types::Opaque}; /// A wrapper for the kernel's `struct vm_area_struct` with read access. /// @@ -132,75 +124,6 @@ impl VmAreaRef { ) }; } - - /// If the [`VM_MIXEDMAP`] flag is set, returns a [`VmAreaMixedMap`] to this VMA, otherwise - /// returns `None`. - /// - /// This can be used to access methods that require [`VM_MIXEDMAP`] to be set. - /// - /// [`VM_MIXEDMAP`]: flags::MIXEDMAP - #[inline] - pub fn as_mixedmap_vma(&self) -> Option<&VmAreaMixedMap> { - if self.flags() & flags::MIXEDMAP != 0 { - // SAFETY: We just checked that `VM_MIXEDMAP` is set. All other requirements are - // satisfied by the type invariants of `VmAreaRef`. - Some(unsafe { VmAreaMixedMap::from_raw(self.as_ptr()) }) - } else { - None - } - } -} - -/// A wrapper for the kernel's `struct vm_area_struct` with read access and [`VM_MIXEDMAP`] set. -/// -/// It represents an area of virtual memory. -/// -/// This struct is identical to [`VmAreaRef`] except that it must only be used when the -/// [`VM_MIXEDMAP`] flag is set on the vma. -/// -/// # Invariants -/// -/// The caller must hold the mmap read lock or the vma read lock. The `VM_MIXEDMAP` flag must be -/// set. -/// -/// [`VM_MIXEDMAP`]: flags::MIXEDMAP -#[repr(transparent)] -pub struct VmAreaMixedMap { - vma: VmAreaRef, -} - -// Make all `VmAreaRef` methods available on `VmAreaMixedMap`. -impl Deref for VmAreaMixedMap { - type Target = VmAreaRef; - - #[inline] - fn deref(&self) -> &VmAreaRef { - &self.vma - } -} - -impl VmAreaMixedMap { - /// Access a virtual memory area given a raw pointer. - /// - /// # Safety - /// - /// Callers must ensure that `vma` is valid for the duration of 'a, and that the mmap read lock - /// (or stronger) is held for at least the duration of 'a. The `VM_MIXEDMAP` flag must be set. - #[inline] - pub unsafe fn from_raw<'a>(vma: *const bindings::vm_area_struct) -> &'a Self { - // SAFETY: The caller ensures that the invariants are satisfied for the duration of 'a. - unsafe { &*vma.cast() } - } - - /// Maps a single page at the given address within the virtual memory area. - /// - /// This operation does not take ownership of the page. - #[inline] - pub fn vm_insert_page(&self, address: usize, page: &Page) -> Result { - // SAFETY: By the type invariant of `Self` caller has read access and has verified that - // `VM_MIXEDMAP` is set. By invariant on `Page` the page has order 0. - to_result(unsafe { bindings::vm_insert_page(self.as_ptr(), address as _, page.as_ptr()) }) - } } /// The integer type used for vma flags.