linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andreas Hindborg <a.hindborg@kernel.org>
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>,
	"Christian Brauner" <brauner@kernel.org>,
	"Jann Horn" <jannh@google.com>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Trevor Gross" <tmgross@umich.edu>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v11 6/8] mm: rust: add VmAreaNew for f_ops->mmap()
Date: Wed, 15 Jan 2025 10:57:49 +0100	[thread overview]
Message-ID: <87o708e6w2.fsf@kernel.org> (raw)
In-Reply-To: <CAH5fLgiFzFyVPNSjAkEBvK5Uk-OgaOHDujdXHBeLRZBVaf=Fhg@mail.gmail.com> (Alice Ryhl's message of "Mon, 13 Jan 2025 11:17:06 +0100")

"Alice Ryhl" <aliceryhl@google.com> writes:

> On Thu, Jan 9, 2025 at 9:19 AM Andreas Hindborg <a.hindborg@kernel.org> wrote:
>>
>> "Alice Ryhl" <aliceryhl@google.com> writes:
>>
>> > On Mon, Dec 16, 2024 at 3:51 PM Andreas Hindborg <a.hindborg@kernel.org> wrote:
>> >>
>> >> "Alice Ryhl" <aliceryhl@google.com> writes:
>> >>
>> >> > This type will be used when setting up a new vma in an f_ops->mmap()
>> >> > hook. Using a separate type from VmAreaRef allows us to have a separate
>> >> > set of operations that you are only able to use during the mmap() hook.
>> >> > For example, the VM_MIXEDMAP flag must not be changed after the initial
>> >> > setup that happens during the f_ops->mmap() hook.
>> >> >
>> >> > To avoid setting invalid flag values, the methods for clearing
>> >> > VM_MAYWRITE and similar involve a check of VM_WRITE, and return an error
>> >> > if VM_WRITE is set. Trying to use `try_clear_maywrite` without checking
>> >> > the return value results in a compilation error because the `Result`
>> >> > type is marked #[must_use].
>> >> >
>> >> > For now, there's only a method for VM_MIXEDMAP and not VM_PFNMAP. When
>> >> > we add a VM_PFNMAP method, we will need some way to prevent you from
>> >> > setting both VM_MIXEDMAP and VM_PFNMAP on the same vma.
>> >> >
>> >> > Acked-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> (for mm bits)
>> >> > Reviewed-by: Jann Horn <jannh@google.com>
>> >> > Signed-off-by: Alice Ryhl <aliceryhl@google.com>
>> >> > ---
>> >> >  rust/kernel/mm/virt.rs | 181 ++++++++++++++++++++++++++++++++++++++++++++++++-
>> >> >  1 file changed, 180 insertions(+), 1 deletion(-)
>> >> >
>> >> > diff --git a/rust/kernel/mm/virt.rs b/rust/kernel/mm/virt.rs
>> >> > index 3a23854e14f4..6d9ba56d4f95 100644
>> >> > --- a/rust/kernel/mm/virt.rs
>> >> > +++ b/rust/kernel/mm/virt.rs
>> >> > @@ -6,7 +6,7 @@
>> >> >
>> >> >  use crate::{
>> >> >      bindings,
>> >> > -    error::{to_result, Result},
>> >> > +    error::{code::EINVAL, to_result, Result},
>> >> >      mm::MmWithUser,
>> >> >      page::Page,
>> >> >      types::Opaque,
>> >> > @@ -171,6 +171,185 @@ pub fn vm_insert_page(&self, address: usize, page: &Page) -> Result {
>> >> >      }
>> >> >  }
>> >> >
>> >> > +/// A builder for setting up a vma in an `f_ops->mmap()` hook.
>> >>
>> >> Reading this line, I would expect to be able to chain update methods as
>> >> in `Builder::new().prop_a().prop_b().build()`. Could/should this type
>> >> accommodate a proper builder pattern? Or is "builder" not the right word
>> >> to use here?
>> >
>> > You cannot create values of this type yourself. Only the C
>> > infrastructure can do so.
>> >
>> > What would you call it if not "builder"?
>>
>> It looks more like a newtype with a bunch of setters and getters. It
>> also does not have a method to instantiate (`build()` or similar). So
>> how about newtype?
>
> I don't think newtype is helpful. Ultimately, the f_ops->mmap() hook
> is a *constructor* for a VMA, and the VmAreaNew type represents a VMA
> whose constructor is currently running. The "method to instantiate" is
> called "return".
>
> fn mmap(new_vma: &VmAreaNew) -> Result {
>     // VMAs for this driver must not be mapped as executable
>     new_vma.try_clear_may_exec()?;
>
>     // we are done constructing the vma, so return
>     Ok(())
> }
>
> Alice

Right. Let's update the docs for the `mmap` hook then:

+    /// Handle for mmap.
+    fn mmap(
+        _device: <Self::Ptr as ForeignOwnable>::Borrowed<'_>,
+        _file: &File,
+        _vma: &VmAreaNew,
+    ) -> Result {
+        kernel::build_error!(VTABLE_DEFAULT_ERROR)
+    }
+

```
Handle for mmap.

This function is invoked when a user space process invokes the `mmap`
system call on `_file`. The function is a callback that is part of the
VMA initializer. The kernel will do initial setup of the VMA before
calling this function. The function can then interact with the VMA
initialization by calling methods of `_vma`. If the function does not
return an error, the kernel will complete intialization of the VMA
according to the properties of `_vma`.
```

But I still do not think "builder" is the right term. `VmAreaNew` is
more like a configuration object to pass initialization properties of
the VMA back to the kernel.

How about "configuration object"?


Best regards,
Andreas Hindborg




  reply	other threads:[~2025-01-15 11:03 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <nGnC07PmUqofHiX7HfZAOCIK1-CPS7DF8kdGhDgJgPts5KYrCrimmovP-4YMVgI7WRmFnGwbdndTtxCfp278cg==@protonmail.internalid>
2024-12-11 10:37 ` [PATCH v11 0/8] Rust support for mm_struct, vm_area_struct, and mmap Alice Ryhl
2024-12-11 10:37   ` [PATCH v11 1/8] mm: rust: add abstraction for struct mm_struct Alice Ryhl
2024-12-16 11:31     ` Andreas Hindborg
2025-01-13  9:53       ` Alice Ryhl
2025-01-14 15:48         ` Lorenzo Stoakes
2025-01-15  1:54           ` John Hubbard
2025-01-15 12:13             ` Lorenzo Stoakes
2025-01-15 10:36         ` Andreas Hindborg
2025-01-15 20:20           ` John Hubbard
2025-01-17  0:45     ` Balbir Singh
2025-01-17 12:47       ` Alice Ryhl
2024-12-11 10:37   ` [PATCH v11 2/8] mm: rust: add vm_area_struct methods that require read access Alice Ryhl
2024-12-16 12:12     ` Andreas Hindborg
2025-01-08 12:21       ` Alice Ryhl
2025-01-09  8:02         ` Andreas Hindborg
2025-01-09  8:19           ` Lorenzo Stoakes
2025-01-09  9:50             ` Andreas Hindborg
2025-01-09 11:29               ` Lorenzo Stoakes
2025-01-09 15:32                 ` Andreas Hindborg
2025-01-13 14:45                   ` Lorenzo Stoakes
2025-01-14  9:50                     ` Alice Ryhl
2025-01-14 11:57                       ` Lorenzo Stoakes
2025-01-14 13:42                         ` Alice Ryhl
2025-01-14 15:33                           ` Lorenzo Stoakes
2025-01-15 11:02                         ` Andreas Hindborg
2025-01-15 11:04                           ` Alice Ryhl
2024-12-11 10:37   ` [PATCH v11 3/8] mm: rust: add vm_insert_page Alice Ryhl
2024-12-16 12:25     ` Andreas Hindborg
2025-01-13 10:02       ` Alice Ryhl
2025-01-15  9:33         ` Andreas Hindborg
2024-12-11 10:37   ` [PATCH v11 4/8] mm: rust: add lock_vma_under_rcu Alice Ryhl
2024-12-16 12:47     ` Andreas Hindborg
2025-01-13 10:04       ` Alice Ryhl
2025-01-15  9:34         ` Andreas Hindborg
2024-12-11 10:37   ` [PATCH v11 5/8] mm: rust: add mmput_async support Alice Ryhl
2024-12-16 13:10     ` Andreas Hindborg
2024-12-11 10:37   ` [PATCH v11 6/8] mm: rust: add VmAreaNew for f_ops->mmap() Alice Ryhl
2024-12-16 13:41     ` Andreas Hindborg
2025-01-08 12:23       ` Alice Ryhl
2025-01-09  8:19         ` Andreas Hindborg
2025-01-13 10:17           ` Alice Ryhl
2025-01-15  9:57             ` Andreas Hindborg [this message]
2024-12-17  9:31     ` Andreas Hindborg
2025-01-08 12:24       ` Alice Ryhl
2025-01-09  8:23         ` Andreas Hindborg
2025-01-13 10:18           ` Alice Ryhl
2025-01-10 13:34     ` Alice Ryhl
2025-01-10 16:09       ` Lorenzo Stoakes
2024-12-11 10:37   ` [PATCH v11 7/8] rust: miscdevice: add mmap support Alice Ryhl
2024-12-16 13:53     ` Andreas Hindborg
2024-12-11 10:37   ` [PATCH v11 8/8] task: rust: rework how current is accessed Alice Ryhl
2024-12-16 14:47     ` Andreas Hindborg
2025-01-08 12:32       ` Alice Ryhl
2025-01-09  8:42         ` Andreas Hindborg
2025-01-13 10:26           ` Alice Ryhl
2025-01-15 10:24             ` Andreas Hindborg
2024-12-16 23:40     ` Boqun Feng
2025-01-13 10:30       ` Alice Ryhl
2025-01-14 15:30         ` Boqun Feng
2024-12-11 10:47   ` [PATCH v11 0/8] Rust support for mm_struct, vm_area_struct, and mmap Alice Ryhl
2024-12-12 14:47     ` Konstantin Ryabitsev
2024-12-13 14:42       ` Alice Ryhl
2024-12-13 14:47         ` Konstantin Ryabitsev
2024-12-16 11:04   ` Andreas Hindborg
2024-12-16 11:46     ` Alice Ryhl

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=87o708e6w2.fsf@kernel.org \
    --to=a.hindborg@kernel.org \
    --cc=Liam.Howlett@oracle.com \
    --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=brauner@kernel.org \
    --cc=gary@garyguo.net \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox