From patchwork Tue Apr 8 09:22:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 14042486 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 1BF35C369A4 for ; Tue, 8 Apr 2025 09:24:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 899FC6B0025; Tue, 8 Apr 2025 05:24:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 870776B0026; Tue, 8 Apr 2025 05:24:16 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6EAD76B0027; Tue, 8 Apr 2025 05:24:16 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 418E86B0025 for ; Tue, 8 Apr 2025 05:24:16 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id C2801B7152 for ; Tue, 8 Apr 2025 09:24:16 +0000 (UTC) X-FDA: 83310340512.25.142C132 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf25.hostedemail.com (Postfix) with ESMTP id D4A30A0010 for ; Tue, 8 Apr 2025 09:24:14 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=cs0igio+; spf=pass (imf25.hostedemail.com: domain of 3Pev0ZwkKCC4KVSMObiRVQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--aliceryhl.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3Pev0ZwkKCC4KVSMObiRVQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--aliceryhl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744104254; 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=BKgSHP0UtGt+oV0m7wKF/tLoW5odDMj8vC7ZBIsrjgA=; b=af8SiCSgsuHs2XK5GlV2w6HsagxQbh/MvQM5domh0MJDKTJLHNlpCTL8PfMxV06dXSYTpI k7ht9b/32rMYCqWua97xHOtWqkLO9ukSm00Qdx2liymJKf8fXDxcwfxVRCaTdpt35sFQ+Z dfdOdyMLRKgMhw1FouoXr0rsC9eaUDY= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744104254; a=rsa-sha256; cv=none; b=jck+ArSsQAFOzkNJp/+4yR+T1tEYUQyHvMZnSTYQZUYe4UrkgBxEA1tgomJLnrxiUffgDo mYlhePxWq3e10BS3uKx6Netg0kvrXYrr3W/TSfleXD3HX29xVojBe8Wh9HIpwyzd1cyFNw N8AwSFKg8efSgIWmmoAYw9n/bhO4+CQ= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=cs0igio+; spf=pass (imf25.hostedemail.com: domain of 3Pev0ZwkKCC4KVSMObiRVQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--aliceryhl.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3Pev0ZwkKCC4KVSMObiRVQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--aliceryhl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43d5ca7c86aso35454605e9.0 for ; Tue, 08 Apr 2025 02:24:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744104253; x=1744709053; 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=BKgSHP0UtGt+oV0m7wKF/tLoW5odDMj8vC7ZBIsrjgA=; b=cs0igio+GFXiSqzZTeRBxAhdjxCi/DMplPmNWinxH/IdFWJ+8bve+kaJZdDmKplf7U Su2g4+MiOVMPwDBSTokmTmliFqsL5I05SzVqs3oUkaJqI/Ff9S0os2FDaiPAPlTblvFY azs5UoxstnP9+nlGkwq5zBurtJ89X1U80dsE2QqPgf5DufXC+sGfpcNA94GI9ij2AceE OZSTMGxJsbYZ4jjdxaLT1Qr6V6TYNQxnCrtRsdVfPx15yzmbtbOFVOV+qtC9g0wMylsR hwlBZtk+X3UoHmfC3aTA8ZyxpD/WRGh5qr9OYpHgi2gU2McDylhr5IKAZNuRPlD7GZP4 s4Ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744104253; x=1744709053; 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=BKgSHP0UtGt+oV0m7wKF/tLoW5odDMj8vC7ZBIsrjgA=; b=gRmR8JxqE4rm48hIP/HZKJs4YN6RMoerK5Vs6nIzxwx7YjdKwS6upPP2JiDzd8CyD4 mlVtNgxTXcgWjX+NwX52rnsKiDgksx4Zp7xqgRxhOgjCrbHBH/Udg1e9c2erBuKkh1mj 2kCVZX653BWib1ulSsG2RKV+n5lQ2cDgO1r+F3du/88ozZiEqbROB0l3iNbwguQkIsk/ 0D3uxg0xbIRSiThdvXQ9cuMfYtzFRmkZCx319M141wskOAGceMIv6SZzolLfT5Qe/aa8 a5SMEw358ASJBQ1JgaV3YJXGeGm5YLO5wamvDASscBDMIQUQ9k+BembCPz5Or3bCeHUE bCbQ== X-Forwarded-Encrypted: i=1; AJvYcCWp1+VZwu6CgBTRfK9mVOAD85MAiT+XwreB7P83F+LOfbKcqna1nMUhFw3d7vHfwRos1Z+zackJ6A==@kvack.org X-Gm-Message-State: AOJu0Ywf5CRZIJuJuExJ1QCZDWbMTuvmlX8P7QFgZUhtKuop/x/C1YJQ h2n8mXhbNjkVazaoEs5iMyvypFoOd95dcMloY6cdyKER6A2sSdVCdcAld3dRlejc1u8QtqhMQA7 zZfpoQytqDlK4hg== X-Google-Smtp-Source: AGHT+IGKxxFnPnuYQhaMn/C1VHYnvMuiIufsTL+sO+MIIaikeAKJnyM61wTXLBWoQ3PMLnGlIdAs32Q49e1duTw= X-Received: from wmbbg30.prod.google.com ([2002:a05:600c:3c9e:b0:43d:44cf:11f8]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3c8d:b0:43b:cc42:c54f with SMTP id 5b1f17b1804b1-43ecf85f20amr127759175e9.14.1744104253433; Tue, 08 Apr 2025 02:24:13 -0700 (PDT) Date: Tue, 08 Apr 2025 09:22:44 +0000 In-Reply-To: <20250408-vma-v16-0-d8b446e885d9@google.com> Mime-Version: 1.0 References: <20250408-vma-v16-0-d8b446e885d9@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4043; i=aliceryhl@google.com; h=from:subject:message-id; bh=Sfgq//T2QbdbqoMqrWL7BQLUnjSkh+kpgtWBCSQivcU=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn9Osphtn+zBbO8bZFvj7pkZhABnr8VbaFiFEa8 vSFFXvSY0CJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ/TrKQAKCRAEWL7uWMY5 RuB5D/9RA7H3cjo5/vuxD/VzZyAqYJY0YR+6BZctDljbIzIBs0tHYjQGyX3i9/lx7Z7I24HZgG3 GYQdZnhqBnxIJeK+aTd3+I6/0Kxt/6IQR6Q12dP9St1jrQR8QY0NbbDlJIpZsh4EnSERgXH4VR2 Iv/dWP2koycKPHA53sb047tk00stSC8FBUFUrjU+fXIPEprHdC2O05Nn5ARdWJUF/teV+/VTF6O MjPU9y7a0TfFX9kS24LGjGguBGUuk04TbeSD3AJ4zI5ttYztwe4rDoy0G5JK0WAdqdOzGvUzjyA AqLPw3Ciycje/cSkNmjIHN4NgE5iCyRh6m6L/7vT4aE+XlSlK/fFXROSRYWDwRSP/MQc0QPPXCm NN3I1c3hL62W/8E3tveIBF+7V6kp8O8061h//5D2SScR/0OuE8ZVF+UvtYcgqS+ZHSWbog/rDqb LvsWYiaW8W+F501INqaTk2CdldRz8wUlYQ2xCRWzFZTlkuXChlDP4Zf8Uhv25SGDKHNwfGiWyoC cw7vMFfyvtUFsM0wxwdFhrB6PlXfugS1gsYCk4jrqO7Oq1WipRemsXxl5MPxVF9hjTQSISjPoT4 mlt0NTtEaoXDAUWMGbFJyHdFpelBc1wv8qCvZZmccvdR9ztCb6uhqJ185K2TK0waNVyj8MsR5Cz nJaPeEL8PTxVTAw== X-Mailer: b4 0.14.2 Message-ID: <20250408-vma-v16-7-d8b446e885d9@google.com> Subject: [PATCH v16 7/9] rust: miscdevice: add mmap support 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-Stat-Signature: qarcw6rnqyeta78g44oyr769ry3etjs9 X-Rspam-User: X-Rspamd-Queue-Id: D4A30A0010 X-Rspamd-Server: rspam08 X-HE-Tag: 1744104254-496159 X-HE-Meta: U2FsdGVkX1+z+YJPxlRrPQxsBVlK12IgPdnxAwG1Q2A+ErwWykeaNOpOojy3CesmF491VyuWv7i39zdKeLLGSYTPLENXZsByLAHVfZE/kt6652YKepbo76ILrHO0IJPzC+qxf7KRMRbxVHG7juVR4v7tSwQHsmSUxa7G2Dk22M2UqnqFI8pnbl1CyU7x881wnKNRID+UNtFYHFdeSSoax61U/eTsS+0CcdceZ29PG/fOF/u/iRMMUMENJgD4VmgMoB9dR/r0+LLi0rC7mfxRuD2OKYtkVO/YolDZvKMoj+n71JS/aSz2sENVzS35cVKsXX/dlGCiBW2DfZW3ADHjw5XHNEFnL7KWN2v9SAfjD6Nb86383R+GZtrY8C1RpXCwhTjLyP53tZKPY8AQN8n4+J7ms3/xwANYv0XmVv0ubINu0oSvBQ6YyNwWxvZhrcMTyXb79uypcBnkcSBkrFWGWQlYrR10Hft+nS3+5giKaAKElgkyKHgQC30pQE2kAYbbDx6N/qOIJK7E1wyz0HIz/dl7CkcwkiSa/AHWhacOSXADqhiIhx+vE+amYkecuJSBqGicYLTdApvRB5Fn7GqPlLdjSIFG9bCYg1hw8n2gYBD829hHD8NPnxLUQCPR9Ocq6pzQCiz3WJXTn9VCal4gKVQYYVy/h/L64He7WSw2PQJiLXx/4B/F4k9bO1GoapWbbUmrhV/j4X9g1hlxjHxjwISo8wDpNUQ4zevOcs0487vEp8cIeFGzkpCc1X+xei6tUsDfG/5qOVqbptfn6Vp+fBHCC+dqZLfjKeu9EkoUd9goyMifxzybFqOvZBPdQ9LYc3rX+ZlA9ZmAFqGuFAQYLDw8VTtuETbWNSZESITPMD9SywOQ2aIWmEMSDMGy1GLlfarB5a8/4ddd2ek2L/DYD3xwsJJdy7HdnTWfd5hbLqQtDZ8Mb6PjRR6ByZh7VffPnPmxdH8PpjdqCR3ZwbN Qy/JEsLB Ygs46fpO+ciWZuoNDO8WgQBpbu9QJXu9c/l0TNwWuAp0H9bXjZejU06PaZ46oYXhd4dhCAVlcZBJjsEMhN8Ud61F/CZw+n42xRjkuTR7HtEDS6BlJXFbve47+rMfaQg4fyZ4tWdz8mLBtVsp12YDm9bHVn0UjRM9p2SaqGkbR4S7j5ZCGyINOTy1adYr0PRXFAvRZeROH0sMp79iI5+5wlPuCuU4B0txmMeahf1d3D+0wsAI6EB8NHfn/uMdxYkHO59EjwDJvx07AWfXNW2pfwDxPIIUf3OW2aVkwQiFUqq662RgzscsV77VgtqdDFJYtLYkSsITB5K+KSoUQ//sWgMG+jMGMxJ3UniIcYg+z+utXWyVNEQE8DSjuK/ekBVSCt0pzghx8uM/hD24AHg+jTcCD1Tl3KSrxFzPQ6kA9j45e+QBj5gZVcTNa/SdQxFe+rBVj+SgjAxUdwyWW+kzVBZ4/gbpzZbV35SAy3UJ5I6APmU7x7jV79oZ9yejY1iOvWF7W1ePznFsNx2D35u+MBTq4nGkq3aWJQLoQxWPYSnnen4lcmzdvUIVDycDpQvcMOqLoxLP4+pukDQezxuzZXUQ6D7LtIRmnRs/P4RyLQbQ6npwMky0mcNANLXh1h76E6wSnN/64zWy6PkCOMpJwhgbFDrQE9pdXVOKPL4AcgNeaaJHV458n7nQmlR1iITS/dEjcVOiw+fT224BxcAxEeuUAXPTK0445T121OshGg9nznj9uLsWFWJ45QT9TW670ErdPkF+xcJhUMNdIamqjVvamUwQHtTcxJfFikum1PBqs/XY= X-Bogosity: Ham, tests=bogofilter, spamicity=0.361210, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Add the ability to write a file_operations->mmap hook in Rust when using the miscdevice abstraction. The `vma` argument to the `mmap` hook uses the `VmaNew` type from the previous commit; this type provides the correct set of operations for a file_operations->mmap hook. Acked-by: Greg Kroah-Hartman Acked-by: Lorenzo Stoakes Acked-by: Liam R. Howlett Reviewed-by: Andreas Hindborg Reviewed-by: Gary Guo Signed-off-by: Alice Ryhl --- rust/kernel/miscdevice.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/rust/kernel/miscdevice.rs b/rust/kernel/miscdevice.rs index fa9ecc42602a477328a25b5d357db90b59dc72ae..9d9771247c3865761c4387467de3f1d1a82691b7 100644 --- a/rust/kernel/miscdevice.rs +++ b/rust/kernel/miscdevice.rs @@ -14,6 +14,7 @@ error::{to_result, Error, Result, VTABLE_DEFAULT_ERROR}, ffi::{c_int, c_long, c_uint, c_ulong}, fs::File, + mm::virt::VmaNew, prelude::*, seq_file::SeqFile, str::CStr, @@ -119,6 +120,22 @@ fn release(device: Self::Ptr, _file: &File) { drop(device); } + /// 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 initialization of the VMA according to the properties of + /// `vma`. + fn mmap( + _device: ::Borrowed<'_>, + _file: &File, + _vma: &VmaNew, + ) -> Result { + build_error!(VTABLE_DEFAULT_ERROR) + } + /// Handler for ioctls. /// /// The `cmd` argument is usually manipulated using the utilties in [`kernel::ioctl`]. @@ -223,6 +240,33 @@ impl MiscdeviceVTable { 0 } + /// # Safety + /// + /// `file` must be a valid file that is associated with a `MiscDeviceRegistration`. + /// `vma` must be a vma that is currently being mmap'ed with this file. + unsafe extern "C" fn mmap( + file: *mut bindings::file, + vma: *mut bindings::vm_area_struct, + ) -> c_int { + // SAFETY: The mmap call of a file can access the private data. + let private = unsafe { (*file).private_data }; + // SAFETY: This is a Rust Miscdevice, so we call `into_foreign` in `open` and + // `from_foreign` in `release`, and `fops_mmap` is guaranteed to be called between those + // two operations. + let device = unsafe { ::borrow(private) }; + // SAFETY: The caller provides a vma that is undergoing initial VMA setup. + let area = unsafe { VmaNew::from_raw(vma) }; + // SAFETY: + // * The file is valid for the duration of this call. + // * There is no active fdget_pos region on the file on this thread. + let file = unsafe { File::from_raw_file(file) }; + + match T::mmap(device, file, area) { + Ok(()) => 0, + Err(err) => err.to_errno(), + } + } + /// # Safety /// /// `file` must be a valid file that is associated with a `MiscDeviceRegistration`. @@ -291,6 +335,7 @@ impl MiscdeviceVTable { const VTABLE: bindings::file_operations = bindings::file_operations { open: Some(Self::open), release: Some(Self::release), + mmap: if T::HAS_MMAP { Some(Self::mmap) } else { None }, unlocked_ioctl: if T::HAS_IOCTL { Some(Self::ioctl) } else {