From patchwork Mon Apr 7 23:42:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nhat Pham X-Patchwork-Id: 14042001 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 AC881C369A1 for ; Mon, 7 Apr 2025 23:42:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4D7AC6B0023; Mon, 7 Apr 2025 19:42:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4637B6B0024; Mon, 7 Apr 2025 19:42:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2668C6B0025; Mon, 7 Apr 2025 19:42:32 -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 EB2AF6B0023 for ; Mon, 7 Apr 2025 19:42:31 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 05EBA5B98B for ; Mon, 7 Apr 2025 23:42:33 +0000 (UTC) X-FDA: 83308874586.12.657726A Received: from mail-yb1-f171.google.com (mail-yb1-f171.google.com [209.85.219.171]) by imf16.hostedemail.com (Postfix) with ESMTP id 2F825180002 for ; Mon, 7 Apr 2025 23:42:31 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=C5RURbae; spf=pass (imf16.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.219.171 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=1744069351; 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=hEmnwad/N64NAZz/aFOTPsiQL1svvHVYAYQ6CpUFW0k=; b=3bqnK3z27OaSOxJ/lYvUoNEjiFaYrkEuCrUKTiMQR7nQeXsWTon/gJ2ySUMh6kS3z+onS+ bg71z61OPbNumcMLGl8tF5trL1vXaUjsmnIU7O/YtF8Z2s8mPIPA4KuQx0VDImq8mV7P+1 qbWXDCPwefVWe5CvZSarK8QiS27rJBs= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=C5RURbae; spf=pass (imf16.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.219.171 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=1744069351; a=rsa-sha256; cv=none; b=dG0PAuJadQuxFOiSDLU+cXsEJ2PVZLOMxXKayvga37KO+GIchXBBzxTXh0527oiilTDDAb j9AqweS0a5iMtFxgj3YgBy0N0nAIfO727B+CqD72pWsNBuzruyUYiG9jHvx02RbJ6NhRkn 7wivbG/yhd+RXjDu0cqvVZwds38rq8o= Received: by mail-yb1-f171.google.com with SMTP id 3f1490d57ef6-e63504bedd0so3702874276.0 for ; Mon, 07 Apr 2025 16:42:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744069350; x=1744674150; 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=hEmnwad/N64NAZz/aFOTPsiQL1svvHVYAYQ6CpUFW0k=; b=C5RURbaeSIe/bzwrn56iIIZJ/CSTFz/v2SSpP/piq7pxjemkw2Bn7NeJkK5437VzXw ydzIFwwR9YW8bcICtAkBUQSSiikeiG+pUKlqpoqhIq+191ua2JZQlx1epTLbFsIPqfaw qB0+C6+t0eqSeQdZ3+qmfmQ0D0jdLSmdc8JSaKE4wcZtsmnUOmx4JYxANsPVCMvrJ1g+ GNKZUyvuXdP+M1OFeodFOp+k53yg1H4kFSWAWi+ftdfE7ZWCHKKc7/riAyYkgVxQ2Ulk 0IZLlLs+4nWisEOro6W6urQX1fP0Dy4R8o6Scy1zED8z2kGyzcwQ768zboFSK3XVxV2J o1kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744069350; x=1744674150; 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=hEmnwad/N64NAZz/aFOTPsiQL1svvHVYAYQ6CpUFW0k=; b=B+Sdae0udZtuyzxonAUy0lx1p6vFTFyzUJgLWVUd0zz4dsjdC+VKeimaVB735GZZq0 w5HSUr0NKlZ64M354NDJ2jDIJ5VB6LpL4QAm8LmwqYV2sfeC5itInobIv89ZKzVxrNlJ ShVoDqHszSLxNkXWVr1c6bYbcCAln6TqSelumgsoSn4cAvb7h2dIz+2wtAA9s0mdO1Ep jRbhpra2j4x36H9T4yGC3wXLGqZ/yRz+/lMXSJU6ddZV/xuiq0et1cEiBRhScbvWzOQG o17CwSR5IM5cmliBgXP2SjNV71sGzy1nw12hSbsyJJvq8oNvlqbruw0gDr+ihvVXCwMc BzNQ== X-Gm-Message-State: AOJu0YwVvNyD2zuZ5bBUjHNG5ojNtnhB2bIJJH1Z8rbxsald9Zy8C73T drk+Sw72aIrA7lpOzI0EFxEwBDIUpC/2Xai8PGnjvySJq/jMz9xuXZWB2w== X-Gm-Gg: ASbGncvEpRbS5x64gXc3IIbVEmvuIktNnb4GEj2txpXMfRHjnP91ee/ZBJ5W2uswBJ7 4+AJf3GGfaA4Mcowh2YcENpKg4WToJY9rLhah+gVaQfyl6e2d4eXUpp3XWmDixiXvRumAwHso93 jnS19JPIHbjK8SyNLYkA/9EMYqC58/N21bzOH8G26HNvsRKiIzqUMAE1hrQZJs3ln8sBq276tM4 hQvB4MUFPz1zJIm4J66qUTEwZIeXfyUzEvc1EWVz+2QXTVHwuSiCu6d87nr1RVykXAWHyf01761 7xg1tJLfGPj1H2Kxkxiylw6HprLUa4BAMuJIQkdywtP9Dw0= X-Google-Smtp-Source: AGHT+IFtGhkxbSoAukRbj+0OU4tWjwIUdMbR+YxJ19NpEyyOkHcigzH97IKjBGD1dt64XVgLyZVotw== X-Received: by 2002:a05:690c:670e:b0:6f9:4bb6:eb4e with SMTP id 00721157ae682-703e1623ab2mr255941227b3.31.1744069350152; Mon, 07 Apr 2025 16:42:30 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:73::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-703d1fdf9ebsm27726707b3.123.2025.04.07.16.42.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Apr 2025 16:42:29 -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 09/14] swap: implement locking out swapoff using virtual swap slot Date: Mon, 7 Apr 2025 16:42:10 -0700 Message-ID: <20250407234223.1059191-10-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-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 2F825180002 X-Stat-Signature: 8m46maa5i9ao3dgyex9da4n5x9y5dpha X-HE-Tag: 1744069351-98641 X-HE-Meta: U2FsdGVkX1+a0f9DPETSLJjfKsC5ue+cWfVa1Z+d+cAW2Jl32DTEtnk6CkchQIDW13YNFGYA37k5mRptH4k4BmbRPwjE4ZUwdPSjvozgs3ETA0RzDN4FwN6fDBR/zKh9zyXlux0BJXfWVr4kEUtaNzMXsWS8on6PL6sSppf9rZp1iC9qkydP9hWocVGezWFzGXplUYBqC296M55me+Ajl/LCyMpdEO5SQxoyLC61bxXhnu3T/JfWjIryTBBrehq6fFsu59TBjclKDCjB+P2crb2niXA/GqVk/LtYPppY3FlBZY3Vb57E2pMgsAOllb9rf1FtJciFUq/abcRJBsBrwgPr0qUp6waL7Xx6z86Bp16JoSLhGucuVY5DMoGSoMsCZ4BXdFKIDRpWWy9sWD0bdVDq3jqOebIq50XQa2hLjqucYDXYeC/jGqp+2HlEMKgnf2ekamNyl0drPIpkBhUn/De1OWUmATwh9NKR3jWSmtOJUuAUvybpsmQOj1bdk0tLYJ8Z0JdZKvEjw2wcxd5jvOOhu79XzEHJ0PqCBWvchD8RaX6Y0V0T+Vq0r34L7gG/Ok5YEzSYXeipbJk+fLtxSCEEhmB/5HPlY/3M1ZqwdVkar36ZWo73di/+pq2cJF+czYnXm57OQHnrCvKJ55N97JI6CARnxC8P42zMNWM6iGwFrrlluTyWojXNCMIAQk5naRFxUtiOuSslpG6gW+396ZqZm6TEEmOTEeZADumWR43Sk+TAli1LYz6NngDCZqeu1wTRaHCprbmIFzHGCs13EUXcxb6AjyMZklmFNeFuc+oUE/7eCmoKAJzapoTqL2t3LNUIMiQEYBp3C5HKvFzQlzoGupMqVZhY3BzVoQ0kMoIwQ8MRPLqKD3Hcm4qkPpo6ZkpLwhrirWvishrIQau2WCKWG9YRVnaCkcFIW96jOJ3nAUEBj0WtQI8qQ9VPd9ByhJh8T3bOlPYXyNHJzWp B3ss5qX9 GPST0hMePlOwpEqQrwEW2rctZEjgHpPlyPYtscZHRinDTs88I070IjP0FhEiZTG+dOqVKrB38BHFJOUcRQzY8sP1ahZQY/r22v/AjQ7Q5TCl04SbnKM1T5IjWEEoTs/hmmLLVpIXfk8Gd1GR1Ywi7n4tNhEmnXc+sHx2CjxqmDw4Gcnf5dNVkCkOS7Jiq4PIa9MmZz3I34xeWBsYgb2c7nlHSNd97Wln9Oy6KfOsW8O3pApFTiE9Wk5L1uj3aj0ZFDz3uZGGpga0oFWL+w8HCLD0IU/vMReOPdr6nCp25YWO6bYpYgEp4SU9ZPs7TCDBbva0DFbz2YMnZXsLP0TcJL0B3X4gumCnf4yadxCbKix0B2hJn85fg610qfys4om7Oo36KGThAeLHsfduKn/OeNPzEffXXcZdu86l2ecdKGOCeMIXG3wlpWxagagjW8FVqyDKDcyp1QlTRlT8cOu35eIxnD0eOFmX6WFOXwstLwZm5Wg2ytaI9zC9crA== 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: In the old design, we obtain a reference to the swap device to maintain the validity of the device's metadata struct (i.e swap_info_struct), as well as the swap entry itself, before various operations. In the new virtual swap space design, however, this is no longer necessary - we can simply acquire a reference to the virtual swap slot itself to ensure it remains valid. Furthermore, once we decouple virtual swap slots from their backing, obtaining a reference to the backing swap device itself is not sufficient or even possible anyway, as the backing of a virtual swap slot can change under it. Signed-off-by: Nhat Pham --- include/linux/swap.h | 24 +++++++++++++++++++++++- mm/vswap.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 1d8679bd57f3..7f6200f1db33 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -730,11 +730,33 @@ int vswap_init(void); void vswap_exit(void); swp_slot_t swp_entry_to_swp_slot(swp_entry_t entry); swp_entry_t swp_slot_to_swp_entry(swp_slot_t slot); +bool vswap_tryget(swp_entry_t entry); +void vswap_put(swp_entry_t entry); bool folio_swapped(struct folio *folio); bool vswap_swapcache_only(swp_entry_t entry, int nr); int non_swapcache_batch(swp_entry_t entry, int nr); bool swap_free_nr_any_cache_only(swp_entry_t entry, int nr); void put_swap_folio(struct folio *folio, swp_entry_t entry); + +static inline bool trylock_swapoff(swp_entry_t entry, + struct swap_info_struct **si) +{ + if (!vswap_tryget(entry)) + return false; + + /* + * No need to hold a reference to the swap device. The virtual swap slot pins + * the physical swap slot, which in turns pin the swap device. + */ + *si = swap_slot_swap_info(swp_entry_to_swp_slot(entry)); + return true; +} + +static inline void unlock_swapoff(swp_entry_t entry, + struct swap_info_struct *si) +{ + vswap_put(entry); +} #else static inline int vswap_init(void) { @@ -773,7 +795,6 @@ static inline void put_swap_folio(struct folio *folio, swp_entry_t entry) { swap_slot_put_folio(swp_entry_to_swp_slot(entry), folio); } -#endif static inline bool trylock_swapoff(swp_entry_t entry, struct swap_info_struct **si) @@ -789,6 +810,7 @@ static inline void unlock_swapoff(swp_entry_t entry, { swap_slot_put_swap_info(si); } +#endif #if defined(CONFIG_SWAP) && !defined(CONFIG_VIRTUAL_SWAP) int add_swap_count_continuation(swp_entry_t, gfp_t); diff --git a/mm/vswap.c b/mm/vswap.c index 1b8cf894390c..8a518ebd20e4 100644 --- a/mm/vswap.c +++ b/mm/vswap.c @@ -425,6 +425,42 @@ swp_entry_t swp_slot_to_swp_entry(swp_slot_t slot) return ret; } +/** + * vswap_tryget - try to obtain an ephemeral reference to a virtual swap slot. + * + * @entry: the virtual swap slot. + * + * Return: true if the reference was obtained. + */ +bool vswap_tryget(swp_entry_t entry) +{ + struct swp_desc *desc; + bool ret; + + rcu_read_lock(); + desc = xa_load(&vswap_map, entry.val); + if (!desc) { + rcu_read_unlock(); + return false; + } + + ret = kref_get_unless_zero(&desc->refcnt); + rcu_read_unlock(); + return ret; +} + +/** + * vswap_put - release an ephemeral reference to the virtual swap slot. + * + * @entry: the virtual swap slot. + */ +void vswap_put(swp_entry_t entry) +{ + struct swp_desc *desc = xa_load(&vswap_map, entry.val); + + kref_put(&desc->refcnt, vswap_ref_release); +} + /** * swap_free_nr_any_cache_only - decrease the swap count of nr contiguous swap * entries by 1 (when the swap entries are removed