From patchwork Mon Feb 3 12:14:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13957355 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 D844AC02192 for ; Mon, 3 Feb 2025 12:17:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6BF3D280013; Mon, 3 Feb 2025 07:17:52 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 66F00280010; Mon, 3 Feb 2025 07:17:52 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 538EA280013; Mon, 3 Feb 2025 07:17:52 -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 36F51280010 for ; Mon, 3 Feb 2025 07:17:52 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 445B41A2A0B for ; Mon, 3 Feb 2025 12:15:24 +0000 (UTC) X-FDA: 83078528610.28.8C0788E Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf19.hostedemail.com (Postfix) with ESMTP id 54D811A000F for ; Mon, 3 Feb 2025 12:15:22 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3FZRO5Wq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf19.hostedemail.com: domain of 3WbOgZwkKCIYkvsmo18rvqyyqvo.mywvsx47-wwu5kmu.y1q@flex--aliceryhl.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3WbOgZwkKCIYkvsmo18rvqyyqvo.mywvsx47-wwu5kmu.y1q@flex--aliceryhl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738584922; a=rsa-sha256; cv=none; b=Ml35338H+K8yBIWc1REdKT+1bvOB6OFBk7gah/ThtmrxQyv4GZlivjqU+e9lsmHIaj9dbb h8rV3bpJF3COVCCNagurDUagedd1bhgQJe6kHLNdkRbawOcv5fbO2AC84R4DjCTh/QyN9O cwen77Zolj1r05q2oqFZh3r2Qr46Ego= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3FZRO5Wq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf19.hostedemail.com: domain of 3WbOgZwkKCIYkvsmo18rvqyyqvo.mywvsx47-wwu5kmu.y1q@flex--aliceryhl.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3WbOgZwkKCIYkvsmo18rvqyyqvo.mywvsx47-wwu5kmu.y1q@flex--aliceryhl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738584922; 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=agGGNAI6dzqkGe48/M6YrHXUKPC4ck0xMNLxp3OFHVg=; b=pjKQHosHJ2K8nTunqULESbMLF9eBgc/Q6FSfVa9Z8objerf6QN2OwCxbVUPkDM+cIvMXIr DgQIl4EasaU8OAyjwY4Wakma/uOySPNSGuPmZbtH/bP5dfFkeHZfQBGuAC00nVXs7IqiB3 9+tSnN+GDk67z1Cmgyqgm9RnDd5HhOk= Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4361b090d23so21078985e9.0 for ; Mon, 03 Feb 2025 04:15:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738584921; x=1739189721; 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=agGGNAI6dzqkGe48/M6YrHXUKPC4ck0xMNLxp3OFHVg=; b=3FZRO5Wq5XrPZscd2MlIY+RZs4MHU5xjxtQPm+idceCgmKEnnqFUE6nN7cvegUR+b2 kcDmm/yvISH/jjlON8sqKjqoVHZOCEtVzLmGAv9cKvmGWdSgxt37nJUPG+GqTZb4qoqI eQpJJc5b6NfCGj1HRrjWbrCKPPmQo2LPQ24mA4ea1rX6iItcp7L3Nz2nKtqRSsjRct80 CLbYBYV5c+xCruaT24Dmeyoj0tjnVn8BOwk4j7Tspe/dpkFSDxgpNOHgKeCFUaCnnF9D RHX0y2j8p4JObvG3O3jI9tiiMtT1AUY+R5Git6Bjyg7DlxjKXf8Ow/n+azvfsutZrTlU rKBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738584921; x=1739189721; 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=agGGNAI6dzqkGe48/M6YrHXUKPC4ck0xMNLxp3OFHVg=; b=max6l9zrGt1dJ88VdEDD3pv40PnW4wDlPrNi6qNYTWQY+Q7dS2Tn2drcZfdFmUlSzP f9qzRTPmZacN2FJy+mjR/Hw02TJ4EehxbFjk3Yn2yPMXtXBABeUGD3uYXHD0yO0j5SZU LG8dZIV9WCA6Ws3n3Gf0z/FlXKusun7S+r/UXZegkGuzUpyxS46p9jn4D5Hv8A7zFiLn icmqT4w5wqh2fmvFNd5UTLRX9OPyGPxVFV1ywKrSxhIfb227qwTM+y4CW7yt5BpEz3q8 5ykHbCWFOt8zb9Iob47s/cvjNISbbhWoP0eLY/mBwnIO2QNgErGrAsQwn4OX/v8FPQUf W0vg== X-Forwarded-Encrypted: i=1; AJvYcCV5SYEnmNBcxS0Dam4M8+Z2BxeuaiinfNzfZiWaIKqiiv1LMjXGpkuR+TMy8G+AoEHs4pnbj9qjLQ==@kvack.org X-Gm-Message-State: AOJu0YxUjxMJkYAqsRzjQgkPl2W9AF2IZOHHAsZa1NcCNXPCOcZXvoHy kArHf33dmBmeyQeVHCKAlTUm5D+vXjRWdxD1acRC2oWdSDm3SA5iNtZy9AHjjKqP881Mvmy3XZN SxXdM1LaEcVIkpQ== X-Google-Smtp-Source: AGHT+IFE3v7o7/Sz3pTYj30D1OhHhtCVRBlS00wbtCjNS9IpojFNCzjRXbNgbN2xRkNUtsN78KvI86exjL/4/EU= X-Received: from wmgg2.prod.google.com ([2002:a05:600d:2:b0:434:a7ab:5eea]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:198b:b0:434:a468:4a57 with SMTP id 5b1f17b1804b1-438dc428740mr163084545e9.26.1738584921017; Mon, 03 Feb 2025 04:15:21 -0800 (PST) Date: Mon, 03 Feb 2025 12:14:39 +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=4110; i=aliceryhl@google.com; h=from:subject:message-id; bh=4KqYDSUVevSLVAAHd54nWgHt2kwwb2fi92Kf30lYrZA=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBnoLNLTSZ879yrBzzjRp+x2lwRObccwq8BnrIWd lf69cZ88PeJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ6CzSwAKCRAEWL7uWMY5 Rm5ND/9PWT1+Eh/dfNIY7NIkFk6+Vbw7I0kgRvqoHU1ZGmP6M+gJ8foSrPKQZqPleKcy7VGrBV+ xj9vOknJIzKNFILLuZE+BQjkcqJckAVx2VnWb+9Ow2q7nDrCa7cC914vve8qWv+6JFMvq6PqIyt 5/J875aL+HC1hE41ROziRZQWZZCwq7KW5n1Jn/CqrXkSfsIrBse+DFUhhp3JNGj55YQ9BzJ5ZdQ LKyXDblmpmH/npz8Sqx0/Ea0UuDEM0+MEYHzZ1XUjzJzwBjoO6eSuQBHyxCppe1CgarpUzRABWj 6f0ZsGQTIJbWK2IzLmYW++OoqjZZBghXwEM/uKfw/L6znFM6f1SMFwVG8OonHtPzKHdSPYZ+cUo 0BJor8b1WM/bhTiUvmWJlAclvh/NlrkoRvPrFHgs6RK3S3G4AC49XeIUzKyjA7h7x5sEV9/c7VX npGgaAfRUCrcrFd2Ba8zf7ctDYAS7JwPrBe3friwZvgJPpHcHs/mJ2Hsy3qQERz1HFBJCAA6+iq SqQ/Co+NxC4gMDJLQhKtexo6uuB4JJvSlDOGKTCkCa/UYE+YYkDozLx9k91TAbPQxTvLQHxLJxP +ZfsAY3m+RZ36I+d4hnDCouPrz0VkieyDtcs1aZ226wR/2fx7WmRm0X/EMFPmtbLonr2DAQm5va E2EB41wG9r8vPDQ== X-Mailer: b4 0.13.0 Message-ID: <20250203-vma-v13-4-2b998268a396@google.com> Subject: [PATCH v13 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-Rspamd-Queue-Id: 54D811A000F X-Rspamd-Server: rspam10 X-Stat-Signature: 653r1pmsm38c6p9aagxffx8pjf34y7u5 X-HE-Tag: 1738584922-169611 X-HE-Meta: U2FsdGVkX1/lyHlfasDZIC8MDQ1HH1lTpALs2ER5NBBxqcDmXbNm7YosFXg9spqRghdXJxb8JmxT76iyblhAy4juEdp7xy4KYVwwID8q+5vR9lp+E5hj1RF7JtKfOTgFBHD5WTbDKo9uZ1RmGvrxqaDr2vKif4X97GgZ0IVkjlA7SVSWikEWgoYCaRk/d+ZiJbxgBjiwBiov1RjaWchglSiXynkIMD9alTSN64IUoXewK0ks4lnyYnNIlN5v1lrNViwKkgNnYIOV0l2IzNCNMedljWF6cTGwYdqWq7L+9t8Yx74u99D2mn+f9IiXmFwvmRUgUD7mn/eQXlrn+jD7YxPYGbnYuh+QbpISqeRIDGwnqxw+GZbaEP+4ac9GqmrJv+ehNIQALaJNIPICjpX/vGfgZHNQI44vtCqKQRuaNdX0npVOlHcWQoyoKbpE/LwmrL1YHrvaeUJL9Gyb4ThFZ1EdnFt+UvxSYhPe6f1UMIfMwPcc+1qNFDpzkXkzQ/u/xpoiER8STmtUj4EAOuGdqtCP83E6AIajTdJ085y0w6iY6NfcOTth0LBmzLI9+szw6op+NrUZdBNW+N/SDS90cgDI8kLvLdYL/kWNcE4vgXCFnJoaubZMmKwhz/VICBo/+iT3wtnMQI9nZcJwON6a2GYl0hX7qKhpRcsw+tFU2b0B7opVO8JwmoJF+RaQr/ve4e2Z+2jxzbxYBRDHVbdevDR9v/0KPIa++qwuKE32OgR+a/AejlFgstQeqCaV0hlQOxTvkwA3K4gTF97LxVcK6yH2czRxmwmj1xEY+26kIm5s/iEde5o4lATHXE/RBTI5JGHukZAZaN7bSvk+oaP2ZW72GAu8yTz86yxeRmwL0EPfHME2h2pyCjQiC1xe1iw2b1wpAJu4JDIv8EYbl0t7lDvnmZbC3i4d3fefSYvoRMgUmszE1xucaDdvb4bNZRaJ6I8fTTujd624VFsK6dn ceO1URbW sWrT060VRHSUm2z8GE443imdjNIvjJfEMjS/LJZBhTc3KO05nUfmOQYwraZjD06+P2ZqqKS2IZ+IGm80K8ch0cMZrYgf+6+Tqi0XlPVYkVoJq1r0NYwJfJ6Hkx8SsESMDS7uk/luwfqu9nzW+R0Zs4+LSqRztN/CuUwYyeHHH09IYPl+lR/e3bzk/KFNzy3GpFvm6JLHWSTxY0ox+XjOBrXgIytCiYLFuKyQKuZARAB2WyYDMXzGPl6VAnUoSjHaW9Kkqp6JWLegbi8gv1+5VFTI4E+bmTn41hp5B+upcbykbcNQMqtDXEQvmvBHvVKFD2bSnjbEsprZ4QjZ9EkSOHLhgqFZd7oyiayvzxsh9a5qrB5/6Uh+BCcv/53gVKPpLkFZmKJb7GpOZ6fCvb+ubvGKwlKSgbFkUe2+eOS59rOkzkrQ6mjA4Xwbz9IbVsLDZjqLmnoXtEnZ50401RvuKVQSi0V4Kx8wJevV0MIB74vvA5IROxLSCLzSL7KsgiWVZyYHC5yBMqYO/bl+0ot0xxWJCt38AvoGsvT8WqMwuBILRwSbf2ZomXLDwHdrBZop+pOcwj3wmQg2ts6oyt3KW7kmyDnjfCtaR+Vg4piK/0DKlo3/88+CS+n5RZkdCD0cXcCpkfyPo2K5LJIhkZisTOICgDJBDAh+yto7yUA2s9450JY+Mx6n54zgXqMa3V+2NG8S7cPfbeRFb+eeph1EBHuPzh3hVNXb/zPH3UMKfqqfyZOw= X-Bogosity: Unsure, tests=bogofilter, spamicity=0.484742, 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 --- 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 bd6ff40f106f..88167c0cbd93 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::VmAreaRef; /// 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 { VmAreaRef::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<'_> { @@ -228,3 +259,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 VmAreaRef, + // `vma_end_read` must be called on the same thread as where the lock was taken + _nts: NotThreadSafe, +} + +// Make all `VmAreaRef` methods available on `VmaReadGuard`. +impl Deref for VmaReadGuard<'_> { + type Target = VmAreaRef; + + #[inline] + fn deref(&self) -> &VmAreaRef { + 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()) }; + } +}