From patchwork Mon Apr 7 23:42:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nhat Pham X-Patchwork-Id: 14041994 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 D3A75C36010 for ; Mon, 7 Apr 2025 23:42:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5DA726B0008; Mon, 7 Apr 2025 19:42:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5625E6B000A; Mon, 7 Apr 2025 19:42:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 392596B000C; Mon, 7 Apr 2025 19:42:27 -0400 (EDT) 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 1D04A6B0008 for ; Mon, 7 Apr 2025 19:42:27 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 2AAD1BAD45 for ; Mon, 7 Apr 2025 23:42:28 +0000 (UTC) X-FDA: 83308874376.15.6EBF8F7 Received: from mail-yw1-f175.google.com (mail-yw1-f175.google.com [209.85.128.175]) by imf26.hostedemail.com (Postfix) with ESMTP id 52AAE14000F for ; Mon, 7 Apr 2025 23:42:26 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=kLc130q9; spf=pass (imf26.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.128.175 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744069346; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=XfUGs0YddbsQ4nD768mNJH2PaDd6ou20rVgkj7mY+Lk=; b=J3i0EV67DVM2KLJJRRDpmjHzu3YfL/vEA2L/rRSM1bTQAakwd+mx5nL7het8ABpdNwYtBc ORVUhoX2DpeM6X0t+IsCWWbjpssY/4e73tHIUAiXbpujbh0TNcOMD/fobqEdkjQTJEECxm PrPb6ANel6f2Bh1QEzfRApf3aOAaBJE= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=kLc130q9; spf=pass (imf26.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.128.175 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1744069346; a=rsa-sha256; cv=none; b=EJwu/2jlW5Ru6xV3VpRrAX3IVdosA6aIbfvQuU6NRZLXwes25ncuNTpAuHwBtwm8eqlp/b CCdfzSfs2VaMGX/CYXmHuiY0jujg2Nut9Wm9/tWo4MWoGWZcxWJQKdsIkpw5phEa5PJAIh A7JhInB5gUhsvlhfbWI8a4lgu0+bI2w= Received: by mail-yw1-f175.google.com with SMTP id 00721157ae682-6ff1e375a47so47106017b3.1 for ; Mon, 07 Apr 2025 16:42:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744069345; x=1744674145; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XfUGs0YddbsQ4nD768mNJH2PaDd6ou20rVgkj7mY+Lk=; b=kLc130q9/kxw2Q3L8EcyINO0gqaxBYSM64gb4pd+Lyz/sPbI6P1ZEgFl8LdWJ5XxzZ As5Ceis2IwdB4tPShw9o0UZlfs5tQu7PcxqeHgjQM3J1FUSZGzIMcLGxJeaPzVw14/oh nWvtrRqTi6M0KVtWzWXMBXWONUHAtK6y4fZZksPbXeFFG2Xs+MbXcb31ToknKu6GRxuY GqF0axOmO/7+d6Q3gF+jlOQ3nyw8fsshb1IaUv9h9Na6H4ft6uqZrNSc3KQR9tWfELmK TeONWZiU5MiwruCAvLOBwU5x7D4BbN7Yl9yhTrOoMvm5YnYpKCHQqvgajXGRIAWqAcWu 2SGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744069345; x=1744674145; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XfUGs0YddbsQ4nD768mNJH2PaDd6ou20rVgkj7mY+Lk=; b=UgTHIjrx9y12Vu0qTzBjYjwpgIy6kTJjmMFob0dwddhY9RlKV9l6URv8yOqeVy7576 SnuvikgzXhSvVtydytf0yHIeog+TnCXJHSpvN9xP5eW/zRODx5HR3VI2REb8d/wA9tDp pQfzDkD4sdc2wpdrSMNmgTOcrsgIpGpoPo/2y8hCxpyXPXQwSoBOvztCgLwJt1+h+2xd BjyIxSghkcgceG2MoLd6SXczcFhcnsZKYKqvpHQfM2Yh1tbv69+BWx5rRMLkr4+qbKiG luhnMWH/v7GnhL/j6eNlqYpRL46lwx7l70yHnOEhfBNDbGGE8FCm2tPhvEBqjfSzZelC 2N8Q== X-Gm-Message-State: AOJu0YzT4TkpIMqkSGNAMxgeaj5BPUhy0hYT2MxLuLacuhSxM5bXuP6g 7HAsWTIyHxwsZsykIZXQiWSUE9odxr93BUeZeQ/48JA0HySDuw66hNRhaA== X-Gm-Gg: ASbGncvB9oBqEOAi3TXF3ZOFJeXUKbgxdZflmODaWrQbRweT0QQG31fOKJfch1JvTka 5ztBJADGlowQmb/QSHQxaXy538HqnfXFoj29Tw30B2iX8+N68VI2lnAxTn82n0Zs5rOjTNCxHcE G/+SBVWcdweO7v97obVTOL3W1V9IR9+6iDljCa2NB0yStsbh0CZKpAIjcz4G2ha+lw+F0h0e5I9 3FOsR2rNxJmU6sd1nKTIQpPGYITV1DghyEUNY80p/Izmq0sv4IjLzScXrSQMAGsisBf25+dkYR3 H4UeGv9uOngNS5mpIzaeXByQ68x2w8S3 X-Google-Smtp-Source: AGHT+IHmylSLqkbMnakEdnta4Mc1w3JFTnb3aV7dqAhsLXyWaelffY0XhjOBtjJGz+rADBjFj72DYg== X-Received: by 2002:a05:690c:ecf:b0:6ef:69b2:eac with SMTP id 00721157ae682-703e1500617mr242935697b3.4.1744069345103; Mon, 07 Apr 2025 16:42:25 -0700 (PDT) Received: from localhost ([2a03:2880:25ff::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-703d1e5c6f5sm27876857b3.37.2025.04.07.16.42.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 16:42:24 -0700 (PDT) From: Nhat Pham To: linux-mm@kvack.org Cc: akpm@linux-foundation.org, hannes@cmpxchg.org, hughd@google.com, yosry.ahmed@linux.dev, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, len.brown@intel.com, chengming.zhou@linux.dev, kasong@tencent.com, chrisl@kernel.org, huang.ying.caritas@gmail.com, ryan.roberts@arm.com, viro@zeniv.linux.org.uk, baohua@kernel.org, osalvador@suse.de, lorenzo.stoakes@oracle.com, christophe.leroy@csgroup.eu, pavel@kernel.org, kernel-team@meta.com, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-pm@vger.kernel.org Subject: [RFC PATCH 02/14] mm: swap: add an abstract API for locking out swapoff Date: Mon, 7 Apr 2025 16:42:03 -0700 Message-ID: <20250407234223.1059191-3-nphamcs@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250407234223.1059191-1-nphamcs@gmail.com> References: <20250407234223.1059191-1-nphamcs@gmail.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 52AAE14000F X-Stat-Signature: mxzh6x5ar76pcpa46dpgx9kddgmki1od X-Rspam-User: X-Rspamd-Server: rspam12 X-HE-Tag: 1744069346-580895 X-HE-Meta: U2FsdGVkX185DNWsXSye2v33lUg0Uh7K7zGIjubRgL3N8qxTrRVjMBYtKmnZpg3IDzcq5jaxZtnB7IH2cxACSs4OoWu8fC96lykoAEiyZ/sl124s9/hfRlclURPZ1RRSr2Ll1DfJ9oHVSDF6gdB1bRs8ANrfrMVWZ2H8hubiBqxWCAD1G8MtfwdfuSm0biP5TFKDd2Dx0pxcCsA0NDOXgYTSVGOrFVSxfmzhXqdmW6bB0ODDTIyh1G1XzxurZjt8TjTBoAgSVg/6hMrXQVMq1k5ov9B1P3sM7nndqO3amLXq6A35Rxi0QiQqCj5oIoOXBWIDXrPxc3AWFsqb8Xm7qT579RzFN5h6Io4QkcTxMvt9iFWccpXjwUOR8bSX7SXbfFhb8JCbD5560I+hrz5DzIHV0h0gQ3nryCYeXfkO1vdWtn2T4bXoXOb9dk+ZLJ2+Fea5G1XTqSowVxpCYbbLet8uNoSk2/XXHbNCypQ7AQpZ5xtjzb7nyzGVNQPeq2a6VwQlG9+OA/hwjGvi127JxRx0K7NkSd6dQwQlb5qteIgmNshwPEQ4YKso2ugFB3WLiQ3WeU4PCyubM8e4v8yxZW6OcSRNM4EgeozvXHc4sFr2eprDvCEIRoOU4ZA5jUPht4YQtqk7Hkq8jLTcOyBofxAghaWsXFqmBwF9i2BT8QZXKg1DX/zsMpZWfDxe4anbCbJbvG9cX40khRUtMUaYR6qck/KMPDRV7gbYCogIlc3J9CKpUNWa7MgnzfNjTPcS8qorVnrd+AP5b6YgWyNMjmHL0cmnE7Jk5M0ZAyBqNwuo31QCSTYYoOwEayWVd1DVbWiuc2N3WmhQbBlcCMjRj1aOJzkBWiyxl/TC59Te5yHDqfB3yvqlu5wD0dX5mF6qLAR1kyaWQDtY8dfPPGFtHiS1dlKCOQojXuIVhN+DPycZFFMPpP++THApFIu+xx4HIc8QEt4OGBNO/HEBb7H 76qzeJnj 18PGw8ZnwCCF3b2SeQnu0Thd056/7WDHvSDX1FWEKYBerSdUu2TjNP9C8FPYQq/m3HytA90+wT4hONZWzqka7m1Cjq4q/dgqmNw2Dp4hCE1Ps6ArF/voDLiSIIXo2Ge7EwG4REHDg0Ro3ZYt4nC8kfWNwooEFR/5/EcTlaSWcS6CbmnTKR19hDaxwWbmv8tbOWc8VTfyNhtHjO6SZUpq8hVBhCo7/jFihzJiYO1OvTkoUX8lppeWJhKRYEMu02oXZK+YrSLn1AFsawGEHNYlfLOp1J1XjZBvqU8TPOq92JN3hzADYWQ3iZVPjBSig0CerPcdeS+AFG+rBDBv2sUWPP8oVJ9peLMld/k+FxBX9TEIT9cmX3trvOubiEEgvETpo3qPjRHAcuInTgtpipvaD5GDoYay4V+sDkCnKmfP2oCLpxYOTM9n3HCtDp18/yUKRUAKwTxcUxR74+2MicZN9GaNSv31QmEuPBzsYJIIn0xCBLIcC3xZWTcWYHA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, 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, we get a reference to the backing swap device in order to lock out swapoff and ensure its validity. This is no longer sufficient and/or doable when the swap entries are decoupled from their backing stores - a swap entry might not have any backing swap device at all. In preparation for this decoupling work, abstract away the swapoff locking out behavior into a generic API (whose implementation will eventually differ between the old and the new swap implementation). Signed-off-by: Nhat Pham --- include/linux/swap.h | 12 ++++++++++++ mm/memory.c | 13 +++++++------ mm/shmem.c | 7 +++---- mm/swap_state.c | 10 ++++------ 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index b13b72645db3..e479fd31c6d6 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -706,5 +706,17 @@ static inline bool mem_cgroup_swap_full(struct folio *folio) } #endif +static inline bool trylock_swapoff(swp_entry_t entry, + struct swap_info_struct **si) +{ + return get_swap_device(entry); +} + +static inline void unlock_swapoff(swp_entry_t entry, + struct swap_info_struct *si) +{ + put_swap_device(si); +} + #endif /* __KERNEL__*/ #endif /* _LINUX_SWAP_H */ diff --git a/mm/memory.c b/mm/memory.c index fb7b8dc75167..e92914df5ca7 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4305,6 +4305,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) struct swap_info_struct *si = NULL; rmap_t rmap_flags = RMAP_NONE; bool need_clear_cache = false; + bool swapoff_locked = false; bool exclusive = false; swp_entry_t entry; pte_t pte; @@ -4365,8 +4366,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) } /* Prevent swapoff from happening to us. */ - si = get_swap_device(entry); - if (unlikely(!si)) + swapoff_locked = trylock_swapoff(entry, &si); + if (unlikely(!swapoff_locked)) goto out; folio = swap_cache_get_folio(entry, vma, vmf->address); @@ -4713,8 +4714,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) if (waitqueue_active(&swapcache_wq)) wake_up(&swapcache_wq); } - if (si) - put_swap_device(si); + if (swapoff_locked) + unlock_swapoff(entry, si); return ret; out_nomap: if (vmf->pte) @@ -4732,8 +4733,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) if (waitqueue_active(&swapcache_wq)) wake_up(&swapcache_wq); } - if (si) - put_swap_device(si); + if (swapoff_locked) + unlock_swapoff(entry, si); return ret; } diff --git a/mm/shmem.c b/mm/shmem.c index 1ede0800e846..8ef72dcc592e 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2262,8 +2262,7 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, if (is_poisoned_swp_entry(swap)) return -EIO; - si = get_swap_device(swap); - if (!si) { + if (!trylock_swapoff(swap, &si)) { if (!shmem_confirm_swap(mapping, index, swap)) return -EEXIST; else @@ -2411,7 +2410,7 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, } folio_mark_dirty(folio); swap_free_nr(swap, nr_pages); - put_swap_device(si); + unlock_swapoff(swap, si); *foliop = folio; return 0; @@ -2428,7 +2427,7 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, folio_unlock(folio); folio_put(folio); } - put_swap_device(si); + unlock_swapoff(swap, si); return error; } diff --git a/mm/swap_state.c b/mm/swap_state.c index ca42b2be64d9..81f69b2df550 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -419,12 +419,11 @@ struct folio *filemap_get_incore_folio(struct address_space *mapping, if (non_swap_entry(swp)) return ERR_PTR(-ENOENT); /* Prevent swapoff from happening to us */ - si = get_swap_device(swp); - if (!si) + if (!trylock_swapoff(swp, &si)) return ERR_PTR(-ENOENT); index = swap_cache_index(swp); folio = filemap_get_folio(swap_address_space(swp), index); - put_swap_device(si); + unlock_swapoff(swp, si); return folio; } @@ -439,8 +438,7 @@ struct folio *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, void *shadow = NULL; *new_page_allocated = false; - si = get_swap_device(entry); - if (!si) + if (!trylock_swapoff(entry, &si)) return NULL; for (;;) { @@ -538,7 +536,7 @@ struct folio *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, put_swap_folio(new_folio, entry); folio_unlock(new_folio); put_and_return: - put_swap_device(si); + unlock_swapoff(entry, si); if (!(*new_page_allocated) && new_folio) folio_put(new_folio); return result;