From patchwork Tue Apr 8 09:22:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 14042484 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 D6490C3600C for ; Tue, 8 Apr 2025 09:24:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A45DD6B0011; Tue, 8 Apr 2025 05:24:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9C5EE6B0022; Tue, 8 Apr 2025 05:24:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7CC6B6B0023; Tue, 8 Apr 2025 05:24:11 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 520FF6B0011 for ; Tue, 8 Apr 2025 05:24:11 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 1A9371209D7 for ; Tue, 8 Apr 2025 09:24:12 +0000 (UTC) X-FDA: 83310340344.18.E0525D5 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf08.hostedemail.com (Postfix) with ESMTP id 5D198160007 for ; Tue, 8 Apr 2025 09:24:10 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=U2adQ5Tc; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of 3Oev0ZwkKCCoGROIKXeNRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--aliceryhl.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3Oev0ZwkKCCoGROIKXeNRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--aliceryhl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744104250; a=rsa-sha256; cv=none; b=hmdMpnwxELh6w6WprOqHs2hQjjINX4rH1bB1cr/8Fnz0ayBRtJux8zAt8K+khXOLavWpik cy4AP4wsQaWnSJVKvDyhSgzHdNKXNnx/WgFCa1DN6pAG2s2WI8Q263L6Dn3DvLQyIGfzl/ DSgRVJ/y15+PHZ86fl+IP+yCWYVrObw= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=U2adQ5Tc; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf08.hostedemail.com: domain of 3Oev0ZwkKCCoGROIKXeNRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--aliceryhl.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3Oev0ZwkKCCoGROIKXeNRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--aliceryhl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744104250; 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=bACckoQSwDfUzBFoYMbXvpmJP89UDR/iGZngv5w49FI=; b=0wg+joD6qXPV9FdaNkCJFuFMm+BXU0wT/zysENjnSJdOl47Hkn27FOsscZ2iL9m5v66iuJ Qgoa3t1LGzmZf8vNDVWXBZGx4xR2UY+QuFkj3qJ621KizQoRGzgZ6z984GYPwGiwnHMH/W y6pm8QdjjcrP0pffHdI340QZcxhD8FE= Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43cf172ffe1so44215385e9.3 for ; Tue, 08 Apr 2025 02:24:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744104249; x=1744709049; 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=bACckoQSwDfUzBFoYMbXvpmJP89UDR/iGZngv5w49FI=; b=U2adQ5TcGT0pSPLFxfhkjaPesXhv2F+n9264GquHtYNDKrvwXW7E2P/rKb+Qa6PLFE nICPQvSp94ZL/pZ95eUBQktQLf7egV7W4vBieDgfK+taB1nYXKbnsD7Mh+7LZ82vU4E3 NUE7J3bHR1qGbXBDoF01GPI4/sKGM4p+K7KGaSg8XM9kvlnZvgAFQ77X8cUXFOsTxhp9 XfC7QyWnqiAZsZBcReXCNKYikCdiMZKY+IKV/h9KGo6J7ubwxt3/G6K7hBYU1r6Xv8r/ S+bYj16b/rKxVPRTa7kY+R6nIAVc2qyumIsGggBIRrOT6/hPNRrxauUVHFy2YY0XwC8k 2BNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744104249; x=1744709049; 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=bACckoQSwDfUzBFoYMbXvpmJP89UDR/iGZngv5w49FI=; b=QhsEqa8HYpSO3brx0z+H79vqEHWIwkMuDs2HiQnbFOOUXywI8mpnwQvfqPKOW4c+CH 111KRhbDYTsKKSD0PvZKKipAcuH26KDr1xq4MwlKPBmUMaN9af90JKcd4RysF14mv+7I YF12zDsbn4hLgnsL02y3TPj7ALn9hSH8J5HFpIWEylZGk5cLWYlPFwqoP62dvQXmL9wl G5KMUhRPjCpdZBIxIPo/RNFbDn90Rk+rZjmAhB7eEHW5A/C4cJ7TnHnzjIwH1UWAfQ2j r3AJO4Zu65LepPCUJ/vMwkFpkGuWowk6erRf2ybefaNaLQTzTzf074o/NE2cWIWn+ZuA tzNw== X-Forwarded-Encrypted: i=1; AJvYcCWtgbVrUAZVX27z6LRgesujgsb7RnMWHhhMHqcUp36r5Td8crR+G3GxRzKK0/nzab0DXrkBJZRHFQ==@kvack.org X-Gm-Message-State: AOJu0YxX0CKY4Qhgto4UGbU2jTG0nAGPXM2tHCH6TDP1LMvuAFhdIE1r +1A0STe761goyj+aevB/kuTBLbnOvqJaDDPmr2TQ+VqCvJa3VL6q/h4ZTV7cXvEUo18mkABXCxk b1ZO5UKIYe7DhYA== X-Google-Smtp-Source: AGHT+IHDWCtsJ/5jduSfjKCiGsbR920yirUwpI0CePyKkQEEcAeAv5QDUW+I6X/+MdTEL+UPb7oTVguYSXBKpx8= X-Received: from wmqe6.prod.google.com ([2002:a05:600c:4e46:b0:43b:c914:a2d9]) (user=aliceryhl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:35c7:b0:43c:e7ae:4bc9 with SMTP id 5b1f17b1804b1-43ecf842969mr131465855e9.1.1744104249155; Tue, 08 Apr 2025 02:24:09 -0700 (PDT) Date: Tue, 08 Apr 2025 09:22:42 +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=3335; i=aliceryhl@google.com; h=from:subject:message-id; bh=LmtcKlgkxP20LxSNq37k/eXJOg5jI9B+op34oo2QYlU=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBn9OsoxyVRA9K3PlCKr3B/V+eq1q3gOWsdM/eiZ X6K6ZfFYLyJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZ/TrKAAKCRAEWL7uWMY5 RhEYD/4kfuPcMl/0QAODznj6Z6rJZ5GbQA6paTos+nodEsXLiY5K7KF8sXZ9m9HJTOXfxUpr35t 9d3MYoHUG8X+nN+7y27bmoEl4iX4gIiMayP3g7ZdhstImQd7F066cNJcFBH1sNAOrVXuJxIyEY9 SoBJu8KFCx5vYsInFWNcy/zUY8h+JQTgNr1Vl9IBy1zSCjtNFHjUje+j4ntKN94ibZED5FQ2j8z kWu3QLhK5v4A0XpD8yt/ukwfDgKuUXwSs53w3MzZOgJtBy3eRmPapqXBfACVrKQz0PbKyzWPs2x i0f5UPpqZbWu9zmyRHmd0HqUUJnZvcUe38eNlOS241KVxKtb7eZSqiASAOGSK1DMV+XyFxM2WRN txmkDEKuYUrNMqeQi9yYhnknTvQbllMTtDzr0KeWmeP5shXPPOmfJETUe+qKjzKhNlfjZeLVu1e QdG51nh4dJk61DNeXYIq7gzxCMNk7bFLWJbezGnGlLYV2Gf0q6raYCAtwOI1iMn/qZeRJTm4J0f zLvHzfkLprVn689x4BVJ7PD5SNMmxS4BJVqiYhlfxLF/AVPW2LLg6y52gXb/ZckUu9csL3tZV2y XTi1fsOmVPx1sq7h/Cvwhfoomv9yQzJlgkzUgg0hUN9+m40owcDN8CNsW8duOTqJ68tXwJ/GwXT PGfD3DtHd9SDcgg== X-Mailer: b4 0.14.2 Message-ID: <20250408-vma-v16-5-d8b446e885d9@google.com> Subject: [PATCH v16 5/9] 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 X-Rspamd-Queue-Id: 5D198160007 X-Stat-Signature: 58y8pzx9r4xghtfycetygcxiu6buj3as X-Rspam-User: X-Rspamd-Server: rspam06 X-HE-Tag: 1744104250-849253 X-HE-Meta: U2FsdGVkX1+mMXR7G1VaUuyOi7JF3V8CHvhzj0f9Pod4gBbloz5Zc47bKGlRCEym80zmSypksoI92+CNIIQyaiVWzcerG0xEO0yHUYnDNHjtWsXP+qe3Wf5JgWFMqaI9ilgB4ZJBuqjmh0NUFMRztpdNWTYov37BqD4eV8qX4oq0iJ7tsJngAsH8gNazAJBN9/CvfppGrc0kJ9yuGq80ldscze3LsaF2oLzLRZnAse74TfxmKk6kbT8vOmLAhsuMONsOv1DPk+lBrmCkNHtin2LVJXxFpGlHJz+3ic4nerfu1EsajxLNHeDYa0nEZT7HbPAgzARhFPlnDy/gBARfsbqjJqnbHSQ1m2I0ByUrV2HVufKpJEhY9Tx3SXvMj1SZieWkMy8gqP6JAf2aWYaYUtQgS0YRPFM3mQmU6AlT7RNJ1eDJMs4qGGKkDY5ovHrrPSUYlcuaGfhjlPA0lVOWxpn2wvVPekUG4Da0VZedRs/MMfs51jIU14D/+/YEh+Ztasr6kTMu2d+lfLfsPztfbQXMAH+IlLXzWlC+R/eUToUm+V4oV7AM35ZdLCxDHX4NY9pGQNfXFWhYE07m/uMzyEMX6zlrBkVM1JHJwMZ8W4aXkm/PFpdYA/TDOGBBNqJoiP+0cg07/uKsdFscFmEmQfaUUy5G1peZgcYNf+0Iue3XLK4WOE1mIRI7at30g5ZbzSQ5StgBdGASoncwH3ViQWC16LkIdiZ2pxPaF64PBVyRzSI84l2VdcrtsO1mvdE4AIpFt68lINqWHleuiOgTBuNfbLFSY6jSGcE8aRu107qW9ObkaslB+w4JscCv1yPrNdGAU9jdsbbe0QA8RUKpfxJnYPtlrZSVhDmmWAAEcRqQChHvea893PuFjcExKqOJJbEW/3WTqw3/AC0udKNfMCFVJT1b9vunuC5cZpXuuTXD+cctyxFsd+Q+BS8oqSEM6oRk2+THobRrfC2iniQ ueLSxOqv Seo95FA3iX3v522oGuB33rOs6J9ifNeGUDxh3Wl9DBh5g+E1r/fi9m4n1imXPhkTmUn2amBx0LiprRs0tOSqDjwM4Jy5Fw7+B6KAUvrgy6oGm+LVUYMcXRPOJgjoG5FVpPANfOALFhUMUPxkhnFpX0KbgemohbznK7L2OqNCIUDSjmoNeVrchkTdZZbeeIOfPuJmDNYh+0vlWFtGwR1HpFMBAIqFdeQUX8WqzrL1hZtOn8cdrB/TquBaf65ILbAeNAQtDfG1lXFBlaO5CNv61yy8htoMO3jFvKPUfMbMTO16vRU8jzjKd2M+VtYP2cRRzj8ux039yDuqk1Ipd+x1qzTcPJgEBUNm0thmi6u7mO3NSlurGkScVlMEy16c0I3rzOZAoiyVx7cqqD3d0Pr7bet9KlA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.294846, 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. Acked-by: Lorenzo Stoakes Acked-by: Liam R. Howlett Reviewed-by: Andreas Hindborg Reviewed-by: Gary Guo Signed-off-by: Alice Ryhl --- rust/kernel/mm.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/rust/kernel/mm.rs b/rust/kernel/mm.rs index c160fb52603f8d4b349000451e2200fb477d98a6..615907a0f3b487996ddc066083c4984a443f7146 100644 --- a/rust/kernel/mm.rs +++ b/rust/kernel/mm.rs @@ -111,6 +111,50 @@ 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 { + #[inline] + fn inc_ref(&self) { + // SAFETY: The pointer is valid since self is a reference. + unsafe { bindings::mmget(self.as_raw()) }; + } + + #[inline] + 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`. @@ -162,6 +206,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