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 59023C02192 for ; Mon, 3 Feb 2025 12:15:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E3825280012; Mon, 3 Feb 2025 07:15:43 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id DE7CF280010; Mon, 3 Feb 2025 07:15:43 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C8822280012; Mon, 3 Feb 2025 07:15:43 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id A227A280010 for ; Mon, 3 Feb 2025 07:15:43 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 6862312275E for ; Mon, 3 Feb 2025 12:15:26 +0000 (UTC) X-FDA: 83078528652.14.25C10B4 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf03.hostedemail.com (Postfix) with ESMTP id 6F58920003 for ; Mon, 3 Feb 2025 12:15:24 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=KyNCgvng; spf=pass (imf03.hostedemail.com: domain of 3W7OgZwkKCIgmxuoq3Atxs00sxq.o0yxuz69-yyw7mow.03s@flex--aliceryhl.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3W7OgZwkKCIgmxuoq3Atxs00sxq.o0yxuz69-yyw7mow.03s@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=1738584924; 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=6wKw9Mczsy3GQd6f513sHnBPndDv3PUBzx6N+4yBSao=; b=QVc9WEnvUDBlzhR92HdxsCN74oYk88caiLVeuXalT2NpmwhTzPOl7dB7rfFl+fARczt2cu mJeYIY8BBbEzn0Tpw73btRs4z8JjU9RQcNaX/cHEWCzMhlq3YcTFl+61fsYi0zNXPkQyiA /j1buX6SDhFJnTlGg/C2Gll2Zu5WeCo= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=KyNCgvng; spf=pass (imf03.hostedemail.com: domain of 3W7OgZwkKCIgmxuoq3Atxs00sxq.o0yxuz69-yyw7mow.03s@flex--aliceryhl.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3W7OgZwkKCIgmxuoq3Atxs00sxq.o0yxuz69-yyw7mow.03s@flex--aliceryhl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738584924; a=rsa-sha256; cv=none; b=R7PynJIoz4sjsqvHYLkf0696nNgHVcHP1SO/QMileVjN2vdw0m3kLXKLWRduq+FzZtKoZd 8ksiq1SdaM1UMsaPeLVvo+R5cib2bDLKNTfEFRzxuAApL11iacOEalgOYiXEdm1oMMYoBx r2Uj+xtFkqTn0oRDN1b3LVMuLje3B+0= Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4361ecebc5bso21032285e9.1 for ; Mon, 03 Feb 2025 04:15:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738584923; x=1739189723; 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=6wKw9Mczsy3GQd6f513sHnBPndDv3PUBzx6N+4yBSao=; b=KyNCgvng0/KlhW5iFkdcwxZ0OWnQ3tV9O+aJam4A0swtQMtN5RWCpRWUZkwJtu+sDc bt6kys0ft3Nqo3GC/TB6AvB3CfInazah5StD9WYScOJryvCf7MVNG/WIcXci1KdB0h/n +Ds8Q4ws9qYcck0F2U1nx9Jndgf7MhQ5gPEBfD1KhD7K6Yms2ZXHIfYuQCrOaDLm4qDQ MwyDlbMVOXl6AyUhUaZZAWvCmyqaWyuLS2/8wBsXbFUofQzn5SbCkSRUW+Vjm1FyHyjn K9X04LNB2fc4q0MAffndosehOHAGzN8vPhQ+5jzQ0xdbN7WhE4BumMlwqIgewEMv74+Z cg+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738584923; x=1739189723; 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=6wKw9Mczsy3GQd6f513sHnBPndDv3PUBzx6N+4yBSao=; b=qbnrFPcTXkUwHbtfK++URIqm06bC0Mpzg54bHbxs0UE7cAVsehzy2y3ZBfm8nmLOUz VGG4V07uPaCmyTuBpa2/rLr1t/67Pvr86lISDDtuPTqN8tEjBJcdIr90mca3uLzpLBoY Ly1ZFf1ub67hRqluGHXg13yyZQnuNa5EnFM2Zi8EwhB05vSaTlHJNyyMPE2kJIPnhVLW LgupwNlZwNo5TTKpWBhm+CWKySPuVVlAqauBRIuZC54zGG00DfH0UZXnWtQnEs7Bx40r srPWiyJf76CEOrqL4D18UtQ96cKXVZjWp2B7oMflMZMzERtisNmRXVlG7y6QIOFkA/Qm TzYg== X-Forwarded-Encrypted: i=1; AJvYcCVmPrW597T/BeWU3Fp/Q55YobjB221XJG2/mBuh1LEDZxPyY9kBL7mdlSfcJF5r8M27tkgvKLGtPg==@kvack.org X-Gm-Message-State: AOJu0YxkyFc2sBdUtoB58nB8XrKHel8JTtuwwkImERGI6pJ1h6OzSaRL edycAPPA8nEKOchiWEoRm22PbIa/jFaijlDKhs6p/90Wi2njPQAOFzZRAlRLv1ixW8JCDkU2PCL 1XmYQZOqCTMrdLw== X-Google-Smtp-Source: AGHT+IGCacv+6M717acz2TK1/3JVC+EAq8qtKNOoyAR0vAmx15aLEyGhA+8TxKSJtahX9auTkLFiUsit2j20Pw8= X-Received: from wmbay23.prod.google.com ([2002:a05:600c:1e17:b0:434:f299:5633]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3c89:b0:434:a7e7:a1ca with SMTP id 5b1f17b1804b1-438dc40ffaamr172046805e9.20.1738584923172; Mon, 03 Feb 2025 04:15:23 -0800 (PST) Date: Mon, 03 Feb 2025 12:14:40 +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=3164; i=aliceryhl@google.com; h=from:subject:message-id; bh=ACsxo5nqWOfFud7GSbyxer8izfkYzgJ6Pryyu1sTy1I=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBnoLNL4o53AT5ZPycfgR+LVXykH5mUGeHNBJb86 PLfYDNydpeJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ6CzSwAKCRAEWL7uWMY5 RiVkEACBiFS6xSL3eKzx6Ld9VzUml20GBqlKuHKgONIlsSMzAChjH+2qe05ePtG6sKfXIaQR9sZ 6iur0KMizrFbW7s66SOtt+cdm+p6Vnn6Jm+IoPzZqOMNZeAEbr7OHiO74Bg/ebwRHevUyCUQ7g+ 1l9CNSBR4la/6gY0ZZYVN/a9EqbCiwpXB6MppK0IOlZblODbko3NbpbCvd9+EMKcVf8M1pYnNgm rgZPCBrAeH2hb9hh1AhYJmD+iWtkVbFNtgkK8crLJahPfED5mGv3ezMmgO7XcZbsAvZh01mp5hb F+v1g99IzTWvWxgDmujStn9sSgS9lG1wRX0LAtY6MejBJZRZ+EZAnyjKvg42G626oq+Rw+S957Q LcOW34tMJGTKNF3PKuMoBzb6OFeeft3zZ3DBhDsJPG0mIX0YiJbYN5+ZGGO41yjBFghFja2Q+ZI W1BUhho9nvX97vcq/7OTzmWvx+aZ3p3Mlm70hNHAyWxqmhZ3lk5EmOKI9JOLSiLGz8aQiTqyPXy UNcZwUe/jh40mxP+WzrKbG/d+lx2DkhWKl1djkyMfavqjFB2zNF/B62kXjxJlrgEvOe0SCy11NM 2JBX2r9rPWoOIL4kLE5W6/emdo/nTlXLmInzZsmBNXGaTikC3bgIBqBIb/VbRetmQY0g1JXVL1Z 9+Xz+7ht6LLxR/g== X-Mailer: b4 0.13.0 Message-ID: <20250203-vma-v13-5-2b998268a396@google.com> Subject: [PATCH v13 5/8] mm: rust: add mmput_async 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 Content-Type: text/plain; charset="utf-8" X-Rspamd-Queue-Id: 6F58920003 X-Stat-Signature: 6ge1jaqje1szrceawrpfgrrjjzhhbn9t X-Rspamd-Server: rspam08 X-Rspam-User: X-HE-Tag: 1738584924-186912 X-HE-Meta: U2FsdGVkX1+wCH+j8jCEin/78txXPZnqfVdeMbAlXwlI1QCXx6uTewCTlBZjgtt+CFrZGa3are/5rN2FebBCxb3KyNhD1TU3PweJfTb5xiabNggJQbOkCEx2SPlSONkCwN5Z68bDpieKA7zlnbADrn2a3N3cjwuNA4aWhX2oyCs6u+S9duPYoB7EcJ8CK9OVPH7zUK04MHhhw3dFqvu42OyY9T9lOrMpm/saiPFw34bTHU7ip6tjraZh/IP4rhKOKxys4hyxNFKYcbnQKBEJeutqMWQGJ5Nj2Fi/jL3StnwiTAgiv+o5LS7UoGINneRsF8d8UjsH0IV27J9xLn8qnOTr9pQoEWR3qLJNQe07dJb2JGI3quli8byshpIMzydcZMGrjrAfLMRWsDEFifL3mpD1BaS3Q2a5zX2OVFpTSEOPUAdRdMH33u4spyDdlny0Yt2sDWjiRMdcqCEnVj9x56AiyRpMUslDJ7PB3AqK6rlKMbIPfnELp/BBgDFlxZUN1uTLEVX4bhQ+mEKfgxq6mtetRGEtascHUtPnAvJj+ylpmmO4P36fSOchW2Glx7fZW47IlfSENTpjtAfuMso5dhPjnE+MKvQ2hDMNs3PbjI8ObpoIIFtDeHd+4BQJca/caILeBwAKY5LEuux6O/HqowBTzgPbLTRv/1bkq1XA9QTrkgiwl1lrPlvuyegsO5upwwJPNGuWJ3psoRA0lWKUc8MMh26k3dzKLiA79Wa72mez5l+dPuhaMWhQc2m1JDM0Y/GnVfJRalsgSXOl3q+tYQNlaqYdZnzDl+jns0gFaPuX4WJKwk9VLKUg/JX15NeHgqYEDgSBcauLrZUCV2Qt6BWKN0yse7+N4mDGv7UWM0D4wzLybUzCr3Z38MLh9EbEwRBRB1zaKkFwGpzrxFJYvgJGWA7IBDu6tDq7dEqVKgGAuGZESCiIgTTbGg5SOrtJ40cowv+AjygdneTxg7e eWRcRDdO Ll5nlRXXpYpCY/rwg8P5zBrzmOn5cLKxD+iG0LcrJY0sMrW+rRspaQA19W0HVVyNEUTCFrA45EVTno1ai+QDEFdSLCbKueO1MRVAJTKsc+WK1ZHKUwJxTq9O6MrIUwTkR94dzSeJWtW6GA7FZvTvfBAdbwJEdpAbc9Z7LRte+Nkv9mu1TzQTkeUuviKNETUwhI6MdSxFhEXXQgY7LFS9d05+mn8YfzBrfLS1gbfpkG+MJdcxUIdzQ+gTN+/nSbaTBewDsjQxq3iqR9KmnCZm1BNi8Ns9+Bvd3ge7nt0Dqe0hSWmj3cFoiTZCg/ShFt3QkrM2t6hSW4didPmBVd49Eh47SmvTXxaGlBbuGwMJBA0Tql/sFiIV42/jX/N57oka9aV1I50YPjXTtUOFdlT2DtKAlNCFri9Tu1t4sMrRLW0KI0TUQlS3TFtnETBS6XmEt7s/bnRMAPmwwr6MOqP46Yk1vate91M4LjgrF2sv0jo4785Q+spl4C2idQiLrDHjEcxNlDCfbad//BdBOERniYJIO+Apy9A2wULd9NZV5PgCRBYn4cUStWioQDhbyeFOOY8xpFZgoCfSDTeGnmBxf1wCi1KFfHRqyZygFff+qYr7zSL7JFJ8b9h4uf8JZza+LyFjNkwXq4hEmHBmvoTqV8mEoYXa8Wud1KHXzWmDy3OZ57MZd8z19gS7hMItLoBw5G/Rl4Oz6/F/UaHvcj9W5p84Kb2hHlTloDoT1 X-Bogosity: Ham, tests=bogofilter, spamicity=0.440840, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Adds an MmWithUserAsync type that uses mmput_async when dropped but is otherwise identical to MmWithUser. This has to be done using a separate type because the thing we are changing is the destructor. Rust Binder needs this to avoid a certain deadlock. See commit 9a9ab0d96362 ("binder: fix race between mmput() and do_exit()") for details. It's also needed in the shrinker to avoid cleaning up the mm in the shrinker's context. Reviewed-by: Andreas Hindborg Acked-by: Lorenzo Stoakes (for mm bits) Signed-off-by: Alice Ryhl --- rust/kernel/mm.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/rust/kernel/mm.rs b/rust/kernel/mm.rs index 88167c0cbd93..1c43e51c9cca 100644 --- a/rust/kernel/mm.rs +++ b/rust/kernel/mm.rs @@ -110,6 +110,48 @@ fn deref(&self) -> &Mm { } } +/// A wrapper for the kernel's `struct mm_struct`. +/// +/// This type is identical to `MmWithUser` except that it uses `mmput_async` when dropping a +/// refcount. This means that the destructor of `ARef` is safe to call in atomic +/// context. +/// +/// # Invariants +/// +/// Values of this type are always refcounted using `mmget`. The value of `mm_users` is non-zero. +#[repr(transparent)] +pub struct MmWithUserAsync { + mm: MmWithUser, +} + +// SAFETY: It is safe to call `mmput_async` on another thread than where `mmget` was called. +unsafe impl Send for MmWithUserAsync {} +// SAFETY: All methods on `MmWithUserAsync` can be called in parallel from several threads. +unsafe impl Sync for MmWithUserAsync {} + +// SAFETY: By the type invariants, this type is always refcounted. +unsafe impl AlwaysRefCounted for MmWithUserAsync { + fn inc_ref(&self) { + // SAFETY: The pointer is valid since self is a reference. + unsafe { bindings::mmget(self.as_raw()) }; + } + + unsafe fn dec_ref(obj: NonNull) { + // SAFETY: The caller is giving up their refcount. + unsafe { bindings::mmput_async(obj.cast().as_ptr()) }; + } +} + +// Make all `MmWithUser` methods available on `MmWithUserAsync`. +impl Deref for MmWithUserAsync { + type Target = MmWithUser; + + #[inline] + fn deref(&self) -> &MmWithUser { + &self.mm + } +} + // These methods are safe to call even if `mm_users` is zero. impl Mm { /// Returns a raw pointer to the inner `mm_struct`. @@ -161,6 +203,13 @@ pub unsafe fn from_raw<'a>(ptr: *const bindings::mm_struct) -> &'a MmWithUser { unsafe { &*ptr.cast() } } + /// Use `mmput_async` when dropping this refcount. + #[inline] + pub fn into_mmput_async(me: ARef) -> ARef { + // SAFETY: The layouts and invariants are compatible. + unsafe { ARef::from_raw(ARef::into_raw(me).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 -- 2.48.1.362.g079036d154-goog