From nobody Mon Apr 6 17:25:45 2026 Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) (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 4D68039151B for ; Wed, 18 Mar 2026 22:30:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773873026; cv=none; b=NDnAyjhvC6Eg7iJMZCoauQ8jhHONDIZGf+ocLKvM2DM7vHb6FGnCLK3neZPO0hI3az6LWyvlVFz6Wbq3heESKK66H67TLNN9moQYVODXf/7QPG1DUmkhHAZMOyG3y/Q/y2VrRDP7O2oinQvB8oKpPkmYn3aOQr+u4yx5jsPrNBY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773873026; c=relaxed/simple; bh=fnjImx7VCwMKBpHwkDW1K85lk6CY/A2Ul7Cqjhn0QzU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nxOW9iEKZxUXPHwas73ER90+WwYSINlnK7b6xmuAOm5m+Z0kHyjtH9JTPPy+K8Q2tPSx0IjG/BJtYbSLqCKzuNcUSFie3Ecx6POzq+6/UX34vYdxMj18gHOwUj0vH0aKBustuQu5pwZ7qftACWGKXLMYOcUkKioG3pO23nGlimk= 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=ODFnzVc8; arc=none smtp.client-ip=209.85.210.48 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="ODFnzVc8" Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-7d748ca8708so232520a34.0 for ; Wed, 18 Mar 2026 15:30:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773873022; x=1774477822; 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=FKrmsaRryTJ5nHXiiuirqMc/v+zxITLhw4bMyN6ZWm0=; b=ODFnzVc858qDi1mXZysSz7VqRXZ85fqpT46m+xw2hCc9HoK+NtVe89BIpGAhlBGfyU 5ezJDUWEqTUnfH7FhbRGCtzJSao3DOonIXH+/ApmLLNzbaIGxGaD9QGgBvPvfFwqMXth aN659UwJvSnoeL3AchKQx8fAL8UOMCQVpaIWi4IvXdYuS3kU0hOElHN4vlALkfnXKXwj 2oMnALciPcEHPy4MUeOKoj/X8Rn5DSoCAsUlfhFXaZCjT6aYTVkpuq99Iuf9aRG+PT55 fRbqLOmnGkYGR7qFQXb9U3tgQ7ui2Stny67g/GdX2maZCsudg/LosPB3Q2U9xP043z/E n1cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773873022; x=1774477822; 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=FKrmsaRryTJ5nHXiiuirqMc/v+zxITLhw4bMyN6ZWm0=; b=AWNs+gebFDw1bntDtfx4En/CwvZs/MJS7rm2gfadlGf9ysKeJd8JzqbH89b0Q/jgJV VDybO0vDunftwvceJkXAtShum1lePFHVzW+yGijlN4X1dchBhEMuhIY009JgVATJKnfg SqZLFuq+T18s07HWM/Pbs7wIZ5K9/avrJNMusSQk8ZMbNm3m0NnSlW3CnitwiLDfnhj+ AqNk8qFWgNJRIuzrDSdMm0+ktRXHhfU7mQjCG53bHcYdVknvEfdTZ4KSfg607i+mZBhz qd2Vr24xGcNCxDwNGkTmOYc7bnQVWr7fCSLgiYWYx5cKSO4z/bnjWu7oJPDk5CmZVFfd uSWg== X-Forwarded-Encrypted: i=1; AJvYcCVvMyEt52rEd0v2olf4OyJkuIVg99Qkmk6oDCvCg3iKMkbpqALGCQAld8Sv07cIsmtrQ3DOqFNmptKxShI=@vger.kernel.org X-Gm-Message-State: AOJu0Yzea1d28QkbdOdfPRVSZuSBJ2EswyRX3vsQooMFt0wf8L+jMAt5 LuC5c5PRfjDa4t3a9KsVSg3E5tlURX8+lBXFlLSs4d4Q38cX3GCJoy6n X-Gm-Gg: ATEYQzz1N0RP/PbBdFNtFkkK1dJv+gXpQsVulh0p3+L8anhVPGB7QQzHiXf9HufyDEA 4fKRP4g1t25ZtahnhcPpMwrF/I4POR6vtwcXhOi/es92xw/5GaDms/ny/XyVKcaqRmhuLfcTuZH lx6yRmMIoDCqtEWOxljb7K9CbA2iaYgyWWadfDy4oRamUmcDbE3MQAf11AOIBQx9UJEcujia7CP s6pZ9/gVyusI59ME46ke0AvdO8m/vXl+YLOwNoU+HNdIpbKS7yBn0/xCH5A86+k9wo4A39LtUx2 XLz5ZKdYEo1YH1RuumvyWkP9HlGd9xa4hVbqOXFi4vnuemBXKpWwutQdt8HrWdEo+t3BJ7+bWmq Pb1oDRdRiwXkXW5z3nywYYKw85VyAAiN78dOmn/9+av86Nv16jAtNrliQ1+SwZvsdRXKJYHWjaV v4jmVWzYvsk5K1OPXIew16hydpVwwkKn+s3llessQCydAf6Q== X-Received: by 2002:a05:6830:6af5:b0:7d7:d217:5116 with SMTP id 46e09a7af769-7d7d21752afmr1935454a34.17.1773873022052; Wed, 18 Mar 2026 15:30:22 -0700 (PDT) Received: from localhost ([2a03:2880:10ff:48::]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7d7c9b3696asm3133813a34.16.2026.03.18.15.30.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 15:30:20 -0700 (PDT) From: Nhat Pham To: kasong@tencent.com Cc: Liam.Howlett@oracle.com, akpm@linux-foundation.org, apopple@nvidia.com, axelrasmussen@google.com, baohua@kernel.org, baolin.wang@linux.alibaba.com, bhe@redhat.com, byungchul@sk.com, cgroups@vger.kernel.org, chengming.zhou@linux.dev, chrisl@kernel.org, corbet@lwn.net, david@kernel.org, dev.jain@arm.com, gourry@gourry.net, hannes@cmpxchg.org, hughd@google.com, jannh@google.com, joshua.hahnjy@gmail.com, lance.yang@linux.dev, lenb@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-pm@vger.kernel.org, lorenzo.stoakes@oracle.com, matthew.brost@intel.com, mhocko@suse.com, muchun.song@linux.dev, npache@redhat.com, nphamcs@gmail.com, pavel@kernel.org, peterx@redhat.com, peterz@infradead.org, pfalcato@suse.de, rafael@kernel.org, rakie.kim@sk.com, roman.gushchin@linux.dev, rppt@kernel.org, ryan.roberts@arm.com, shakeel.butt@linux.dev, shikemeng@huaweicloud.com, surenb@google.com, tglx@kernel.org, vbabka@suse.cz, weixugc@google.com, ying.huang@linux.alibaba.com, yosry.ahmed@linux.dev, yuanchu@google.com, zhengqi.arch@bytedance.com, ziy@nvidia.com, kernel-team@meta.com, riel@surriel.com Subject: [PATCH v4 16/21] swap: do not unnecesarily pin readahead swap entries Date: Wed, 18 Mar 2026 15:29:47 -0700 Message-ID: <20260318222953.441758-17-nphamcs@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260318222953.441758-1-nphamcs@gmail.com> References: <20260318222953.441758-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 d7981ec82cf49..2229c3485b7e2 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 fbb7c6003ad8c..b391511e0f0b9 100644 --- a/mm/vswap.c +++ b/mm/vswap.c @@ -1418,6 +1418,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 vswap_cluster *cluster; --=20 2.52.0