From mboxrd@z Thu Jan 1 00:00:00 1970 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 E8A1EC7115B for ; Thu, 19 Jun 2025 10:51:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6340D6B0089; Thu, 19 Jun 2025 06:51:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 60C236B00A9; Thu, 19 Jun 2025 06:51:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 54FD56B00AB; Thu, 19 Jun 2025 06:51:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 486266B00A9 for ; Thu, 19 Jun 2025 06:51:19 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id A90161D717F for ; Thu, 19 Jun 2025 10:51:18 +0000 (UTC) X-FDA: 83571833436.05.1A28D36 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by imf11.hostedemail.com (Postfix) with ESMTP id 8A95140006 for ; Thu, 19 Jun 2025 10:51:16 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=VzffyREI; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.167.41 as permitted sender) smtp.mailfrom=ryncsn@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750330276; a=rsa-sha256; cv=none; b=NPGcag1caKk3kAu8Wi71mlAiemAZoi7KMM5nrbQ8n5WhDbVJcB7tW96ze1hItFuRohk5y8 1sslLGGzE95KhD/03Rk5nR8YtUAqr4Lh49pLUy4d1Qbg+lAPKCrUXTrUabJOZj4isQN7oa MdDZfsOIGpYKT+kNfHLMzYhf+dVGi08= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=VzffyREI; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.167.41 as permitted sender) smtp.mailfrom=ryncsn@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750330276; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Ua1gNCTgzdG0JQCc5w/KwYLgFMFIgL+/dOz36UNSltQ=; b=T2fN2vByNIXOT2ScWMjTIXg6G7y9VRzjbcJYiNPCdp8HtP6BOvdzMNJoNrOurNm/FxcP7Z HGwfHA4e1nIOpX2peNvgM7D/SYBQMYS5V3LZ3o6BAG4Wg6es1NEI3zLea/1xi6RGe4RyVW aU1E71mWzbDh/mMqNkA9hovNpYX/l10= Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-54e7967cf67so595511e87.0 for ; Thu, 19 Jun 2025 03:51:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750330275; x=1750935075; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=Ua1gNCTgzdG0JQCc5w/KwYLgFMFIgL+/dOz36UNSltQ=; b=VzffyREIvtFuL3kJK4ee0w1a5pSUir1Qyf5is9ILzzb2YUYIVsR29NapOzDhwhcC3m iuUx3MStEi36ZEiAijzPH8gA6LzYf6Ajlje8/WvTgzAhO7XLAy+xilKyDh1ETUqwhXMg tmFDrZZ4zPiGwGqJtgjhQ0tmO2hxdhFTAZe81O/jR2pqKgu4JbM/MBSXM3UQ+6irrLMI HH746INV3L9VGNtJGfTZGHyMCpF9YdGHaUL+3CbYr5WMt/NmenZUa7RB2EQmjJR8Y4hT vF2LcU87BC7fiWfaRopgq25Y5mWqOouaR/Cxo61ldCFcRiTcjijWktieLMYOGEXRjvAb sdgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750330275; x=1750935075; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ua1gNCTgzdG0JQCc5w/KwYLgFMFIgL+/dOz36UNSltQ=; b=bSpTBl1rFWxj4ItTZh8pqaU2H74g70VrblXGqxCIuYFmnaxXW1yi9BAa+pPBqvyuNh eQLcXV7if009gyEXnFJPQq72Wh/JNSfy3ljrM6xUVGE/veBZ6eEjqBB8/2PYZapvHYsx U3ayR51LLP9H6yRmdd7bj9u5Qz69dPaRjRELekqQHeBE+9wOUq/S39iIIydPvlwdHRzp OkttEEFPyFiRpnHWcwrr1DIt7FnaIRTrIKEp0FTDdNiIPA9OxbJd3KEhJJIajB+33TRW gfHOx3lSbzqp9VPJKvEz4JCZxrrLp6bGYQcKfps5FJUwgtinvo3nI/j1D3Avbn+QXcIs IW6Q== X-Gm-Message-State: AOJu0Yz1RamGl5gw3q/ihrhZaJpAIN8lgByrZYH/663wdNoXHqRr1vLj YET6A/w8POEFZoQ4eD0eskD8X+Kp67ThoqaKOoB1FMsBLU5tLNXQqf8kto9UkQbSS5NCPG99BMR NBp1Mc1mX1iquNdZZos0MwrUyLI93VhI= X-Gm-Gg: ASbGncuYFOLqGKlcwMD149AdX9qJYS/xlcQY/fHFSN0M5Ek8/Foc7yUu8Ya3X8+Pzvv 7hCWc4QJPW2rcDDSsMWFGoyukY2n2LHhB6Y1oEJp19aul4rQyMr2awcuHF7XvaeLZXBkhvaRbQi sthV6950Su5V1QCsakwBMPe1UtJmNyUt8nIkMV89JQ1y0= X-Google-Smtp-Source: AGHT+IEcC9XKcPnzRsY5fZPW3Ba8e9epTwtd1ys23Gr/nfk11GBISYJI4XGB9I5wHqOMxJD/Fy+KcBuc3y3mz9lMDKQ= X-Received: by 2002:a05:651c:211f:b0:32b:4932:d646 with SMTP id 38308e7fff4ca-32b4a2fefbamr58668761fa.13.1750330274439; Thu, 19 Jun 2025 03:51:14 -0700 (PDT) MIME-Version: 1.0 References: <20250514201729.48420-1-ryncsn@gmail.com> <20250514201729.48420-21-ryncsn@gmail.com> In-Reply-To: From: Kairui Song Date: Thu, 19 Jun 2025 18:50:37 +0800 X-Gm-Features: AX0GCFtnks6A47_toiJoOLHTM8ALLAKwVOekmxWGslXx1lIUdiccswFRVBycyr8 Message-ID: Subject: Re: [PATCH 20/28] mm, swap: check swap table directly for checking cache To: Baoquan He Cc: linux-mm@kvack.org, Andrew Morton , Matthew Wilcox , Hugh Dickins , Chris Li , David Hildenbrand , Yosry Ahmed , "Huang, Ying" , Nhat Pham , Johannes Weiner , Baolin Wang , Barry Song , Kalesh Singh , Kemeng Shi , Tim Chen , Ryan Roberts , linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 8A95140006 X-Stat-Signature: bgd8wk6tx5iworrwcsp661jswqgu1t9k X-Rspam-User: X-HE-Tag: 1750330276-466918 X-HE-Meta: U2FsdGVkX1+PlE8ziLDY1/KUP3Zn1+I4qcxbn6Jw9g8FhzmQ1+XNLkpIXdopaUa/JOhW+/zo5BLFrhgUcO0V/3sJxC9/8DfzzTAr6vPc2GVJz8HjWlGOIOdQYUfxe6RCgiqIcNSyDR227hBEApHbB5y5l4Ksz3+2e79YjFlwmnWFp5YuhMuCW60yOWe4khD3Ee8vemcs2C7R4f0D6uB4so0KRMvrnz9fZ/s07lJLJlEO3cXpu8omXNNoo/dD8KvbKrXvR9HY7Ewjp3i7+GEy+tFm+EcAHAgLhmB2B+Oim20yIAIZpPhB/df32PkIHUzYtxbGvpulZ18FnEYwdyxO4stWHhKlqTY/yZU+34USek7S9UCUz6+39UmPu53Gj3Z4yp9iDQAC8V2qby/BeOqOfdGKoL78xAxoq21gSgr2r9PLDVn3+JifTajUJHHiXWgyk9DkSBF87K7EYcy7XZAsU+5Yzmt8J+n16vDy5F7Es+xEVnqTvG6srk8+VggC2A9Q7+3MFH88g7lYvFQ5L0HwLT6pT3/cE9d1/OYNt9+zJMGtTKA4E3trngCeQC5x0mJB4qIBRTYhMrh8syXvPK5QX6C2u8BBIu1oFKBLZbkObOvz99DsaM6XkHLoisiEyxAcYZncEKdYhNm6JDEmWQsfcLZq/UAhCEfwO3y/lRBoOAkLun3pBNiUIFkEb4PGnjNn98DLpEWWmEP48xOlSupID7MMpcFiuvzuX/5MKf8noI8PzhtvroSLirH1ZcX4vEt10ZxVGMFYmyvP4w3zhZqURfEFbyCDkqPqD+VydA20XsTlW26K/8lFAZSoa6J/8WoS+oJcCNICcz/TOWhVYBEsUbLTLengkHB/shsQfptP9RMsDylpE19cvmaoOW1zqYK8INI8aIEgKYwRd0anObvmIkWidrJYA20Ix44WQYlr4KAxlY8+eKt/AUc9Mv49N03p6UHcmjfFncROjGdn22y GTEs5wUi 8le46oHax/KWq24Pva41T9GVR6ie9laaoCRErQwo2neV5UFdsPz5Ul16xhnjaKURvyF5/La7WFl+SYC+1w7ZsG3vgmwuEOYcKE2Wt++6QWOL8Fq4t87T7kwnphLsHQ0ZFxuRrxItrybtddBlmRmiBwLAntMYW+X7Rh7rLc2lSNNJ8iztzAjfebxbBsKROku8k8MWW3JIH/L/W+PoXoqjoy068gPJ5xNkqxSkqVH8gqMJaIoz9iR0rtTMesZJEhArJKu1JoORvzQiWCfWSKeEuagsJojOn5SdMYxGr2Hy1PqSCLiny0+WiBoWkO1hrfYkZ51aXg31nCtK+/bNmEYVr6Qom3gVzVObb6J5T0sYuOlZncA1DUTNqyJEbxA== 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: On Thu, Jun 19, 2025 at 6:38=E2=80=AFPM Baoquan He wrote: > > On 05/15/25 at 04:17am, Kairui Song wrote: > > From: Kairui Song > > > > Instead of looking at the swap map, check swap table directly to tell i= f > > a swap entry has cache. Prepare for remove SWAP_HAS_CACHE. > > But you actually check both the swap table entry and swap map entry in > this patch, or do I miss anything? Hi, Baoquan > > E.g > > if (!swap_count(si->swap_map[offset]) && swp_te_is_folio(swp_te)) Yes, the count info is still in the swap_map now, I'm only converting the HAS_CACHE check to use swp_te_t here. We'll remove swap_map in later patches and use the swp_te_t solely to get both info. The reason some checks are added to check the swap_count is that: Before this patch, `swap_map[offset] =3D=3D SWAP_HAS_CACHE` implies the count is zero too. So if HAS_CACHE is moved to swp_te_t, we still need to check the count separately. The overhead will be gone very soon in a later patch. > > > > > Signed-off-by: Kairui Song > > --- > > mm/memory.c | 12 +++++------ > > mm/swap.h | 6 ++++++ > > mm/swap_state.c | 11 ++++++++++ > > mm/swapfile.c | 54 +++++++++++++++++++++++-------------------------- > > 4 files changed, 48 insertions(+), 35 deletions(-) > > > > diff --git a/mm/memory.c b/mm/memory.c > > index a70624a55aa2..a9a548575e72 100644 > > --- a/mm/memory.c > > +++ b/mm/memory.c > > @@ -4314,15 +4314,15 @@ static struct folio *__alloc_swap_folio(struct = vm_fault *vmf) > > } > > > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > > -static inline int non_swapcache_batch(swp_entry_t entry, int max_nr) > > +static inline int non_swapcache_batch(swp_entry_t entry, unsigned int = max_nr) > > { > > - struct swap_info_struct *si =3D swp_info(entry); > > - pgoff_t offset =3D swp_offset(entry); > > - int i; > > + unsigned int i; > > > > for (i =3D 0; i < max_nr; i++) { > > - if ((si->swap_map[offset + i] & SWAP_HAS_CACHE)) > > - return i; > > + /* Page table lock pins the swap entries / swap device */ > > + if (swap_cache_check_folio(entry)) > > + break; > > + entry.val++; > > } > > > > return i; > > diff --git a/mm/swap.h b/mm/swap.h > > index 467996dafbae..2ae4624a0e48 100644 > > --- a/mm/swap.h > > +++ b/mm/swap.h > > @@ -186,6 +186,7 @@ static inline struct address_space *swap_address_sp= ace(swp_entry_t entry) > > extern struct folio *swap_cache_get_folio(swp_entry_t entry); > > extern struct folio *swap_cache_add_folio(swp_entry_t entry, struct fo= lio *folio, > > void **shadow, bool swapin); > > +extern bool swap_cache_check_folio(swp_entry_t entry); > > extern void *swap_cache_get_shadow(swp_entry_t entry); > > /* Below helpers requires the caller to lock the swap cluster. */ > > extern void __swap_cache_del_folio(swp_entry_t entry, > > @@ -395,6 +396,11 @@ static inline void *swap_cache_get_shadow(swp_entr= y_t end) > > return NULL; > > } > > > > +static inline bool swap_cache_check_folio(swp_entry_t entry) > > +{ > > + return false; > > +} > > + > > static inline unsigned int folio_swap_flags(struct folio *folio) > > { > > return 0; > > diff --git a/mm/swap_state.c b/mm/swap_state.c > > index c8bb16835612..ea6a1741db5c 100644 > > --- a/mm/swap_state.c > > +++ b/mm/swap_state.c > > @@ -266,6 +266,17 @@ struct folio *swap_cache_get_folio(swp_entry_t ent= ry) > > return folio; > > } > > > > +/* > > + * Check if a swap entry has folio cached, may return false positive. > > + * Caller must hold a reference of the swap device or pin it in other = ways. > > + */ > > +bool swap_cache_check_folio(swp_entry_t entry) > > +{ > > + swp_te_t swp_te; > > + swp_te =3D __swap_table_get(swp_cluster(entry), swp_offset(entry)= ); > > + return swp_te_is_folio(swp_te); > > +} > > + > > /* > > * If we are the only user, then try to free up the swap cache. > > * > > diff --git a/mm/swapfile.c b/mm/swapfile.c > > index ef233466725e..0f2a499ff2c9 100644 > > --- a/mm/swapfile.c > > +++ b/mm/swapfile.c > > @@ -181,15 +181,19 @@ static long swap_usage_in_pages(struct swap_info_= struct *si) > > #define TTRS_FULL 0x4 > > > > static bool swap_only_has_cache(struct swap_info_struct *si, > > - unsigned long offset, int nr_pages) > > + struct swap_cluster_info *ci, > > + unsigned long offset, int nr_pages) > > { > > unsigned char *map =3D si->swap_map + offset; > > unsigned char *map_end =3D map + nr_pages; > > + swp_te_t entry; > > > > do { > > + entry =3D __swap_table_get(ci, offset); > > entry is not used in swap_only_has_cache() in this patch. Thanks, it used in a later patch so I must move it here accidently during a rebase, will defer this change to later patch. > > > VM_BUG_ON(!(*map & SWAP_HAS_CACHE)); > > - if (*map !=3D SWAP_HAS_CACHE) > > + if (*map) > > return false; > > + offset++; > > } while (++map < map_end); > > > > return true; > ......snip... > >