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 6A220C369A1 for ; Tue, 8 Apr 2025 09:24:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BBEE26B0010; Tue, 8 Apr 2025 05:24:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B4A636B0011; Tue, 8 Apr 2025 05:24:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 94BAB6B0012; Tue, 8 Apr 2025 05:24:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 740ED6B0010 for ; Tue, 8 Apr 2025 05:24:09 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 404B21408E7 for ; Tue, 8 Apr 2025 09:24:10 +0000 (UTC) X-FDA: 83310340260.04.70B74BC Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf08.hostedemail.com (Postfix) with ESMTP id 4B045160009 for ; Tue, 8 Apr 2025 09:24:08 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=guU8JrnC; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of 3N-v0ZwkKCCgEPMGIVcLPKSSKPI.GSQPMRYb-QQOZEGO.SVK@flex--aliceryhl.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3N-v0ZwkKCCgEPMGIVcLPKSSKPI.GSQPMRYb-QQOZEGO.SVK@flex--aliceryhl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744104248; 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=fSV463Hzq4lcGHaBMKwzfTcjqbOdgyFN9gtovsbYOqc=; b=Vxn95RQsNcD8s6FOULzgKsHlFWvm5ZYVGwwUAbb4RRp1ubpKZh6Doc7itjNZd/wl8++1Hj +Gs2k+ztYVkYLwatf0hNmjRtQmmaQRzd2YdKAfJkQiBOv+x0ac7KXWTISV/Bo1zgX0rMOz fZ1ZnUZ0RD1kGKyhIUGUaqx9UFWfK3M= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=guU8JrnC; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of 3N-v0ZwkKCCgEPMGIVcLPKSSKPI.GSQPMRYb-QQOZEGO.SVK@flex--aliceryhl.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3N-v0ZwkKCCgEPMGIVcLPKSSKPI.GSQPMRYb-QQOZEGO.SVK@flex--aliceryhl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744104248; a=rsa-sha256; cv=none; b=JkP8NX1XWIi9zG/wLZBw1PS1TcjvrsJ/ZZnIZsTF3Soi6Z2n1FLP6GqE0in0qlJH4tC09r GvTlZDTeHcrWUn71k+iKElNcBrXngi0jlr5bjuwBiMhM2KZC2ZOv/MdOEsHdNJaoxe9Mo3 fjYDAcGfjB0pzqNkbqzyi+UrFJ+BjqU= Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43d51bd9b45so36714325e9.1 for ; Tue, 08 Apr 2025 02:24:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744104247; x=1744709047; 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=fSV463Hzq4lcGHaBMKwzfTcjqbOdgyFN9gtovsbYOqc=; b=guU8JrnCbKc2OuhW4iKL1wdLIkq/hWtsFg7F0NsIm+Vo4fa63kXUzq+Op5fruMred7 FL5FCLnwQR43OF/h5kKkbGPCJFkeNlXmJbTIx+blklR0bNI5B9rjLbSuVczGkB8HPqkj vSpRDbkk1BOofiN/DxoizLNr9pDDUsmnCt1HcotoLBJE3iOHFAZQQ8SSMtWXdYGN91ZJ BymCLhXH7Bub6cY0QvQ2wqFJchmqf0xKSCO2KuKqawA1ZKEFh/HRuE77DimZQ8IxcnAY A5qOqPsGlTzJZZLT+bSObT2jYx+921HkMIqyTinzJGdBN4Jrfok6gYwQa0YHzm34s1OZ 2vVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744104247; x=1744709047; 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=fSV463Hzq4lcGHaBMKwzfTcjqbOdgyFN9gtovsbYOqc=; b=BNAC3ffvm7U7XLUW0o9jdFdbWAXjmocRFGMFeK2oTqueVSfCe1VTNL+AdeSyawS9eg ew0zWr3Jdyui0X+nGaC5ZiXKvlny1nLMAaIf5Ms9xetHEIQ9pzBmLL0zwugMeF0TvNKt SLLg8oceVQ9CPUF7yj5It2J+AGZuZsEcs6sFtUAY8mOBO+fQak+ET9ffIr2rLiCmonZU BbKt6bGizaxL2prk4JCZFp/lQtxnnMejG/mYC75mvY8SQPtmeneK3EUH4W6wnTynmhxr u2ANc7ipdkwffmVgJn6SigQjLfsmaRk3YdBr5PT26BKw51sqXGiDrjqeEMu9fT9IU0go 2tow== X-Forwarded-Encrypted: i=1; AJvYcCW7XicbHGMUP1g5uZJr5RVKc4YO+UpKVsH6Sh8B8GjZj69eQoEnTZl3OKf+dNOWwl5usGSEqAumnQ==@kvack.org X-Gm-Message-State: AOJu0YxryZ1UWj3IFLWAmmhqcadtcTPXq0oI8zNM/wnNScC9b/MxX+2K 7E55YeZJXy/Oy8b3SU9CpQCzSoTHPMva6yKMjegLeWXR3CMutUcwJTIteF5c2N3ug4AJekb1ayn KEc6/3LPGN2W+ig== X-Google-Smtp-Source: AGHT+IGpYx8GY+CcPqdjvQeTUdadbSh+V6DOVo+9tIk10BZYKUulfM4YzPVOn2JdHxlRFKSX0lPoXYX9f1ZU4sI= X-Received: from wmbgx9.prod.google.com ([2002:a05:600c:8589:b0:43d:5264:3cf8]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1f07:b0:43c:f8fc:f687 with SMTP id 5b1f17b1804b1-43ecfa04a8emr120987995e9.27.1744104247078; Tue, 08 Apr 2025 02:24:07 -0700 (PDT) Date: Tue, 08 Apr 2025 09:22:41 +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=4299; i=aliceryhl@google.com; h=from:subject:message-id; bh=gF1ckMqCWHCjQXFknkNdHEiUzDYS1Ku+dCA1Sq6IckY=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn9Osn3jxbpIs+xoCWpCoObHsxRS9D60krCSnYT liiyaW/aLiJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ/TrJwAKCRAEWL7uWMY5 RoLCEACYidsumhaA9miV4nPn5brjSwUFAg1VPkCXuULdVYpR98jJerXgW0o+C/JgnKudQsmOGPJ B7MEnQur02LcSgPW71ukNXp86bWc9dSnuMZIJRiK/wCi4UEJeVVaxOUu+id75fPxyCMPS+TzNWQ QuuKW3KOwpcwFr3fW601D3P4jKIJnca7mC8wuMxunrbFpz5pkVJ/bLGhrasFOUH70F1VjBussqq ZvnZWyn9z0Ij1HBgqvzUwNNtUVq27ul92aCNCiSMf7GTLqNV9EM6W1fIKAOC4s9bA9/usTrp02V T5BEZ5zGhMzQ1uOoAUgyH1229eWh5Un0A65JrF0XHe2ZJKS2Gsbv6iVSX5CCL4m+BtcRszMLJ5z wndBdwWT2DDDJyyshSoi3FOe9bfUFnCdoZ5cNTQxrD+Rz32PN9kJ5qiPBsQp+jS2HcqTFZ/mCKe xIpYVQcyhcnRstMU/N81m1h8c/SYGx2U46nPiQXpN3Pqb4wrIDQQpMxwsnh9ON7ewaaoYEI8/2C VBeETIom53ABUiJaI7b5R/ysuayAGNljta5PvwhvI94/KVaxcg5Ys2grjswEly5jp8O/36vVuE1 LstY/UxTleVJNGEycPlzy9gTvstP2u79n1tNOhKrVQ7IKwH84lR60sVjU1jArF8+cp9zjjBb4FL LkKtiYSl9CTjJ7w== X-Mailer: b4 0.14.2 Message-ID: <20250408-vma-v16-4-d8b446e885d9@google.com> Subject: [PATCH v16 4/9] 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 Content-Type: text/plain; charset="utf-8" X-Rspamd-Server: rspam01 X-Stat-Signature: xi15wwydwww5gan85m1nznq4o1ariwb8 X-Rspam-User: X-Rspamd-Queue-Id: 4B045160009 X-HE-Tag: 1744104248-424702 X-HE-Meta: U2FsdGVkX1/eNvHTXnntVYIzKNkpOpRNtexyXpjOY5bsAlUHjBOOXwwiuckUk48T9rzDs2hJnoi986/l5gIWBIqkym3N6iuAdXpIRIPa36nQu9VR/U7DlCBwWOrP6zG6SYwOPtAUssFL8tuiP4T7No46bdZFk5YkIxbyGfcjNATQynlcKceN9fPkeCnMPdwNlZteRsE8w5cpQkUv1AJvDaS38PyTAWd2PlphVKnlGSxgnBIOzIxieqZclD5n8KEMsQKzLEUlKp16UD9lhu0kTerVrSPE2t9cUfGh+2RIM8wQJ35ooHU3Vo4wKUfQ8rQ8/jD5ex73koi+cVcKT8AwrL/M6tg5gum/V39Q6DxPU+oTuxdWDoRLj9fRiV5/6nmXrptUDaOUfl7Gig7MT06c4qY/fej9u83KhgtWaVBrs0XLhThwBrP3yAd1qAd26EcYoBXMwRkpG2M7nFtYVOYoe+Wn79flWoeVG70a4uVtxIrVHOGUxofVEEA7AlI6D3q5C5f/r1banUK7EtT+7Ntk44M2GRd5spSMbKKUHxIAs6rNt5dqch0yTXhjopRA7POBLTa/AVqLcQvnHsp7YwhHELB5Q8cue//W1MMnABbwltWVTeaD+B9QMpRkrBYl2iB1PbjEmmHxepGp/5dB8WnXaEu/Cn+5yBoZO4GwiHLPeEKWKHbPeny+DsIDWIC7wPuLBV5RZQ1nZ9jQj1E4L9Lr+jl1HL+G2hQQ9m1rVGKNny1upJW4pMPlQWVoUEZqw5kz3yJJMCyCnwMd39F09m51uL+P1YChcBzI6qW2hTjVeGgRovWP4+kemdqAKVP+BhKE2CFCIuKASzvt03qRzWyZWEd3P/ty7G3zF7ro/XYcaA8ktrT33Of5f9b3XhhcdDCqWlxmYRoqqkzACqNOmGFU6V98tZvxY/c3/35ciNw6rWiBd8WqzYellKWENM38ecqzQTGnzEhxSJmdrRaIZXg tgPLd81X BJ5MFJ2xKDP7UvYGJHi8AJddfjIbzhUtXL4b5EZEDBzNvg//F2S9nwHOzSK6gKb5bhid2qi6krOOJN9NwyMlR/V3ZReejU+IgwSaX8hO0d47CF4Fh/v+uFMrVNIvVzcRGV2yP12hL+TQkkkEkpeUIKe+KNfuh38dJeEi3BuY1QlYjUEpMwS+G/AcVZmKSprrAzSAN4NCt17oon7GOrtg93o8pIaFahXPtEVkfeSq0JPVkZQvH+5HS/KxvrpYbqHJxNU0vIAm4G8KzToqlMgbsdTA56pEVIip+qiwjWCnRVymwQQ43IpVxLSjm6xG+1MU3+KGsGtT4MpNDBh74zzPVME93xYE2Vs3R+TORT/EVIAWPW9s77SH1p83ib+hg/gYH4FfZ0AbMl6f3ghl/a0Vsw3AN90G63MCfhHsYjbM90k1E19PwLmnAj13qw25LQ/SACs8ngAy0ZOfpE5cnHNEbcVYmvqOai6CJsi+r3C+0PvstZKCUIYjSpPQ+mwE6UvtZfb9MgQ+QnDZ2FBBJPOCFgPz4i3RdPxfBDvfxfrfivntXP46L5BfzOWlGW0Oc+SLdIgj2t09XRgvUy6GgFvdvBD+KS2Ljfu4mj+0HZAtbeMZs+qesxYVMWgpHFZEQ2nKxIWe+KmBUnH4TDvuCvidxkrIacgydboaf39HJieET/kNC36K36KMbqaf+AgVNE6Sm55oeAUEKc5NjhlVg5oWrWb4IpIeLB2vZNu0PfHtWRGmX/Ys709l+O39Nb+99Yix6yb4pPKPSt+bI+1uyA/M84lyatE/MhzwYhHX5 X-Bogosity: Ham, tests=bogofilter, spamicity=0.393526, 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 Acked-by: Liam R. Howlett Reviewed-by: Jann Horn Reviewed-by: Andreas Hindborg Reviewed-by: Gary Guo Signed-off-by: Alice Ryhl --- 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 7b72eb065a3e1173c920f02a440053cf6e93814e..81b510c96fd2692dcb7ab4705f790bd3a41a630e 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 f1689ccb374078a3141489e487fc32cd97c9c232..c160fb52603f8d4b349000451e2200fb477d98a6 100644 --- a/rust/kernel/mm.rs +++ b/rust/kernel/mm.rs @@ -19,6 +19,7 @@ use core::{ops::Deref, ptr::NonNull}; pub mod virt; +use virt::VmaRef; /// A wrapper for the kernel's `struct mm_struct`. /// @@ -161,6 +162,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<'_> { @@ -231,3 +262,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()) }; + } +} -- 2.49.0.504.g3bcea36a83-goog