From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 01C0AE7717F for ; Mon, 16 Dec 2024 14:51:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8C6F36B009D; Mon, 16 Dec 2024 09:51:33 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 84F7C6B009E; Mon, 16 Dec 2024 09:51:33 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6CB136B009F; Mon, 16 Dec 2024 09:51:33 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 48CC46B009D for ; Mon, 16 Dec 2024 09:51:33 -0500 (EST) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id EDA7AAEDB3 for ; Mon, 16 Dec 2024 14:51:32 +0000 (UTC) X-FDA: 82901110194.05.FCDB437 Received: from nyc.source.kernel.org (nyc.source.kernel.org [147.75.193.91]) by imf28.hostedemail.com (Postfix) with ESMTP id A2E42C0014 for ; Mon, 16 Dec 2024 14:50:58 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=gydENcCY; spf=pass (imf28.hostedemail.com: domain of a.hindborg@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=a.hindborg@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1734360671; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=gaR3vIh1ldo57rzS8rCNXHNoy09Xbb3DmkBIOkSbfLc=; b=0Vo1M4gB6Uc91ZoYVu0tcQ7d2czmEe9XrSfUN7n94DaF02+PL6qyl3WJXILutKFxHriZgh C8H4IPKwUONbVRpe4OaA/iLSbjlrHl83ZEgyzbiMz3QVz7URi4h/VDdMSCkTUnGrT58GSr FTL3ZMNQeQEexLBYRD0bE3prQeUsXeY= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=gydENcCY; spf=pass (imf28.hostedemail.com: domain of a.hindborg@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=a.hindborg@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1734360671; a=rsa-sha256; cv=none; b=dXxFuUHH/pPB6kXAnpotvvPYT4lwuKihAr8+jn1qNcyvh0XZZg84yipmEIyo+I60b73Qmf 4MedH+POqlSdFJJCjiwFuRf3LiqPQjwz9MSw9Pjp5/YQwRSaceuzQX9wbYUZq+BW/GgiH4 Yfk8+VQ225hnqgf2s/RtWROzrVNE7KY= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id 0AA17A4140F; Mon, 16 Dec 2024 14:49:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ABBADC4CED0; Mon, 16 Dec 2024 14:51:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1734360690; bh=bA9uLAVZ8BgttLZYWSnIy1R0Ug4OzPSdjjR00xzG6Cs=; h=From:To:Cc:Subject:In-Reply-To:Date:References:From; b=gydENcCYiqN9nlkfNikBstd+KaAqF32kisCt1UfFdZW2s0aHgbUriurkcQT7Qkgqa 9lsBW9s5YGeCkxfhGtpWCiyT/RcEZWma+y49hL42B14dJETPRJObqW4lhKlOzwUUmG O/kULJ+mQzUm5uETHYlUckwtZQ2rXgHlab5/kbc+tsMEq+3MFU5nTLPIE2FID/wsxc ellH5LqAvkHU+4aqwZzcmuLQm9py3GWsCE66HPYLjzOLZb42cePaJHFXEvsaZgT7Ui 6my0w1UlHK84nz8A4wfcS9NoqzWGm2mqoD2SCH9jyuuxDQ/1ZLUvDRfC+sV/MJg6j4 DywA/e7c6mkAA== From: Andreas Hindborg To: "Alice Ryhl" Cc: "Miguel Ojeda" , "Matthew Wilcox" , "Lorenzo Stoakes" , "Vlastimil Babka" , "John Hubbard" , "Liam R. Howlett" , "Andrew Morton" , "Greg Kroah-Hartman" , "Arnd Bergmann" , "Christian Brauner" , "Jann Horn" , "Suren Baghdasaryan" , "Alex Gaynor" , "Boqun Feng" , "Gary Guo" , =?us-ascii?Q?=3D=3Futf-8=3FQ=3FBj=3DC3?= =?us-ascii?Q?=3DB6rn=3F=3D?= Roy Baron , "Benno Lossin" , "Trevor Gross" , , , Subject: Re: [PATCH v11 3/8] mm: rust: add vm_insert_page In-Reply-To: <20241211-vma-v11-3-466640428fc3@google.com> (Alice Ryhl's message of "Wed, 11 Dec 2024 10:37:07 +0000") Date: Mon, 16 Dec 2024 13:25:12 +0100 Message-ID: <87o71bbys7.fsf@kernel.org> References: <20241211-vma-v11-0-466640428fc3@google.com> <20241211-vma-v11-3-466640428fc3@google.com> MIME-Version: 1.0 Content-Type: text/plain X-Rspamd-Server: rspam05 X-Stat-Signature: kf47ns61qfdxey6zcrbzhh5xscaz9ck4 X-Rspamd-Queue-Id: A2E42C0014 X-Rspam-User: X-HE-Tag: 1734360658-906729 X-HE-Meta: U2FsdGVkX1/c9aSPuzYl3hEURYZQcltzhcVM6IgT7C11JqonMvF5bbEBJ+7uHpnVOgvj7tSrrFpWqJs3rD6f0JB7zo+fVwzCGigz2dkBtw6ZM3v1fJW2wFw/ZayJ2dqAva2SokzDPBxL+4luLK/P+wLzWdij7BFG3Vo68ol4xtkm1HSec0gr/gpYY86LFDUW7Yoige0I2N6UR6KKOB2Cvd+RQZ0tFgsC9su4gX+iffxdRSWCiaBFxyUa8mWwiULsk0ff6QjbspXtn1xWfLe1VGHFgau32tPv+56wWQWay5kHvsmYyQHQL0BLcRFrplvPp/3zdI7somJWIG9l+S4ggX0hGbkEpvnLL3ElU1mhsCciKAiya2nOeKuN2S9pqiMEQERV0BG6GxNFbE8xInsJ9U7AXegu5ctUV957rAPcQau8E/vaCVOReAzztzQBjzcaAH37S0GEVUt56j3DosnhRLtdCAfjq5cFpfqmasbzLI74O+Gfg1iC4O8GRS6tufqn9I9QwGf9nocbK5ky14j+4JD1CkQSKLrj2sICjPeyy1l/je5JZMRRoqnVVn4l+RtE44lwZZ/SSiqU7Oxn205dfuC1epXG8hlGnPh3dzPYL4pmNWBKyQ0ay2jGw4iX95bVMPsUhSLo7vW6AnzFPGL4PNLPT6i+wJhir17JFGrch0h0/KRfgULrag4PxiQ4GEJzG0t8/+NstH/f6GgH53sZC817FVnUm9zsCd4O9BeYBdRPr8RLG9/7s+QUXkwMTZy/BRVEbZyf37f89JVdO9u8c5DvW5vrG05aDySoZxbIC7jmOR4WhQX5JYNDhSK2AnMkhhekpGTzOdebqzE4zbuXHU2s0aljAjh6oUxXe0TsbcYcecsyUAJ6YnoST1IGK1JaF1oTlxdoEdNgWVrU3pTnuwiAJylnLZdbc4lapzMuKjY4NADxpsFMMxhdTjr1lTlFAWmJL0vbZJoOWCFaAoZ eZfCP+In R4qt+YuXqy063iftYtwIMBfyYS6PeTTgTaJuGc7UAFfQUXIBZ8js1MK84L1m2lF6tGg6OhmsoefpYEF+cAhSz0b7+FlDnnoqbQE/y2CIZ+xteQRXOPIwJxSBJNENpacfCwvya4eB4/jt2y+ryXf2Ej6/i+B3eZHu/Nm6zHQdbE5Yipc/UTzUrL4bepVWrDK9XzR201d/kuAR3BmPFdXg7XtqOevejnC10r6xBkexgeyEri0icLoOSX3PrfnUyz36sJGJuO1E1PhIAgPbBr2cH4/TPdVedCY32ufR4loyiF7yvLtTiUmX7ADZa3koUCx31sNiIzbn7VUjQuCKBjf+tC5n/tXMscP+wgdMRa9R3E+ehnE+qqFcM2nit0qZR78GV6xnXWCiyzxaqEIm6/Msm283lOA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.321845, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: "Alice Ryhl" writes: > 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 (for mm bits) > Signed-off-by: Alice Ryhl > --- > rust/kernel/mm/virt.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 70 insertions(+), 1 deletion(-) > > diff --git a/rust/kernel/mm/virt.rs b/rust/kernel/mm/virt.rs > index 68c763169cf0..3a23854e14f4 100644 > --- a/rust/kernel/mm/virt.rs > +++ b/rust/kernel/mm/virt.rs > @@ -4,7 +4,15 @@ > > //! Virtual memory. > > -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. > /// > @@ -100,6 +108,67 @@ pub fn zap_page_range_single(&self, address: usize, size: usize) { > ) > }; > } > + > + /// Check whether the `VM_MIXEDMAP` flag is set. Perhaps "Check whether the `VM_MIXEDMAP` flag is set. If so, return `Some`, otherwise `None` ? > + /// > + /// This can be used to access methods that require `VM_MIXEDMAP` to be set. > + #[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. Could we have a link to `VmAreaRef` and explain that this is a `VmAreaRef` with an additional requirement? > +/// > +/// # Invariants > +/// > +/// The caller must hold the mmap read lock or the vma read lock. The `VM_MIXEDMAP` flag must be > +/// set. > +#[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: The caller has read access and has verified that `VM_MIXEDMAP` is set. The page > + // is order 0. The address is checked on the C side so it can take any value. Maybe something like this: "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. Best regards, Andreas Hindborg