From nobody Wed Feb 11 08:12:14 2026 Received: from mail-oi1-f177.google.com (mail-oi1-f177.google.com [209.85.167.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 528793624A6 for ; Sun, 8 Feb 2026 21:59:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770587956; cv=none; b=Jl/qEwpzcsyr8UzFIWKZc9JvSKW0cnaU7BfZ+hTEcnyldnvC13MRDo39Jo/IJ4NGXC/HUWp1z6HiCv9dXrUAgwogubX/IKzgPsjKp44Zo8Wf0GWFlO7aYGLHtqMuzSAaxDBPmd3HItGpLkVQ/F2RJO9+u6eDPoc8x49dKzF52vc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770587956; c=relaxed/simple; bh=ivEurp8BxVVC73UF2YIA0sGKcn4Rvv3bpTlATH+RAvk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mQLPf993TaCUR8DmoeO3Fz4xHRVlttsGmPkr/xCxyUVaqAtC9SQMmxJw3ZOvidMT/5SSWrmoyHAfv7xnj9mi5E9s9BWzzSCgUMDla+r0lxKEIr1/Sr+OsKhi3ahDMkk/cuc0YVZEgyLysxDegzcmCUorDeRjBiGK1J3/PgEs6rM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dc+40F81; arc=none smtp.client-ip=209.85.167.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dc+40F81" Received: by mail-oi1-f177.google.com with SMTP id 5614622812f47-45f171cb842so2677473b6e.1 for ; Sun, 08 Feb 2026 13:59:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770587955; x=1771192755; darn=vger.kernel.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=Jcq3gcBJps8FZtjddhB+nxOnBeH87BfFsdWVB5x664k=; b=dc+40F81wBkKVyu/C1B8+cc6caEzLYJpuLJ5W1W7TCSfYcL1XO+XOyilRv9LlWonXn 35OOuT+QXQwaq/ALiu5BGgNmHiH4aHE1ssRQ/wuGyDbuYl8OjY7NbztQKhaua5sfltdo nmO6h++U9Ff/Bh4Vz4432XeartFzGtpqOWE5AILXz9GTAHyY96PfJHcp/pbPa5W7R3we bepL9sYvx5RYKRzzm3zfgHPmkK2NSfPGLr15A/g4gPdNT+0qMSaxtuLX2Bo57nZWLgLg 0kA67K/WKPLEY6Oys0CBHHMbmT3EwDh3UQXzktcSbFe+ZSwRMVDQlHH5sGZw+JYExWfU lpsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770587955; x=1771192755; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Jcq3gcBJps8FZtjddhB+nxOnBeH87BfFsdWVB5x664k=; b=XRL2RFQDMCZor2ykDkDyUrWkOyUWMzugp7CLpALMdEU0WaR4mZgBH69+dx+QZb2XVT /1q3xDowM8JvzEYG+tOmp3p5Mar0YoBGbfTKfkEEFZhAee9WgQoOjY5B09OpbJKjNIY6 r9hYp+RU5CYR2Gzs1vTFQYTtsgprDMGrGAAt3tTCJH1SAa8bUgtz2exZwYWJgtfFNXwc Bp5hJjrPo0MlBItRZ6d/MOpKtIpc6Hafgff5HOJKG/jHLqOXj5SrcUjo03GmZw+2ce8Z G/8tZ7tAdYf8IqhLfP1sz4gZ8E0F/jbUUKu50Jj1jtVo4/vLTffHOkRmeI3vdGRjVQby 0g9w== X-Forwarded-Encrypted: i=1; AJvYcCVW2X75cy3qT+usbFCmuUvW7Ys1VCzMFHu2ILJYTd4VMGGKeXce81h+oiz/4ey75FP+++94DdSvoZVMBO8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy6tgDyxtx9Re++RM8fo018PZh7O5h6KvTsLgfKXvUapdTcd4d9 nANqZ1esi6GKdUq4k/XxGM9f5gDcCsoNEaK6kdfQWi0+ElHeYzWwCUET X-Gm-Gg: AZuq6aIQ/rRwGQSx0jtpGRL4Ghl5t/5HWnBrRWUwoqTx2KPKA9p9EIbvsGIiz/DU4XR x2T1hVS8R2KvcDloKSZh5EV7MWgraztYu6Kqi52T2uB5J4O2gvWvULJpvlNw6Zwlj9Z7Ban4Xsh aHbgkF7NeCMxkmGPWnOOKCfH86trMk9m+qTHz9PgULo8xo3xQo4w6mtRW+AJbLAq6PAvJn/N8Qh qX87S9XkvDWo4QLOP38J2HTbtHrSlZmmBy+QXCBI/ZfAsTZjuvbP2N4coclnfhddVPEcRLobOs/ d2BULp1+hp8hJiVIXf9oC2Gt1mi7sOtirZ6mGj/aQMOLLe6IR1BfZeOaxkML+iV+w2xXoFgoVRO 23Lr16qlmrN5sodHElP2p7I+foxKkJCqsUeQX9hYEVoaoyRSFOftKiwMCv/Hk/YODm7wkQfBN8D olmdwNjYrl5qLuGn0C1g58W3cTSnZseZPm X-Received: by 2002:a05:6808:2220:b0:45f:103c:2483 with SMTP id 5614622812f47-462fcbe429bmr4183659b6e.23.1770587955253; Sun, 08 Feb 2026 13:59:15 -0800 (PST) Received: from localhost ([2a03:2880:10ff:5::]) by smtp.gmail.com with ESMTPSA id 5614622812f47-462fe9a12f5sm5510710b6e.5.2026.02.08.13.59.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Feb 2026 13:59:14 -0800 (PST) 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, shikemeng@huaweicloud.com, viro@zeniv.linux.org.uk, baohua@kernel.org, bhe@redhat.com, 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, peterx@redhat.com, riel@surriel.com, joshua.hahnjy@gmail.com, npache@redhat.com, gourry@gourry.net, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, rafael@kernel.org, jannh@google.com, pfalcato@suse.de, zhengqi.arch@bytedance.com Subject: [PATCH v3 16/20] swap: do not unnecesarily pin readahead swap entries Date: Sun, 8 Feb 2026 13:58:29 -0800 Message-ID: <20260208215839.87595-17-nphamcs@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260208215839.87595-1-nphamcs@gmail.com> References: <20260208215839.87595-1-nphamcs@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When we perform swap readahead, the target entry is already pinned by the caller. No need to pin swap entries in the readahead window that belongs in the same virtual swap cluster as the target swap entry. Signed-off-by: Nhat Pham --- mm/swap.h | 1 + mm/swap_state.c | 22 +++++++++------------- mm/vswap.c | 10 ++++++++++ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/mm/swap.h b/mm/swap.h index d41e6a0e70753..08a6369a6dfad 100644 --- a/mm/swap.h +++ b/mm/swap.h @@ -213,6 +213,7 @@ void swap_cache_lock(swp_entry_t entry); void swap_cache_unlock(swp_entry_t entry); void vswap_rmap_set(struct swap_cluster_info *ci, swp_slot_t slot, unsigned long vswap, int nr); +bool vswap_same_cluster(swp_entry_t entry1, swp_entry_t entry2); =20 static inline struct address_space *swap_address_space(swp_entry_t entry) { diff --git a/mm/swap_state.c b/mm/swap_state.c index ad80bf098b63f..e8e0905c7723f 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -553,22 +553,18 @@ static struct folio *swap_vma_readahead(swp_entry_t t= arg_entry, gfp_t gfp_mask, pte_unmap(pte); pte =3D NULL; /* - * Readahead entry may come from a device that we are not - * holding a reference to, try to grab a reference, or skip. - * - * XXX: for now, always try to pin the swap entries in the - * readahead window to avoid the annoying conversion to physical - * swap slots. Once we move all swap metadata to virtual swap - * layer, we can simply compare the clusters of the target - * swap entry and the current swap entry, and pin the latter - * swap entry's cluster if it differ from the former's. + * The target entry is already pinned - if the readahead entry + * belongs to the same cluster, it's already protected. */ - swapoff_locked =3D tryget_swap_entry(entry, &si); - if (!swapoff_locked) - continue; + if (!vswap_same_cluster(entry, targ_entry)) { + swapoff_locked =3D tryget_swap_entry(entry, &si); + if (!swapoff_locked) + continue; + } folio =3D __read_swap_cache_async(entry, gfp_mask, mpol, ilx, &page_allocated, false); - put_swap_entry(entry, si); + if (swapoff_locked) + put_swap_entry(entry, si); if (!folio) continue; if (page_allocated) { diff --git a/mm/vswap.c b/mm/vswap.c index fb6179ce3ace7..7563107eb8eee 100644 --- a/mm/vswap.c +++ b/mm/vswap.c @@ -1503,6 +1503,16 @@ void put_swap_entry(swp_entry_t entry, struct swap_i= nfo_struct *si) rcu_read_unlock(); } =20 +/* + * Check if two virtual swap entries belong to the same vswap cluster. + * Useful for optimizing readahead when entries in the same cluster + * share protection from a pinned target entry. + */ +bool vswap_same_cluster(swp_entry_t entry1, swp_entry_t entry2) +{ + return VSWAP_CLUSTER_IDX(entry1) =3D=3D VSWAP_CLUSTER_IDX(entry2); +} + static int vswap_cpu_dead(unsigned int cpu) { struct percpu_vswap_cluster *percpu_cluster; --=20 2.47.3