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 E0A09C7115B for ; Thu, 19 Jun 2025 10:38:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4E3336B00AB; Thu, 19 Jun 2025 06:38:20 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4935C6B00AD; Thu, 19 Jun 2025 06:38:20 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3832D6B00AF; Thu, 19 Jun 2025 06:38:20 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 276EE6B00AB for ; Thu, 19 Jun 2025 06:38:20 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id CFCE380B47 for ; Thu, 19 Jun 2025 10:38:19 +0000 (UTC) X-FDA: 83571800718.11.7A92B8E Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf18.hostedemail.com (Postfix) with ESMTP id DDB541C0009 for ; Thu, 19 Jun 2025 10:38:17 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=OcIEOWhD; dmarc=pass (policy=quarantine) header.from=redhat.com; spf=pass (imf18.hostedemail.com: domain of bhe@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=bhe@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750329498; a=rsa-sha256; cv=none; b=17Z/3/BMJUjgxxVR8uIQggk1B80lz9PF8qeCmHor6Lsea/os1QgU2CgH866fGQsXDQjb8j UNO8U1kLUZi6aQ/aKkfGKhYPNBUbULx70LUWrA5FmH8an4AUmGaOZIE60uo02rjdPAlf6j GhVIY2oKULxBJn+M24H/hcrHdimOjeg= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=OcIEOWhD; dmarc=pass (policy=quarantine) header.from=redhat.com; spf=pass (imf18.hostedemail.com: domain of bhe@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=bhe@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750329498; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=aR/RhKva1LzUNvpspRIuDiQMPy7Eui5RuKemymunabo=; b=8CrRNOYJHAjrXhjM/cWaC3IK6u1c5PUPwyVSqEit/CvEIPK7TngpHVUi+pyrO1FU9tL3Lc zjJU388vpEXEV/kgUb+HgTzWPMUV8TbP4mZT3LnKbaCxJC63Q1BedWOHS44ED6pZQaMCUP vHglxyXGWctAPEdz8ZnH+2qar5vvpoE= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1750329497; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=aR/RhKva1LzUNvpspRIuDiQMPy7Eui5RuKemymunabo=; b=OcIEOWhDJWP8TSYI8wXUf6mPTX4KPde3p/cCzcZ77FJ0zaSNu5Tp9VNqAKF3myaOOyd7sc dAPSJAy2ILFK+5vKtvxvBcqVWBkbkHb+UtN5ZuuT/7To4wSUpeA9D1sh7w+0mYXtHkuVoo gUeKQl56+gSTE5sXE3h0ymd+hlseDZM= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-592-6Z4QdXgWMr2sPOxp93XBcA-1; Thu, 19 Jun 2025 06:38:13 -0400 X-MC-Unique: 6Z4QdXgWMr2sPOxp93XBcA-1 X-Mimecast-MFC-AGG-ID: 6Z4QdXgWMr2sPOxp93XBcA_1750329491 Received: from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 370041956094; Thu, 19 Jun 2025 10:38:10 +0000 (UTC) Received: from localhost (unknown [10.72.112.28]) by mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EEC4D1956094; Thu, 19 Jun 2025 10:38:06 +0000 (UTC) Date: Thu, 19 Jun 2025 18:38:02 +0800 From: Baoquan He To: Kairui Song 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 Subject: Re: [PATCH 20/28] mm, swap: check swap table directly for checking cache Message-ID: References: <20250514201729.48420-1-ryncsn@gmail.com> <20250514201729.48420-21-ryncsn@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20250514201729.48420-21-ryncsn@gmail.com> X-Scanned-By: MIMEDefang 3.0 on 10.30.177.15 X-Stat-Signature: pdw49i458xmq4rn4ascw9fpt8e8ks14o X-Rspamd-Queue-Id: DDB541C0009 X-Rspam-User: X-Rspamd-Server: rspam06 X-HE-Tag: 1750329497-974965 X-HE-Meta: U2FsdGVkX1/bznv6czQ405JhXo7WgO2fJWCq72wZ2LpZX1NbsDdgs285xtyOkl+nWPl2BgvJOIyz9xitzSYYYENkvUT5zdsSKITwKyCVJwss/bfvbpsmr54ythQsF92H8+AxWEFVrlZhZHAoxeY0ZBc85tiuvyNqjHZy+KzU6SAUft3FWajNocm9slLMJXg9HvKIehIC9oJh1NABGTz3uZd37rMJMZAOSRiVaB20pepxfiEklzLRP9S8uphdRQ8jQe9VYc7TEXhxRnHGDWxuguzf/fUD6RdlPgKEr44M8ay0+u2lvP3eAhI0mCAD7csPxF9XIHcQLlRKTC3Y59sJ57fu/qw6LlovMojpKBesnnitS93cG7VJWQjgUHOoPXusIvsm4OwEA89g3XhHayWK3kYffCUONlChSfL8sK1OrfrC4Jqt0dEyeKF34aYPScEckQ0n9XKhFaK0Z4QCadcqp6UyJCTCTi6C3xjNYosXFviKeZgR9diX7ckdKuyv1BzpGsEEitmuUDSoUsh4HWsFBQ7jpcoXG5ic/pxR/o/NDUlMMcKbSss2kESx7vtKHMjTBQRY1StgQR9zv7BMufc11cTeo/c53YrS5pP05G1qCRsXcwV4tIzbnm43nZ7E/5YFdRHqqLt1u2bqXPQR3/4IqS+fOt8NgT6ADv7i3W+4IH7o3JRkYjPIrQPxSiHGiHG76pV4NKSv5r5z4TKtaUlSjPgtKMOrQNO02PL8lnZsBA1Q4W0rl7PEA10IJIMCFi3wCJ0Op/Iijpg2jF1KhJeKDn7OP8B4LjJvKWphHndXgZOwLij1A7A5Z3TlUiYsFOfhL+P4H+NmL0Jd5Q5Fei33BjHA/akugLCgL6Am+Dudwmpnht254tg9DhescaBCkzQcvxyYyeHkDRuN0d/t3ax8MbTe7LsUw4N/9IUSQeJ7vulKcK+MceQ989gBHI71sGbYlARiISD6ko+z6XBRRmv 9JBtM2CB pp5hO/oFRep5H7w8TQgRjC6pcTOP7PzI+7YMVBklLt84d50saBCZD+b6n595JchhXpqteuiolUFf4vLXE1/jKs94foX90cn96/rnv4XRVLSWBYaVbL6b6gvae6+6XIkDkiFd+TJwWMRBfrfgEB7mnMjyzjr/vqJOC5bWAcABFn2hcnCoGfb/LDZLbK/diXWxTs5aBjDCJP6BemoLNURfsziIQhup7vyMCV85kiO6rNYSymCRvxF8FsRuemuC9kDY060yYbDBoLViBK/inrtTWwAhNELJPbFFwPZJ1b+DUwFVt2tUn9UiRx2Z0dar0PNf2tuUVngmVqfjelt7GFm11denSCVJ5U0DOSj0jKHb0tZ/ImNSV7+txW45YwBD4vEXKgYVnMbEWJZ/kpyqFf4AQ62sRHj0FNZHxenoZD4SGldj9Brs= 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 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 if > 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? E.g if (!swap_count(si->swap_map[offset]) && swp_te_is_folio(swp_te)) > > 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 = swp_info(entry); > - pgoff_t offset = swp_offset(entry); > - int i; > + unsigned int i; > > for (i = 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_space(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 folio *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_entry_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 entry) > 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 = __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 = si->swap_map + offset; > unsigned char *map_end = map + nr_pages; > + swp_te_t entry; > > do { > + entry = __swap_table_get(ci, offset); entry is not used in swap_only_has_cache() in this patch. > VM_BUG_ON(!(*map & SWAP_HAS_CACHE)); > - if (*map != SWAP_HAS_CACHE) > + if (*map) > return false; > + offset++; > } while (++map < map_end); > > return true; ......snip...