From patchwork Mon Feb 3 12:14:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13957350 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 D2B3AC02192 for ; Mon, 3 Feb 2025 12:15:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4C250280002; Mon, 3 Feb 2025 07:15:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 471A1280001; Mon, 3 Feb 2025 07:15:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2ED43280002; Mon, 3 Feb 2025 07:15:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 0F543280001 for ; Mon, 3 Feb 2025 07:15:27 -0500 (EST) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 01DFC142618 for ; Mon, 3 Feb 2025 12:15:21 +0000 (UTC) X-FDA: 83078528484.06.5916181 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf01.hostedemail.com (Postfix) with ESMTP id 1167C40004 for ; Mon, 3 Feb 2025 12:15:19 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=arpGYVRd; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf01.hostedemail.com: domain of 3VrOgZwkKCIMhspjly5osnvvnsl.jvtspu14-ttr2hjr.vyn@flex--aliceryhl.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3VrOgZwkKCIMhspjly5osnvvnsl.jvtspu14-ttr2hjr.vyn@flex--aliceryhl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738584920; a=rsa-sha256; cv=none; b=RraIeQc0o5Br/hMjIEMh0RKAAVe/++2bV9cR9jc4I27xwpBVw1ciGPK/SMNGRmL8P5x2R+ wqnUK/IgYh4MpM9JqeaB46GS36YCTaY+gj7j0X8E2TCE1vdxyJKTQj6N2ZsC5Nd77aYioI EEAvM6Jrsx2VxmGZkCp5Xm3F18/hY1A= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=arpGYVRd; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf01.hostedemail.com: domain of 3VrOgZwkKCIMhspjly5osnvvnsl.jvtspu14-ttr2hjr.vyn@flex--aliceryhl.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3VrOgZwkKCIMhspjly5osnvvnsl.jvtspu14-ttr2hjr.vyn@flex--aliceryhl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738584920; 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=ghNopB/ovoE7UI8P7ondlQHgR2/c2oc3ISyJfF1pYKk=; b=M1DPOD+RXF3YgdNEFE/SYGJKZf+QItErUHbDYpEyZNPqd/kEM0JHjwjYBPPQBfkZkpk68b vVbP6/g1nO07cffEEuM5kzdZyJVetJ9QYRGkM1oDVIaKEclhauqbA2/kR46sRdmEgqyoBg g2Ji+f+hLURTZFkOIoM8JpZHCZOy+a4= Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4361fc2b2d6so22273845e9.3 for ; Mon, 03 Feb 2025 04:15:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738584919; x=1739189719; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ghNopB/ovoE7UI8P7ondlQHgR2/c2oc3ISyJfF1pYKk=; b=arpGYVRd3ed8V7om9etmJMjnlI32sQQyj0ObuUBCKuWwdVS1QfwooJetqikBiYXHAz +jyiACH7kX6OIZ3StNMZAuv40hGWr/op2e7VRIdxy4CVZfQc+Q8QwlvbDfQR6lX8Thbl Rh5ssShSL8ca1+xXddNXlCXwuaSo1d0lAarxWExGOTufWJiPBlHVy/dZtqw7PvqcDx6Q fjnblCozui3vI/Ye+wpux2Y9Tpv9UNuZcW60IpKrDiB1x9vXtjVS9QZYFJTHd9rikpA0 MoHH+SAUeaayeI/xdnV+xvJWTbf9mFX598H/VVDJjjyvVvA2zLtqtlTK0GN/isOnKVTs qCYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738584919; x=1739189719; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ghNopB/ovoE7UI8P7ondlQHgR2/c2oc3ISyJfF1pYKk=; b=GuYFem2TwCYEuwIUYEQrsYJw+TipejpQVm9D4Q7OvrnV4gTg3WCZYyMpCHGFBsRr8m 1BRhQqphX+BXcoevVjgYzaQZnTzcNMiw//2o96jGY5NkHdRvjuvJXHSq8348MmIjaFTT iYpckNC/0xqxrSKTKm2JpHLP1qnR2gleWbjSiIxppugPNlQcn17s7V2wSjGsIdqWXTuI LLoExwp0iYsBrUmXSwUt65lnvwj8ObJ1n4rfGiGZyQeLjyGU6Hrtc4K3Y7fqs26FQ2N6 b3r2hwj5hh2QiVrRgvJkhUCynjBlAvA1tVo04b8bCmfRX0QYEtbMjphWb3yV1fhwZdqj NilA== X-Forwarded-Encrypted: i=1; AJvYcCUgDyajEufq1vo3fRIEsXbUYhybji6iwtCmrBpiyEEJkSnEvdBVnmPAAJOvaqsd/1qBMt33P0nxfA==@kvack.org X-Gm-Message-State: AOJu0YwYHjAi3JE84/QuPfGiwWxIbIMViJZucSO9VK33pXiuxeVyYKvG FXJOQmZO6Qk4gjge+FPc039U0xHFffbjhqJKRzS+Paw/iHWeeH/7JqiSOw/syjzbcYjpEYwrr2y aYOpnH0ZISmWq2A== X-Google-Smtp-Source: AGHT+IHc83C8k0kWyFW4B7jVylfVU4gtl0Vj6eJsSbBowS4jYe9JFHSyrYsbEeWgcs2CoUj+GFAgp46bZhkRTJQ= X-Received: from wmqd12.prod.google.com ([2002:a05:600c:34cc:b0:435:21e:7bec]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:c12:b0:431:5aea:95f with SMTP id 5b1f17b1804b1-438dc3cc378mr206991585e9.16.1738584918711; Mon, 03 Feb 2025 04:15:18 -0800 (PST) Date: Mon, 03 Feb 2025 12:14:38 +0000 In-Reply-To: <20250203-vma-v13-0-2b998268a396@google.com> Mime-Version: 1.0 References: <20250203-vma-v13-0-2b998268a396@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4198; i=aliceryhl@google.com; h=from:subject:message-id; bh=7WepNBMO3VHpBbUgOZ7CBvykk1H/XsDvQNuHzOoGaDg=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBnoLNKxtxYKi99rKgHmqWkRH4nWkPittKx4tZr1 V2PKQs0+sWJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ6CzSgAKCRAEWL7uWMY5 Rs6nD/9iQkAZn6Vn+uopIfzFcx5caHl87DWWgkBI+qGs0DLDUpqfdZDDlnPBuD/dIBc3jKZ+uo/ Lh/A/voziPGDymGXzHHnNm3JY90Ik7PLD0SLTpzLw2wr12kKYE7LB9Q/xjIVchr710cvfcBhhpn P20GzEcAMsY437I0tnAMaqFRIcIKMO5HVJiXPNJf4akkxzze/3S5i+I76xujCoQiwlO9hACF9x+ tw9+DxI+r62S0RiAUPYSKIEpHWeBCg86V+YKbjn8v50FOXF5ABV+2X8jb/AEVQC6JtVA6DoUNF0 K1+5WN0lBG+em72x4Vcyng5VBjsKX+mQcRpqPbf34ClRqkcbuTtHrDI5Epdwq+xqc5waUutF4Zt 8KBwkMqh9PdEKoFWBw1/6ERz52tmjV8oGdbf6tEgsDgorhKWMEy0HiAeTSLDE6kyujBfFGnCOFm N6eGYTpbEALKFem+VPN4SFR25IHNffR1fF2Pf/Al0m69SBcsOwtAffp5xdxC8au4qiF7nfhuSW7 MHl5N3G7w4IGSxRAlse7Oes7RJKU3nViNhOjCSncG6LfUE7Rf+O6eog2MP62j3dvJJ67znZCm+d EX1c6LqELEE0UFq/3MT9Sn8Qw9H1jmYZFsOFYY9hgAVSfYVUKSwpK17WB+dP17CvpWB3wwlVa/P KQKZVuibB3ekJag== X-Mailer: b4 0.13.0 Message-ID: <20250203-vma-v13-3-2b998268a396@google.com> Subject: [PATCH v13 3/8] mm: rust: add vm_insert_page From: Alice Ryhl To: Miguel Ojeda , Matthew Wilcox , Lorenzo Stoakes , Vlastimil Babka , John Hubbard , "Liam R. Howlett" , Andrew Morton , Greg Kroah-Hartman , Arnd Bergmann , Jann Horn , Suren Baghdasaryan Cc: Alex Gaynor , Boqun Feng , Gary Guo , " =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= " , Benno Lossin , Andreas Hindborg , Trevor Gross , linux-kernel@vger.kernel.org, linux-mm@kvack.org, rust-for-linux@vger.kernel.org, Alice Ryhl X-Rspam-User: X-Rspamd-Queue-Id: 1167C40004 X-Rspamd-Server: rspam10 X-Stat-Signature: dxh8683twm4idk8dsqm7q4q9qxcb5brh X-HE-Tag: 1738584919-393579 X-HE-Meta: U2FsdGVkX187UzmTI8+/MoirNfbPMBjaHwZ5zlqlL9QKnymTMw7NvKxhcFk0XjjFzbb/T0D69u0FkSLDnDk0C/yjmbsymw2JWCKTUOyV3qmmlVm2QqYpyEUIOnpV57VR3IbC2GCSefHEIqS03hUANJ5oAAUMKBp0t/jVU5NbnoSPqnU4AfGt2Mxh7L1bk/vZwUfsz5wI61vjCI7PKgNGNResnLiw9RV8/PqHmerxc4mwpF0qYdmDOjFL3jXIi4CYecU+7nlnn8l6NrHdvNXMNCn0WDW3zXCqMlCzgMLiCI7wOZARsJQuorYN5NBOgo7yICT/aScm4WFXo9+nJuwB98vEORwQggYFQeiE5BzqBNB2gt7LG+LTjAxPa75cjbpsDAL3o+FNnhpUlPNBOATGZ/k6qhvBYJQFL0AMqJOYJh4/vnPnvg4M5Bz6KyTvUaXTl7wjhTCzuv+2B9w6mYcRnpJbK5CbgKI2FgYl79xEo7TjUa/NS5zZoAjkz9Nh0SfODqKIODyF7zCkgDNl4QTwOMB4haXYkbMMf+ZOhKdsEAPigxrss7AQ/zMoAnN8nMheawjkxU2eBAPyx9ochqb4teZIKK8AoRl6t8b3KMB2H/PJkFvqCudlKZDaPAg0YISdP6Cij7a3rfhyu/98kqwwj5MJE14xZg2g48XHI6KtP1G/UzxddfaAoVAcXGcodZjYcSChAX1T6spoRFemAbqZEn8tPjbgFESn46bgiW5kbX0bHHCQROFR0GgvTsIW9q8mkQs/YPZURyFMSlUuiE6qzGWXWh+RfLn6sa+mZcCye55HdNU/XJaG4yIHXJsRJcX2B30RJOBjpOLAi7Vbpevyq70P66JlO6HOssA8Kt/hsyy/6rQzqA2VYoiCF9v6BHifzyvxqEz218LR/G0a7HWWsYAMdHBuJxkdAjP+aFZv2COuhEUeYe/OeCrBawrjgmlToIXi6VQjrL0o6c+1ySY nnOKkV50 sLtOoijv/Jhf3p/vjD+2uzMWleTW4Ura/8YMmb1bha8Fzv/VgKrfOSjfE3tf2qPmo4fxe+uR+PgUc1cE8N8G8l36OBXsSsQYANv+JkMTez2BIloEx1y45SYYIPibVos4uZUZLQubzkbMmgZVepKFeXn3olyGMj7ei+62i388wT05VGAB1seiDtp/CAYxI8lYe6Z8SeTvsHQ31zkagBUzHpzoP+USwhGGN5carZcKN9EI3dxxqjfkVrbbWjoTPgWImn29JBmLeSYf8brxQGSrgxmoVKDP38LzJOd8PzsNKPjXzG81OnyAKFtbWkn8lGAXDwJDnn2gxHI949ySA+t+F9wah+2wXFy6av155LSQichSIYtQGhpdLDAw+pwXFq3G+ypa6NgX9z5aoBHw1kzLKQ+bW39wTfvzDtjZJ0ZYbyA2iTdeLAxZ4i8bQjXj3xAjRWJFD9FUFTNWf7LhLUJDuMBOHdJ40xBjuVi7njW17ae2q/irD6C/JrscS4bDyTNUrOI9Vao579zn9yXL5csRqPBZbtKkON5Y25m8IKaa7yPJXwfH1WB7NbEfUQKuJFizqKx3BuynjRf9JQzsN0SM+2XY9xWjeIBO7z+kE5uYNopzJRv5dpBCKme1YQ6PhQogOEZWky9G2CPVR040kDQ2bpos4wDCnoi1YOmcA7+6XDssYYK6v6vScRIVP1B4bcLGTbA9BOZOz6CeBj/qKMJOv14j2tH8brWcgeUES X-Bogosity: Unsure, tests=bogofilter, spamicity=0.488060, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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 Reviewed-by: Andreas Hindborg Signed-off-by: Alice Ryhl --- 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 dfe147cafdb3..64a0a47070a8 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. /// @@ -124,6 +132,75 @@ pub fn zap_page_range_single(&self, address: usize, size: usize) { ) }; } + + /// 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, page.as_ptr()) }) + } } /// The integer type used for vma flags.