All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gary Guo <gary@garyguo.net>
To: Alice Ryhl <aliceryhl@google.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Lorenzo Stoakes" <lorenzo.stoakes@oracle.com>,
	"Vlastimil Babka" <vbabka@suse.cz>,
	"John Hubbard" <jhubbard@nvidia.com>,
	"Liam R. Howlett" <Liam.Howlett@oracle.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Arnd Bergmann" <arnd@arndb.de>, "Jann Horn" <jannh@google.com>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	" Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Trevor Gross" <tmgross@umich.edu>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v14 3/8] mm: rust: add vm_insert_page
Date: Tue, 25 Feb 2025 16:06:03 +0000	[thread overview]
Message-ID: <20250225160603.4d4a2893@eugeo> (raw)
In-Reply-To: <20250213-vma-v14-3-b29c47ab21f5@google.com>

On Thu, 13 Feb 2025 11:04:02 +0000
Alice Ryhl <aliceryhl@google.com> wrote:

> The vm_insert_page method is only usable on vmas with the VM_MIXEDMAP
> flag, so we introduce a new type to keep track of such vmas.
> 
> The approach used in this patch assumes that we will not need to encode
> many flag combinations in the type. I don't think we need to encode more
> than VM_MIXEDMAP and VM_PFNMAP as things are now. However, if that
> becomes necessary, using generic parameters in a single type would scale
> better as the number of flags increases.
> 
> Acked-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
> Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>

LGTM, so:

Reviewed-by: Gary Guo <gary@garyguo.net>

BTW, any reason that this specialised type is called
`VmaMixedMap` but the base type is called `VmaRef` rather than just
`Vma`?

Best,
Gary

> ---
>  rust/kernel/mm/virt.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 78 insertions(+), 1 deletion(-)
> 
> diff --git a/rust/kernel/mm/virt.rs b/rust/kernel/mm/virt.rs
> index a66be649f0b8..3e2eabcc2145 100644
> --- a/rust/kernel/mm/virt.rs
> +++ b/rust/kernel/mm/virt.rs
> @@ -14,7 +14,15 @@
>  //! 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, mm::MmWithUser, types::Opaque};
> +use crate::{
> +    bindings,
> +    error::{to_result, Result},
> +    mm::MmWithUser,
> +    page::Page,
> +    types::Opaque,
> +};
> +
> +use core::ops::Deref;
>  
>  /// A wrapper for the kernel's `struct vm_area_struct` with read access.
>  ///
> @@ -119,6 +127,75 @@ pub fn zap_page_range_single(&self, address: usize, size: usize) {
>              bindings::zap_page_range_single(self.as_ptr(), address, size, core::ptr::null_mut())
>          };
>      }
> +
> +    /// If the [`VM_MIXEDMAP`] flag is set, returns a [`VmaMixedMap`] 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<&VmaMixedMap> {
> +        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 `VmaRef`.
> +            Some(unsafe { VmaMixedMap::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 [`VmaRef`] 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 VmaMixedMap {
> +    vma: VmaRef,
> +}
> +
> +// Make all `VmaRef` methods available on `VmaMixedMap`.
> +impl Deref for VmaMixedMap {
> +    type Target = VmaRef;
> +
> +    #[inline]
> +    fn deref(&self) -> &VmaRef {
> +        &self.vma
> +    }
> +}
> +
> +impl VmaMixedMap {
> +    /// 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, page.as_ptr()) })
> +    }
>  }
>  
>  /// The integer type used for vma flags.
> 


  reply	other threads:[~2025-02-25 16:06 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-13 11:03 [PATCH v14 0/8] Rust support for mm_struct, vm_area_struct, and mmap Alice Ryhl
2025-02-13 11:04 ` [PATCH v14 1/8] mm: rust: add abstraction for struct mm_struct Alice Ryhl
2025-02-25 15:56   ` Gary Guo
2025-02-13 11:04 ` [PATCH v14 2/8] mm: rust: add vm_area_struct methods that require read access Alice Ryhl
2025-02-25 16:01   ` Gary Guo
2025-02-13 11:04 ` [PATCH v14 3/8] mm: rust: add vm_insert_page Alice Ryhl
2025-02-25 16:06   ` Gary Guo [this message]
2025-02-25 16:14     ` Alice Ryhl
2025-02-13 11:04 ` [PATCH v14 4/8] mm: rust: add lock_vma_under_rcu Alice Ryhl
2025-02-25 16:28   ` Gary Guo
2025-02-13 11:04 ` [PATCH v14 5/8] mm: rust: add mmput_async support Alice Ryhl
2025-02-25 16:16   ` Gary Guo
2025-02-13 11:04 ` [PATCH v14 6/8] mm: rust: add VmaNew for f_ops->mmap() Alice Ryhl
2025-02-25 16:24   ` Gary Guo
2025-02-25 16:25     ` Alice Ryhl
2025-02-13 11:04 ` [PATCH v14 7/8] rust: miscdevice: add mmap support Alice Ryhl
2025-02-25 16:29   ` Gary Guo
2025-02-13 11:04 ` [PATCH v14 8/8] task: rust: rework how current is accessed Alice Ryhl
2025-02-25 16:32   ` Gary Guo
2025-02-13 11:14 ` [PATCH v14 0/8] Rust support for mm_struct, vm_area_struct, and mmap Lorenzo Stoakes
2025-02-13 11:32   ` Miguel Ojeda
2025-02-13 11:50     ` Lorenzo Stoakes
2025-02-13 11:53       ` Alice Ryhl
2025-02-13 11:56         ` Lorenzo Stoakes
2025-02-13 12:03       ` Miguel Ojeda
2025-02-13 12:16         ` Lorenzo Stoakes
2025-02-13 19:46           ` Liam R. Howlett
2025-02-14 11:56             ` Alice Ryhl
2025-02-14 12:20               ` Lorenzo Stoakes
2025-02-14 16:09                 ` Liam R. Howlett
2025-02-14 18:04                   ` Miguel Ojeda
2025-02-14 18:19                     ` Liam R. Howlett
2025-02-28  9:49                 ` Lorenzo Stoakes
2025-03-03 19:04                   ` Andreas Hindborg
2025-03-04 11:53                     ` Lorenzo Stoakes
2025-02-13 19:52           ` Miguel Ojeda
2025-02-13 19:47 ` Liam R. Howlett

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=20250225160603.4d4a2893@eugeo \
    --to=gary@garyguo.net \
    --cc=Liam.Howlett@oracle.com \
    --cc=a.hindborg@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=arnd@arndb.de \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jannh@google.com \
    --cc=jhubbard@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lorenzo.stoakes@oracle.com \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=surenb@google.com \
    --cc=tmgross@umich.edu \
    --cc=vbabka@suse.cz \
    --cc=willy@infradead.org \
    /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.