From patchwork Thu Feb 13 11:04:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13973105 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 C5FBCC021A0 for ; Thu, 13 Feb 2025 11:04:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1BB8D6B0095; Thu, 13 Feb 2025 06:04:50 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 16AC86B0096; Thu, 13 Feb 2025 06:04:50 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E8C706B0098; Thu, 13 Feb 2025 06:04:49 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id C975E6B0095 for ; Thu, 13 Feb 2025 06:04:49 -0500 (EST) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 69A421205EF for ; Thu, 13 Feb 2025 11:04:49 +0000 (UTC) X-FDA: 83114638698.10.9FA1948 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) by imf08.hostedemail.com (Postfix) with ESMTP id 72260160012 for ; Thu, 13 Feb 2025 11:04:47 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xYrBHyg0; spf=pass (imf08.hostedemail.com: domain of 3ztGtZwkKCG0LWTNPcjSWRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--aliceryhl.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3ztGtZwkKCG0LWTNPcjSWRZZRWP.NZXWTYfi-XXVgLNV.ZcR@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=1739444687; 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=/uyBvvUIBqhEGg3k1MSKl3P/NCSf2A+x8xfYmCFIPos=; b=pqRVbxQ+LtIbl/VyqIwkguEbjHsi763RcnDRpEtBjxEqMLlo7+TcbpqR6+iqRU72xIK4yx XT2qWs7UOfb4mO58CzH61RplXm9WgL8w1+rf8tW3tdv7N+osiZamUumrrQxtPHpKdtVf8J gUxZPVRR25Wu/1uNloKOOu1hZcTiZ5Q= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xYrBHyg0; spf=pass (imf08.hostedemail.com: domain of 3ztGtZwkKCG0LWTNPcjSWRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--aliceryhl.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3ztGtZwkKCG0LWTNPcjSWRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--aliceryhl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739444687; a=rsa-sha256; cv=none; b=pkar0qIJbhdEiE0iSB9UgIDcjNhYf7fKtGgw02p3XdjCLS39ivZXjvZYJi8CqZIKEuVd+/ Jv2tIegyfKKdrlTmK7AhSeJKj0/K4NdK5yVNWu5J6TtuCdS53Pdp8A05LhX9ykQ4Ptx8a8 FLo8XENL6LWerdLmlI5HrrZEZm0Oc8o= Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-38dcb65c717so434356f8f.2 for ; Thu, 13 Feb 2025 03:04:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739444686; x=1740049486; 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=/uyBvvUIBqhEGg3k1MSKl3P/NCSf2A+x8xfYmCFIPos=; b=xYrBHyg0tjvbE7kd7HyeIrlsbFNL5167WpKiVOcCWc4NNbGEWYXgUc67Fz768mjdfu HoznvFVcIyA30c2F5k8B8mbE1kR249thMpuf1UvhVEywb/9HE+Fv4DB0ppb6EdK+Q4iQ 0WOynN14vB3GYTMpdvPZ08/Uxr3I8w4REgS4ty6wAO96oXEWhJ9AMhnhsfqgpeENIAKN wkkwL1uN0JqgS1ClZEEz8zLcaCiI7OmsaI5gt67WSt/11ciGhiHck3+HEQPWPTxreL5w O+TTbn7UB2h6ZcOvrfKi2RKBSCc6zU+z8/Asj+Fh4RmAramit3og1cf7tQw9aVaq1qAn nKeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739444686; x=1740049486; 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=/uyBvvUIBqhEGg3k1MSKl3P/NCSf2A+x8xfYmCFIPos=; b=vXl1JSa6yFeBBKEcOCUHHTy3HRTjZ7TXsuDNA5+X2n9OAV8yS2QdBLrZHrRzDiNhtR XMf0ubSQiYtq5NVZlNpOuVYdWHKSPzfKWQ9hAsIzfcxTWt7KOk5C5Xv5J2uSXyj7oLxA MIKJaLppzWaryis8VfSkPs6TbQ3+oZW1t4sJqa/F7fzHu5zCcQURAFW/kfPwvlGUybjy 2sBWRL9r5yr7oUajISdrGRUbd5bSkT/pj1lCKmS2fiyce6sGy1dUUiofiNhRHGnBwE3W q2r0OXRGz/I6VmGb2xX4p7WNiUSUhocTd3CZP77fzVJBAUmvxcueSRGD7PZLZmdN75R8 3tgg== X-Forwarded-Encrypted: i=1; AJvYcCVLCNUrSioFlMXGYF3ic56JpzYOt1gH2TcAqBMv962XCpAEdAsCS6bTExwIwgAcbA6tbuq/tPamNg==@kvack.org X-Gm-Message-State: AOJu0YwLuHBY1zE8hyXXg/J73ZDpKrzomC7kbqjgkzBUQYxQggjgRDFD byqlF/3NPdWIv4whBSnSJmfpUfcla5QwIeiywRwOpa9v0IJ9PVdquWs2+TJKjEEie89zZcZazjU BZiOzEB8UcrVrZQ== X-Google-Smtp-Source: AGHT+IHfpu4LwUir1xs0IVZCM1IC0uXcvmusDtyLHlflipwlekCf6G6k2n3LWvqP3SiylhkkpqKNBH+Ir9bJCqU= X-Received: from wmbay19.prod.google.com ([2002:a05:600c:1e13:b0:439:5636:735f]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3b9e:b0:439:3dc0:29b6 with SMTP id 5b1f17b1804b1-43960169525mr31940045e9.2.1739444686140; Thu, 13 Feb 2025 03:04:46 -0800 (PST) Date: Thu, 13 Feb 2025 11:04:03 +0000 In-Reply-To: <20250213-vma-v14-0-b29c47ab21f5@google.com> Mime-Version: 1.0 References: <20250213-vma-v14-0-b29c47ab21f5@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4092; i=aliceryhl@google.com; h=from:subject:message-id; bh=7YH1vGH4J5NrwgKxb07UMrGiCmpjxEls6xw94mytwWs=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBnrdHAisosHMy/OP18+ZFSNrfkNK5udMfSbyYBd /UYV8VUP0+JAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ63RwAAKCRAEWL7uWMY5 Rto2D/9a3RX0gRbzHxMqA63smy2e5oFZ4X2tYbSXIkyIwN6VWd8YZtH1PcFwUa5wK0pU8XdojFd AYyeERKnFDljzjTqnvwqBfphg0liowGbNq23niy2uCffaJxJo4UFB/Drit3FPKggtxzHYqlSPSs 7luyMeiT/YiEiq1s08asYDvnPjbigsK7Vl5UaX+i6F1pHlNeaJ750Ohu+Z8Ts3OEu/MyCC69Oso 9buHg7+vnmGaOGJHFS4eDB16eYOTTcvgOIZ2ChRuao5jPRoBo2GjNWXxjy4vV7QfGrE4Ji5AqUn IyBvpRKcct/CWYF5YcWkNEDGIvx5sqofRxhE3uhD2+JdwrCefrkQYizdTzFxvFfh7VAAue0FLUa GNmYd2K0SvmP1Oikt07eoNMllm+se3DMiQdMea/I/HQYLf4vH/zEd09fKFYz8O4vsAl/nsIGGyw ulMOzd64acCq2XDNQH9O4ocWZM0V905RHEID9LA86bKDSVZiyp+fgDpbmDkwTMfYhKgTi3hUlVM O+oKYcf9ikY3RTB2rW+zZRdXGN+6G39veH40gcvbcFon8yw4J7Q/gd61g5QGdnKCz+a4skqrcrQ rW24zBO2XYUM9mStTg2QYQbtyTURioRrsA18aFyqz3iWziTvzshu0DHWgtkaeah3hggl6BIqBfb DtcnZcK0amgnBGA== X-Mailer: b4 0.13.0 Message-ID: <20250213-vma-v14-4-b29c47ab21f5@google.com> Subject: [PATCH v14 4/8] mm: rust: add lock_vma_under_rcu 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-Stat-Signature: ojtbfm811r8nznzskghqsdwjsitetceh X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 72260160012 X-HE-Tag: 1739444687-393942 X-HE-Meta: U2FsdGVkX1/RMAZAiyMWb/3cDyLWdJB/0cEwULW8u8dBBy4iB0aw6OswMM9S3d8tI5U/FHXVA93Z+9bM9NnxHgNspk5hTJ7UCbQ8Uda+ZCCOqvUx2hvydvb3RjCce1i5DFQsntONPsnDZFDrz18JXmkwki1O7n7Yguoiva7f791gPSlhQhmwvbi63zkdElS6JbmOB+bfBjkWoh3UESFDNyKN0k8ZCgVhWVOdSaLDEaT66r93kmqjS/JvBZDrktJap90yQGgLB+vWDTfgjFW5aoxaZCUelfLvFQ2iSdT8b89xyQF5L9fcJ3Yp4rShEEzF/4PwL+m8BP6+j0bxxl0WiO1/lcBJtmaDhaYKtp8vIcSCt2nuK/7E24zGSqKwIaXHX6E+TvX+gu3CDlsULy+BcYoQiRHy7as3jhPR+1ZB5fuuwbrXIo4SzsYQHF3Z235QLkWKoQ46erUvE9GQ6LPh3eW1R6Lk0AhWeVQp5jIr3NYw3SHYolfBbzlNQa0xItanxIeTpu76exJJXHrmcwdaM7Tbie2QD6kI09dMbFrBXum6kp8cG51WmUgXtBF/VR5QFPdt/bgHmg2Ke80t83M7sAHHGh8QL2qzgMIAf/fgGLuGXxMB298eKs5mb+CzSAWK684+JH878Re7LeURh6awaCgH6Ie01nahByUHDciPq4SxOkg0tdw/eC44eR4pBDUdVfQx0UgF2T0GerBEAU7FxYoTv3zHSALpY/0jMpdf0CaWSnHvp1Ifhl6NbKU54oMZHMUS9VFkHWrJOzdPJ0CLisf3YbSLb/9nBjJu5VBY+PtZ0+iFy4D5qBVqzHGqxx03ogsjxyNqylHXdo/j273yxUnWxLtBFDsYJSbonAxCIN8ToFWKnImpaIxeRxoM1ZuTBEfJA684vgbPd0aMeNGdenKhSojUPko7v5xt7GkQ3XM6Wp0wzSQBfIXSGZN72YevKq6HEMOSWwoiXAgJkrk 5hhLmewy GnpTYsfurUuhAoIYZx5VYo5WFqU55CbXPH34nQDSj87psIVp9a/pA4tMzMq0f1SFroQh+PPRjZwtnPBF6vyQqcItJC8Lpwl37v/JyR+LpXuYoptE1s68j6yD/sVtsgYj1WKtMVwxS4etivFpEjkmU8ckEtP4s4fkaREKC+0Erd3pAWctlCRHU5QxzSE0biVdOXkWGUSqiRD5anNI65145VeDcWFwonKLu3yB//G11R2la5ETe9YtoeUNFlhl4cL59UZayc1btjKDXQFD5QB3C8T3WkcDrFpaGwTOgwaR8+3cVM13SxI9W8k4tKTYKupr/QZoopEELRBzeTzXtGzSkjPk1PKf6+UxY4w1e5142PwfFZl9x3JpnEOQOSwPukj1Pet4HCtHF9wdpBWZLe0LarbARTSqXBj3aA8czlpdBxoC1h12Zs9i74jy8Jw3vDLlX5MZeXSlRks6zsWqRM+A1vbzMJnWeWymNfG8RUHHKJw2/BYRWygQAY9LN6GJ/7zZI5HuCQH9f60SF4NpL/OBH8SO4mrT6kSQDC1MnFui5oRL6FQFq8aM/2yElNlhm+ZEXi4K5L0s9/AvTt/v/P6cYAvPtUwNQftWT40t/CkoBurpanIOFTqGAbG7R/fzqdn+9EpZprMgb1xCp7W0rdvlZXWgeoQGvWmsxZ54FMbXonMPSKNRTI53AIVzZ+aMXSfVuWkpV3dtgrMGP7xBfJ+x5/v3y20dSIyqd74kf X-Bogosity: Unsure, tests=bogofilter, spamicity=0.475864, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Currently, the binder driver always uses the mmap lock to make changes to its vma. Because the mmap lock is global to the process, this can involve significant contention. However, the kernel has a feature called per-vma locks, which can significantly reduce contention. For example, you can take a vma lock in parallel with an mmap write lock. This is important because contention on the mmap lock has been a long-term recurring challenge for the Binder driver. This patch introduces support for using `lock_vma_under_rcu` from Rust. The Rust Binder driver will be able to use this to reduce contention on the mmap lock. Acked-by: Lorenzo Stoakes Reviewed-by: Jann Horn Reviewed-by: Andreas Hindborg Signed-off-by: Alice Ryhl Reviewed-by: Gary Guo --- rust/helpers/mm.c | 5 +++++ rust/kernel/mm.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/rust/helpers/mm.c b/rust/helpers/mm.c index 7b72eb065a3e..81b510c96fd2 100644 --- a/rust/helpers/mm.c +++ b/rust/helpers/mm.c @@ -43,3 +43,8 @@ struct vm_area_struct *rust_helper_vma_lookup(struct mm_struct *mm, { return vma_lookup(mm, addr); } + +void rust_helper_vma_end_read(struct vm_area_struct *vma) +{ + vma_end_read(vma); +} diff --git a/rust/kernel/mm.rs b/rust/kernel/mm.rs index 8b19dde24978..618aa48e00a4 100644 --- a/rust/kernel/mm.rs +++ b/rust/kernel/mm.rs @@ -18,6 +18,7 @@ use core::{ops::Deref, ptr::NonNull}; pub mod virt; +use virt::VmaRef; /// A wrapper for the kernel's `struct mm_struct`. /// @@ -160,6 +161,36 @@ pub unsafe fn from_raw<'a>(ptr: *const bindings::mm_struct) -> &'a MmWithUser { unsafe { &*ptr.cast() } } + /// Attempt to access a vma using the vma read lock. + /// + /// This is an optimistic trylock operation, so it may fail if there is contention. In that + /// case, you should fall back to taking the mmap read lock. + /// + /// When per-vma locks are disabled, this always returns `None`. + #[inline] + pub fn lock_vma_under_rcu(&self, vma_addr: usize) -> Option> { + #[cfg(CONFIG_PER_VMA_LOCK)] + { + // SAFETY: Calling `bindings::lock_vma_under_rcu` is always okay given an mm where + // `mm_users` is non-zero. + let vma = unsafe { bindings::lock_vma_under_rcu(self.as_raw(), vma_addr) }; + if !vma.is_null() { + return Some(VmaReadGuard { + // SAFETY: If `lock_vma_under_rcu` returns a non-null ptr, then it points at a + // valid vma. The vma is stable for as long as the vma read lock is held. + vma: unsafe { VmaRef::from_raw(vma) }, + _nts: NotThreadSafe, + }); + } + } + + // Silence warnings about unused variables. + #[cfg(not(CONFIG_PER_VMA_LOCK))] + let _ = vma_addr; + + None + } + /// Lock the mmap read lock. #[inline] pub fn mmap_read_lock(&self) -> MmapReadGuard<'_> { @@ -230,3 +261,32 @@ fn drop(&mut self) { unsafe { bindings::mmap_read_unlock(self.mm.as_raw()) }; } } + +/// A guard for the vma read lock. +/// +/// # Invariants +/// +/// This `VmaReadGuard` guard owns the vma read lock. +pub struct VmaReadGuard<'a> { + vma: &'a VmaRef, + // `vma_end_read` must be called on the same thread as where the lock was taken + _nts: NotThreadSafe, +} + +// Make all `VmaRef` methods available on `VmaReadGuard`. +impl Deref for VmaReadGuard<'_> { + type Target = VmaRef; + + #[inline] + fn deref(&self) -> &VmaRef { + self.vma + } +} + +impl Drop for VmaReadGuard<'_> { + #[inline] + fn drop(&mut self) { + // SAFETY: We hold the read lock by the type invariants. + unsafe { bindings::vma_end_read(self.vma.as_ptr()) }; + } +}