From nobody Mon Jun 8 05:28:17 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (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 A5744BA45 for ; Tue, 2 Jun 2026 01:01:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780362094; cv=none; b=ktGFXCI07hsP5zLcL2ORlA1f0nb1HXm2JQdixxg4koYzt1BTfhWfXg2xGlonWmphGHucNrP2t2plChYItp/q1+FvY+lXhrp8T3bSDGVxgonxgivdeytoAUcW+88J4qALwi0/Yp3A7KNM492IFPDDIOs/ymmc6xaqD69eZmE1yHE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780362094; c=relaxed/simple; bh=U//WgOrwvoq/HPdRnaVsUGDxXeZw9r2BdejpXkkxLy8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J1Ra8p+cscrj7oEIb+48E3UZvFnrWSL+53CcPfEL6sq3x3Uea2eatt2qkKRwRMPZ84QsQdd/1kzIKpZi4bR+eOpParLeHAjhGm4UD8H4sXZIFNAtdphcWtYOlNEOpgIl+lIXvasamTHUUtcFEsyy85UGOozU5fASrXYinIe7k0w= 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=JSPS4OX9; arc=none smtp.client-ip=209.85.214.176 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="JSPS4OX9" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2c0bd02d97eso23154705ad.2 for ; Mon, 01 Jun 2026 18:01:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780362093; x=1780966893; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=wGPIJKEwlEpJKHH4SLNL7cs1Yqvspn4Cra5AaU0HUME=; b=JSPS4OX9qNNCgWf8cT5zwYUp1wlPi71iVsHMWs9gK5aRAAyhPCzkVIU9XVbWTYjpQN ExjL95730GX0I3mGzl8lPJUsqa9EvgNz1T/HkPyJX9CfgrPM/gY16HwSosPP2FyMoWCq WU2P4yAQHhBfiaEDUMKb9YMulwH3lEKAu/5Jf/+FfMyf4R90cynb0SMrK3uJh6IWfeOU G/e2gpU296EX3rYHvHSlxpcs6jh/h5WiuIJYMA0Aqqh7SxooQOgEYJtLW5q11bVF4hp9 TNerIef4DUrC74ucBNlsBHhiJsVJo9fBrUF6MIh7tW018GF7GoAq+VCvfLy856u1I9gA flDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780362093; x=1780966893; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=wGPIJKEwlEpJKHH4SLNL7cs1Yqvspn4Cra5AaU0HUME=; b=CY3cIc3YK4VnMkCuuiRVHf5GJjBphdsvHhnDoKhS3Ek+L3FisJpCOd7ffWHReeO76T uW/lvQmWkIZylq/Tb21rrdpyj4ZcoXvkkOl68y6KSqulG1LPMqr6KzN4hVvGlqMfqlQS L60cKC7++PAdMykCHM4g744TD7YyL4oVK95QORvSFd4IVzQtmgj9m4DOs+1hkvrpRGdj TMLQxZM1VBiG8CJZSCOky5/B7LlixdZnolvcfZaVQRFx1x3yv3q6lf7Ovo9Selv/IAyH xrHbZigdRJscA+lJpsqMLev7APptPZhgwpibX6iHtci3fzA547Lq4UKZJE5WmeQ4hmxm q5OQ== X-Forwarded-Encrypted: i=1; AFNElJ9nbRafjTv9d9KVektOYS2Q01xKwAoktNc/2KNFeB83QXkkFPE+M6U220j6wqbxYF39wPLPI6/+Rtr6rFI=@vger.kernel.org X-Gm-Message-State: AOJu0YxFc1/s9a2vQiWA6hdQJVz0kAsxSA2gFmOkEJmY8r++AuyteEnO fpD/KWUSNej4dEOtulKU2WLK07NuDP32rr42JIzKpPincR5lTqvbl9G9 X-Gm-Gg: Acq92OHH7NuecH+zJnlcgQMhzLuJ5Lsd6oISi2HNsfZmrs4bHg9jhHlYniurfo0ebPa rzAQHGWybbpH+vOuaUh2GSVh/U51m8CfoDQ6WG+TpMlmpCrwV6Dh5UR4Cbk9vmRxblNuAV7MWRb potpwHDTfuyBtWZc+TkYmOrHl+Urf+LTTBtuQqJCKAqL4LgAnA19Zyoa0Mr0eoAgy5f5zL2qbmh CEGiWkrLxxauoKXoo1991ULNk8K8L/fGCvz05cDMiOzzDZBfVBV9fxPqe4eEISXS5iJbB1B1JZZ Y7lSPVcWAtVjI2/I4S202bV+wZ5/e1i7Qwj1UxDa+V0vIYgJCQ2gvKN6Jlzm4Bwd8LIUTacxC8q lvmSJa3tA5Rn3M8hDYPvtxAtiy6nyT0J/25tvDF8RIy61RzBmGfq1oI4w10WS63QOiZvm6grd4C g6G8fjw+Hkg63m+kfYi4y1L5CQ5ELrWp9V/zInIWaOCk5PWyeV6VGekAqhbGsIayHRjsvHG4tuw jPt8+mxnpKZ2jVHnydK5bY0F4PrYHnV X-Received: by 2002:a17:903:234c:b0:2c0:abd3:32fc with SMTP id d9443c01a7336-2c0abd339bcmr122968685ad.34.1780362092572; Mon, 01 Jun 2026 18:01:32 -0700 (PDT) Received: from NV-J4GCB44.localdomain (nat-hk.nvidia.com. [203.18.50.4]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bf239fd85dsm111693355ad.25.2026.06.01.18.01.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Jun 2026 18:01:32 -0700 (PDT) From: Jianyue Wu Date: Tue, 02 Jun 2026 09:01:15 +0800 Subject: [PATCH v3 1/3] mm/swap: colocate page-cluster sysctl with swap readahead Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-1-5bbb567f8c99@gmail.com> References: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-0-5bbb567f8c99@gmail.com> In-Reply-To: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-0-5bbb567f8c99@gmail.com> To: Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song , Youngjun Park , Qi Zheng , Shakeel Butt , Axel Rasmussen , Yuanchu Xie , Wei Xu , Johannes Weiner , David Hildenbrand , Michal Hocko , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Hugh Dickins , Baolin Wang Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Jianyue Wu X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openssh-sha256; t=1780362076; l=5610; i=wujianyue000@gmail.com; s=id_ed25519; h=from:subject:message-id; bh=U//WgOrwvoq/HPdRnaVsUGDxXeZw9r2BdejpXkkxLy8=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgW51Zh3v9nG0Wlld2Ti8ylp1TnO7yB H+z9CbXty/WEAQAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QGjiGdfDmt3WVhe35BVC83RzIiuXHwIOkCCP/23I7fR1WOnmaBSSeLPMcQ7kpBgUQbNl1iu8/jP lHda0dYyPIQk= X-Developer-Key: i=wujianyue000@gmail.com; a=openssh; fpr=SHA256:gVWBPJbHGWlCIw+V8F63Ff0k21S7AB5+rZt8+huemvg page_cluster and the vm.page-cluster sysctl are only used by swap-in readahead in swap_state.c. Move them out of swap.c together with swap_readahead_setup(), and make page_cluster static to that file. Rename swap_setup() while moving it as well. The helper is internal to MM and now only sets up swap readahead defaults and its sysctl hook, so the more specific name matches its reduced scope. Suggested-by: Baoquan He Suggested-by: Barry Song Signed-off-by: Jianyue Wu --- include/linux/swap.h | 1 - mm/swap.c | 36 ------------------------------------ mm/swap.h | 8 ++++++-- mm/swap_state.c | 37 +++++++++++++++++++++++++++++++++++++ mm/vmscan.c | 2 +- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 636d94108166..5bd6f1d5984a 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -345,7 +345,6 @@ extern void lru_add_drain_cpu_zone(struct zone *zone); extern void lru_add_drain_all(void); void folio_deactivate(struct folio *folio); void folio_mark_lazyfree(struct folio *folio); -extern void swap_setup(void); =20 /* linux/mm/vmscan.c */ extern unsigned long zone_reclaimable_pages(struct zone *zone); diff --git a/mm/swap.c b/mm/swap.c index 588f50d8f1a8..e4b3dadaa6dc 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -43,10 +43,6 @@ #define CREATE_TRACE_POINTS #include =20 -/* How many pages do we try to swap or page in/out together? As a power of= 2 */ -int page_cluster; -static const int page_cluster_max =3D 31; - struct cpu_fbatches { /* * The following folio batches are grouped together because they are prot= ected @@ -1171,35 +1167,3 @@ void lru_reparent_memcg(struct mem_cgroup *memcg, st= ruct mem_cgroup *parent, int lruvec_reparent_lru(child_lruvec, parent_lruvec, lru, nid); } #endif - -static const struct ctl_table swap_sysctl_table[] =3D { - { - .procname =3D "page-cluster", - .data =3D &page_cluster, - .maxlen =3D sizeof(int), - .mode =3D 0644, - .proc_handler =3D proc_dointvec_minmax, - .extra1 =3D SYSCTL_ZERO, - .extra2 =3D (void *)&page_cluster_max, - } -}; - -/* - * Perform any setup for the swap system - */ -void __init swap_setup(void) -{ - unsigned long megs =3D PAGES_TO_MB(totalram_pages()); - - /* Use a smaller cluster for small-memory machines */ - if (megs < 16) - page_cluster =3D 2; - else - page_cluster =3D 3; - /* - * Right now other parts of the system means that we - * _really_ don't want to cluster much more - */ - - register_sysctl_init("vm", swap_sysctl_table); -} diff --git a/mm/swap.h b/mm/swap.h index 8742b82cd0db..f860f8c669e8 100644 --- a/mm/swap.h +++ b/mm/swap.h @@ -9,8 +9,6 @@ struct mempolicy; struct swap_iocb; struct swap_memcg_table; =20 -extern int page_cluster; - #if defined(MAX_POSSIBLE_PHYSMEM_BITS) #define SWAP_CACHE_PFN_BITS (MAX_POSSIBLE_PHYSMEM_BITS - PAGE_SHIFT) #elif defined(MAX_PHYSMEM_BITS) @@ -96,6 +94,8 @@ struct swap_ops { }; =20 #ifdef CONFIG_SWAP +void swap_readahead_setup(void); + #include /* for swp_offset */ #include /* for bio_end_io_t */ =20 @@ -345,6 +345,10 @@ static inline unsigned int folio_swap_flags(struct fol= io *folio) } =20 #else /* CONFIG_SWAP */ +static inline void swap_readahead_setup(void) +{ +} + static inline struct swap_cluster_info *swap_cluster_lock( struct swap_info_struct *si, pgoff_t offset, bool irq) { diff --git a/mm/swap_state.c b/mm/swap_state.c index b9613026950e..e8f1fb37a6cf 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -22,10 +22,15 @@ #include #include #include +#include #include "internal.h" #include "swap_table.h" #include "swap.h" =20 +/* How many pages do we try to swap or page in/out together? As a power of= 2 */ +static int page_cluster; +static const int page_cluster_max =3D 31; + /* * swapper_space is a fiction, retained to simplify the path through * vmscan's shrink_folio_list. @@ -986,6 +991,38 @@ struct folio *swapin_readahead(swp_entry_t entry, gfp_= t gfp_mask, return folio; } =20 +static const struct ctl_table swap_sysctl_table[] =3D { + { + .procname =3D "page-cluster", + .data =3D &page_cluster, + .maxlen =3D sizeof(int), + .mode =3D 0644, + .proc_handler =3D proc_dointvec_minmax, + .extra1 =3D SYSCTL_ZERO, + .extra2 =3D (void *)&page_cluster_max, + } +}; + +/** + * swap_readahead_setup - defaults and sysctl for swap cache readahead clu= stering + */ +void __init swap_readahead_setup(void) +{ + unsigned long megs =3D PAGES_TO_MB(totalram_pages()); + + /* Use a smaller cluster for small-memory machines */ + if (megs < 16) + page_cluster =3D 2; + else + page_cluster =3D 3; + /* + * Right now other parts of the system means that we + * _really_ don't want to cluster much more + */ + + register_sysctl_init("vm", swap_sysctl_table); +} + #ifdef CONFIG_SYSFS static ssize_t vma_ra_enabled_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) diff --git a/mm/vmscan.c b/mm/vmscan.c index 2d44ebfebdea..e34f1565f42f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -7651,7 +7651,7 @@ static int __init kswapd_init(void) { int nid; =20 - swap_setup(); + swap_readahead_setup(); for_each_node_state(nid, N_MEMORY) kswapd_run(nid); register_sysctl_init("vm", vmscan_sysctl_table); --=20 2.43.0 From nobody Mon Jun 8 05:28:17 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (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 4BA03BA45 for ; Tue, 2 Jun 2026 01:01:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780362101; cv=none; b=VEYf3BIDsIpajREayBx1PnML2GEJP8UoJBLa3tqaa/EMiPxVNrIRD4aOmg8ZbiJJYY24ZqEv3PDBhcftzxsUgz9op2MIsRwdWxqg6YrNf/n2rtpWaz0XpXFK23vZWJVN4P3dzlt+hUBamSn2C1asePGZG1txMq20iWjucO6PmQU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780362101; c=relaxed/simple; bh=irV6tT2VkmAHwvkYIbqPFAWrBGcSQqdUJIymy1EVHjA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LsVl99cGRaXIO38cGi/lR2Iyv1tQEeHbnk7ygon+GZzBvUyXzBtw68Cq42RA0kJYFe49iGm2eFvQMb3O2rPhATS0WPAhmngHg/wsrBZ6R5TfxEczu5OxzzTRZWa9g/X1dYobAA34HSvu5iZwaqsMUIJrarsr1R0ayISkTyhqcUA= 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=Dne6JYYa; arc=none smtp.client-ip=209.85.214.176 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="Dne6JYYa" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2c0c1e0d00bso19094585ad.0 for ; Mon, 01 Jun 2026 18:01:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780362099; x=1780966899; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=AW3A/Ls+0h2KLVTTYuDIxmHt+2dRNezfr2XaBLaOlas=; b=Dne6JYYamtsVaDEmU8TJhPV4tyabtYxMVLbCOPy6jODQAGb0sqRCbNkDZJakj00H6+ M8+fdRzHxGkmEQrny+rGrT2mFE7s5P8Yc5AwBVZFizE57GZcfkIOk1OODWkKd0gYrY+i 2Y3A/g7mkZtrenUIsaNy0HxB8oWF1D4NsyYWhEej1Aik644a8ZYZF83afiVKz7vvW2Ko m9Vc50djZvidfU3RXZthE0gCFLt9RgHS/3q4ioLfZS0c2p1+mFvjQcS9E2+l8VbdzgH9 wgXuEjmFiaMF83GxDGIU8X1EleGUOHyagQ66i0EPvVJG5NzcB/5i4nUtpf5Bqk7EgfHP joRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780362099; x=1780966899; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=AW3A/Ls+0h2KLVTTYuDIxmHt+2dRNezfr2XaBLaOlas=; b=NHU7OsjITRoG1RYcno+AkLw0ns6ZPzwvnl5LDZbUIPbam0QV2DjhVL2sZ/swHKztAG RgshQE82fMzq2C0GKufJUqDzpTWxno6lLFq9iAPdOrKD4FldA4Jnpa4cJ7Dc6nm4I8fX 7DDzZ1g/gDBruhVKc2F/9hmOZ6be/boIX5jikneyVX4HRHU1zHTPd2sFRwAFxtcoqMno jAkFx7E75ZceTk3DY62N/N5HysXvQN2vj6s1Aaeb8jRcamkHencG4SZM/heQXmBimUWv og6ORvb2sAKDyHE0FURWz4MhDFpHTJgcM93izIml/+MdEGO7C7OhtWKimlIaFmJJwvsk 4SKw== X-Forwarded-Encrypted: i=1; AFNElJ9iQPVErx9HFyHZQMhsQpoeREAvJiKpaMpJYd/ngu/duhE7VAuLeVTZK6faYE7ywJgtWsu9JNxVi85kXjo=@vger.kernel.org X-Gm-Message-State: AOJu0YwnKDLnFovLhEnzxqk5aWPQLcNGFSfRbgH255SbvmIJVYNXNHZx M8K+IGeEbJrDay9Ox58Y9XbPAWrgNFODgTbZrYJE6WpTXKUQFeqFTonE X-Gm-Gg: Acq92OGHz8FZzbVBr9sw7hgc+8bBJ07gbrtwA3a0EhXncFtue+5NqgmuHTNaUJQ1mZB 40LerWbJAMULrhVs+dm+QP0eWYnEqsiFR+AkQgkyBu/TnSF5hcgiwjZXyWUS3wxqDKVRNXlwMjW Rucw3dqFu3KwGbqWVTGxmOVajkUGjiqehJxy7er+L2EO4c27zvtkQxgx+YBDOS+IONmGjyUwDPU BRx0xMllI18n67tc3tPxEdqfMQnPbqpxGhQC6SeXQ4SPBzvywiXkW2lg5q/1wek1r+rXpwOUHfk TQuKHQZSH42t5+GMgBaQCBidWEITEaMMVYQRVoONPLaBnhPcpsexRK4QNCZX/kf2RlnOyzz86fb 6jGYHgBT8E/piTAW9DJY/9e0krLe3yp0dea4C/X8eIweNFFq0aUsmbeSVXMCwUJSOlzd+bIW/rq ZtvptlBcYllZGe9+ygUwwjwexGtl9IKt9aJVGkpd5nnv2Y33LUTnj7/48X3gufVrJuC3opZMwa/ 8JVccntClOLy7Vav8jEAg== X-Received: by 2002:a17:902:ecca:b0:2bc:f1ef:2e65 with SMTP id d9443c01a7336-2bf367dbbc6mr158885955ad.17.1780362099480; Mon, 01 Jun 2026 18:01:39 -0700 (PDT) Received: from NV-J4GCB44.localdomain (nat-hk.nvidia.com. [203.18.50.4]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bf239fd85dsm111693355ad.25.2026.06.01.18.01.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Jun 2026 18:01:38 -0700 (PDT) From: Jianyue Wu Date: Tue, 02 Jun 2026 09:01:16 +0800 Subject: [PATCH v3 2/3] mm: move folio LRU code out of swap Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-2-5bbb567f8c99@gmail.com> References: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-0-5bbb567f8c99@gmail.com> In-Reply-To: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-0-5bbb567f8c99@gmail.com> To: Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song , Youngjun Park , Qi Zheng , Shakeel Butt , Axel Rasmussen , Yuanchu Xie , Wei Xu , Johannes Weiner , David Hildenbrand , Michal Hocko , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Hugh Dickins , Baolin Wang Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Jianyue Wu X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openssh-sha256; t=1780362076; l=3325; i=wujianyue000@gmail.com; s=id_ed25519; h=from:subject:message-id; bh=irV6tT2VkmAHwvkYIbqPFAWrBGcSQqdUJIymy1EVHjA=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgW51Zh3v9nG0Wlld2Ti8ylp1TnO7yB H+z9CbXty/WEAQAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QK6wYNFc1kVFT8CN61Kwgpv/dbQuBJVp1aAvggsrFzWp3+LeCCovaR2gFPQrXpcS+mR85xiVhNn oSy79euxduAo= X-Developer-Key: i=wujianyue000@gmail.com; a=openssh; fpr=SHA256:gVWBPJbHGWlCIw+V8F63Ff0k21S7AB5+rZt8+huemvg Rename mm/swap.c to mm/folio_lru.c so the filename better matches the code's main responsibility. This keeps the implementation split from swap-specific code without changing the published LRU helper interfaces. Update MAINTAINERS and the remaining mm/swap.c documentation references after the rename. Suggested-by: Baoquan He Suggested-by: David Hildenbrand Signed-off-by: Jianyue Wu Reviewed-by: Lorenzo Stoakes --- Documentation/admin-guide/sysctl/vm.rst | 2 +- Documentation/core-api/mm-api.rst | 2 +- MAINTAINERS | 3 +-- mm/Makefile | 2 +- mm/{swap.c =3D> folio_lru.c} | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-= guide/sysctl/vm.rst index 97e12359775c..31d135e107cb 100644 --- a/Documentation/admin-guide/sysctl/vm.rst +++ b/Documentation/admin-guide/sysctl/vm.rst @@ -20,7 +20,7 @@ of the virtual memory (VM) subsystem of the Linux kernel = and the writeout of dirty data to disk. =20 Default values and initialization routines for most of these -files can be found in mm/swap.c. +files can be found in mm/swap_state.c. =20 Currently, these files are in /proc/sys/vm: =20 diff --git a/Documentation/core-api/mm-api.rst b/Documentation/core-api/mm-= api.rst index aabdd3cba58e..d6d189b9a996 100644 --- a/Documentation/core-api/mm-api.rst +++ b/Documentation/core-api/mm-api.rst @@ -117,7 +117,7 @@ More Memory Management Functions .. #kernel-doc:: mm/hmm.c (build warnings) .. kernel-doc:: mm/memremap.c .. kernel-doc:: mm/hugetlb.c -.. kernel-doc:: mm/swap.c +.. kernel-doc:: mm/folio_lru.c .. kernel-doc:: mm/memcontrol.c .. #kernel-doc:: mm/memory-tiers.c (build warnings) .. kernel-doc:: mm/shmem.c diff --git a/MAINTAINERS b/MAINTAINERS index e3ee97f5474e..6bd39e0afceb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16900,7 +16900,7 @@ F: Documentation/admin-guide/mm/multigen_lru.rst F: Documentation/mm/multigen_lru.rst F: include/linux/mm_inline.h F: include/linux/mmzone.h -F: mm/swap.c +F: mm/folio_lru.c F: mm/vmscan.c F: mm/workingset.c =20 @@ -17045,7 +17045,6 @@ F: include/linux/swap.h F: include/linux/swapfile.h F: include/linux/swapops.h F: mm/page_io.c -F: mm/swap.c F: mm/swap.h F: mm/swap_table.h F: mm/swap_state.c diff --git a/mm/Makefile b/mm/Makefile index eff9f9e7e061..5f712f9bbe73 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -50,7 +50,7 @@ endif =20 obj-y :=3D filemap.o mempool.o oom_kill.o fadvise.o \ maccess.o page-writeback.o folio-compat.o \ - readahead.o swap.o truncate.o vmscan.o shrinker.o \ + readahead.o folio_lru.o truncate.o vmscan.o shrinker.o \ shmem.o util.o mmzone.o vmstat.o backing-dev.o \ mm_init.o percpu.o slab_common.o \ compaction.o show_mem.o \ diff --git a/mm/swap.c b/mm/folio_lru.c similarity index 99% rename from mm/swap.c rename to mm/folio_lru.c index e4b3dadaa6dc..7dab6a544d94 100644 --- a/mm/swap.c +++ b/mm/folio_lru.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * linux/mm/swap.c + * linux/mm/folio_lru.c * * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds */ --=20 2.43.0 From nobody Mon Jun 8 05:28:17 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 4BF761E515 for ; Tue, 2 Jun 2026 01:01:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780362108; cv=none; b=CISp/x+v1VIuNBiXA494J9ZMB92OKdV6S2dIdLC1PEzZyryedLOPGtOJjw3s3PccEw2xcwL09NlHimvyGaMZrLuwxZAS/BAKVtTK9wZ1rVI/kt79vqHtlvlhmqc2TG7tLGwI92Zr1BRYzq93b5npNhr6WOAxMEV+A9Q5/pmGRiQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780362108; c=relaxed/simple; bh=HBWYDSW+z+YUZNoqTlNlyOKkpwZU04CFgpqaQLuU830=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cZ6QBCdwiZOAYf3k5kolKBf5j7qQ/mptfwel6OYcVDzHrI8T0gvtOkF9PMj0plxZxNxSbDcf9Lls7KT3t90BF4u4mZW5KJT9uK66HAn5R6gkSvAxjAsrxgMb27fW1eugrkapyMzGuO48kEkCxnSuSiwO5edLMZR4XvRHQlHeMtk= 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=N6XAhoiW; arc=none smtp.client-ip=209.85.214.182 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="N6XAhoiW" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2c0c2c7e0c5so13489625ad.1 for ; Mon, 01 Jun 2026 18:01:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780362106; x=1780966906; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=JrsXZdY1nVR5uNW3w94+wDeXUMKPrhC2a6FwxCjw8mM=; b=N6XAhoiWbCuPx5cqG12hc/1O0z3t8kMYOzCOStmFd0y+9ZB8L63H5sG8NgCWP2fqIL LAeARdgnMYnAZjO9vbhCfB/BX9Bu2nz6V9cJGlaKsnPgHQusdAZ/YH1u7PXgDCuXEqGb 2Td+NoM9I6slYG6I71AtXM6GFb3s8gQaLLKGyJSiLBSwmOsWInAU7O/J2oehZFzXB8kD yLSp6cdxSpJjSuPs+1dK+bN1UK89lG/SD3PNtxxHo7+A42K089HrqXreePKlNYmZMYTL CaQwmP3bIJM4Ahc3CcXaa01wPSXA/qvWFulSfhey7jam/1ORok6hnhQ1Lja61S4z6g/o WpCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780362106; x=1780966906; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=JrsXZdY1nVR5uNW3w94+wDeXUMKPrhC2a6FwxCjw8mM=; b=XwdINYMHL04FSOeJzwANrXuVoal8AHCBiFmh5+4oqClO/OBHBmEsS7NH8FCfK8gEeR yRgnfe4iU7Vji/+M7bGu+a6zsc3YFtY4P7CQjN1VI1BW1VEydEpuMkxcw79M/cMuLLUe D7BfqOH92njVlKIeubKxgHHBVuPFI8Aau1YqjmRs77bSNNUtlR7KNJfSe1/YrRuj8g4s mpG3OHCiyepxZMXpxmxjKFQbczpx9kBeN7jiF4OBFdqhBZbnevhqOjTP/l7hCpfGL4EK MpOTtBCwW+Z7rAwFeQo4qiO6bO2dPY9nZ6RnWNErVe5vbWdPCvDnyIbMQKYO7QD0XbNV 3itQ== X-Forwarded-Encrypted: i=1; AFNElJ+L6TTbOm50e4MzSchp659Rwj6V/aJi3edD6QMOiy9ScdFcxka165RXCHOaVN2TtNtix36qvKtCB74JzbM=@vger.kernel.org X-Gm-Message-State: AOJu0YwykEG2KIMSuK98jw67RZ9QmjBaPvtDe0rVx6jCLX+cCdExRIfR /UnHS90YXgQxXITqrBXWLmjOozLwgB7sY8sdeadH5H6zOSBwg0IODCJS X-Gm-Gg: Acq92OH4YyINCUopM1GExCLJrQEJcR5PqODa3tFQn/ZCeVDAE4lxewEQe28uPZ7Eeq3 FaGFiboE+QJvAuPJjtAhpVYInM+VrStbldnB4+5U96LgzYvnGr//BMaCehHUm9O1kGUdE+gjabp j9kmOQF6PMJNdEazWhm9Asla/cpeiQ+cs6LIe3h82X2MkbVLFJJI7WQFLO2URgQLT4FdGI1Z1Mn vkvLcEhmJPj+Kv+8t3BKxXVvO7qy0XdRioLYNOWbaXPLG+iSnDflc/y28ntvWnRIyO19nYt58qd eGU+XsAK7uQIopgFtAes/6Fhc/zadlfUr5VxTTTemLH/tzN0Oas9c5KPzlX1i4qUEz2otJjrfWL 2fRo0Dxqhxk8UCAkVyiYpcbVYitRfeuoXe8emSsAfR8KqeEOipwbgt/cpySPv1jM8D8p3d21c1l XnymyHRqAlgTTGxOSfyFBWm+GxTVm9O/aAU67a7FU2rXwQct62flFYqpcvZXkphfgX/kstPSGXE msr7ysAN0xVsOVQTVcM1Yrr3bZ0rcGg X-Received: by 2002:a17:903:1905:b0:2bd:9061:d544 with SMTP id d9443c01a7336-2bf368619d0mr156032525ad.34.1780362106396; Mon, 01 Jun 2026 18:01:46 -0700 (PDT) Received: from NV-J4GCB44.localdomain (nat-hk.nvidia.com. [203.18.50.4]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bf239fd85dsm111693355ad.25.2026.06.01.18.01.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Jun 2026 18:01:45 -0700 (PDT) From: Jianyue Wu Date: Tue, 02 Jun 2026 09:01:17 +0800 Subject: [PATCH v3 3/3] mm: move reclaim-internal declarations out of swap.h Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-3-5bbb567f8c99@gmail.com> References: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-0-5bbb567f8c99@gmail.com> In-Reply-To: <20260602-ch-swap-series-plus-folio-lru-cleanup-v3-0-5bbb567f8c99@gmail.com> To: Andrew Morton , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , Barry Song , Youngjun Park , Qi Zheng , Shakeel Butt , Axel Rasmussen , Yuanchu Xie , Wei Xu , Johannes Weiner , David Hildenbrand , Michal Hocko , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Hugh Dickins , Baolin Wang Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Jianyue Wu X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openssh-sha256; t=1780362076; l=7896; i=wujianyue000@gmail.com; s=id_ed25519; h=from:subject:message-id; bh=HBWYDSW+z+YUZNoqTlNlyOKkpwZU04CFgpqaQLuU830=; b=U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgW51Zh3v9nG0Wlld2Ti8ylp1TnO7yB H+z9CbXty/WEAQAAAAGcGF0YXR0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5AAAA QNImkGWXtB4IvSwlLDXHHY3V38iky72Z9z+v39G1qYnonJ/fDxAH7dPVJD9O+rVK2NdsAbZ2oD3 wxdGFfz2m/g0= X-Developer-Key: i=wujianyue000@gmail.com; a=openssh; fpr=SHA256:gVWBPJbHGWlCIw+V8F63Ff0k21S7AB5+rZt8+huemvg Keep include/linux/swap.h focused on swap-facing interfaces by moving MM-internal reclaim and workingset declarations into mm/internal.h. Leave the small set of LRU helper declarations that are used outside mm/ in swap.h so this cleanup does not need a new public header under include/linux/. Suggested-by: Barry Song Suggested-by: Baoquan He Signed-off-by: Jianyue Wu --- include/linux/swap.h | 74 +++++-------------------------------------------= ---- mm/internal.h | 65 +++++++++++++++++++++++++++++++++++++++++++++ mm/memfd.c | 1 + 3 files changed, 72 insertions(+), 68 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 5bd6f1d5984a..1ef6ae7b2db7 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -292,39 +292,17 @@ static inline swp_entry_t page_swap_entry(struct page= *page) return entry; } =20 -/* linux/mm/workingset.c */ -bool workingset_test_recent(void *shadow, bool file, bool *workingset, - bool flush); -void workingset_age_nonresident(struct lruvec *lruvec, unsigned long nr_pa= ges); -void *workingset_eviction(struct folio *folio, struct mem_cgroup *target_m= emcg); -void workingset_refault(struct folio *folio, void *shadow); -void workingset_activation(struct folio *folio); - /* linux/mm/page_alloc.c */ extern unsigned long totalreserve_pages; =20 /* Definition of global_zone_page_state not available yet */ #define nr_free_pages() global_zone_page_state(NR_FREE_PAGES) =20 - -/* linux/mm/swap.c */ -void lru_note_cost_unlock_irq(struct lruvec *lruvec, bool file, - unsigned int nr_io, unsigned int nr_rotated); -void lru_note_cost_refault(struct folio *); -void folio_add_lru(struct folio *); -void folio_add_lru_vma(struct folio *, struct vm_area_struct *); -void mark_page_accessed(struct page *); -void folio_mark_accessed(struct folio *); - -static inline bool folio_may_be_lru_cached(struct folio *folio) -{ - /* - * Holding PMD-sized folios in per-CPU LRU cache unbalances accounting. - * Holding small numbers of low-order mTHP folios in per-CPU LRU cache - * will be sensible, but nobody has implemented and tested that yet. - */ - return !folio_test_large(folio); -} +/* Generic folio LRU helpers used outside mm/. */ +void folio_add_lru(struct folio *folio); +void mark_page_accessed(struct page *page); +void folio_mark_accessed(struct folio *folio); +void lru_add_drain_all(void); =20 extern atomic_t lru_disable_count; =20 @@ -333,42 +311,7 @@ static inline bool lru_cache_disabled(void) return atomic_read(&lru_disable_count); } =20 -static inline void lru_cache_enable(void) -{ - atomic_dec(&lru_disable_count); -} - -extern void lru_cache_disable(void); -extern void lru_add_drain(void); -extern void lru_add_drain_cpu(int cpu); -extern void lru_add_drain_cpu_zone(struct zone *zone); -extern void lru_add_drain_all(void); -void folio_deactivate(struct folio *folio); -void folio_mark_lazyfree(struct folio *folio); - /* linux/mm/vmscan.c */ -extern unsigned long zone_reclaimable_pages(struct zone *zone); -extern unsigned long try_to_free_pages(struct zonelist *zonelist, int orde= r, - gfp_t gfp_mask, nodemask_t *mask); -unsigned long lruvec_lru_size(struct lruvec *lruvec, enum lru_list lru, in= t zone_idx); - -#define MEMCG_RECLAIM_MAY_SWAP (1 << 1) -#define MEMCG_RECLAIM_PROACTIVE (1 << 2) -#define MIN_SWAPPINESS 0 -#define MAX_SWAPPINESS 200 - -/* Just reclaim from anon folios in proactive memory reclaim */ -#define SWAPPINESS_ANON_ONLY (MAX_SWAPPINESS + 1) - -extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, - unsigned long nr_pages, - gfp_t gfp_mask, - unsigned int reclaim_options, - int *swappiness); -extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem, - gfp_t gfp_mask, bool noswap, - pg_data_t *pgdat, - unsigned long *nr_scanned); extern unsigned long shrink_all_memory(unsigned long nr_pages); extern int vm_swappiness; long remove_mapping(struct address_space *mapping, struct folio *folio); @@ -389,11 +332,6 @@ static inline void reclaim_unregister_node(struct node= *node) } #endif /* CONFIG_SYSFS && CONFIG_NUMA */ =20 -#ifdef CONFIG_NUMA -extern int sysctl_min_unmapped_ratio; -extern int sysctl_min_slab_ratio; -#endif - void check_move_unevictable_folios(struct folio_batch *fbatch); =20 extern void __meminit kswapd_run(int nid); @@ -553,7 +491,7 @@ static inline int mem_cgroup_swappiness(struct mem_cgro= up *memcg) =20 void lru_reparent_memcg(struct mem_cgroup *memcg, struct mem_cgroup *paren= t, int nid); #else -static inline int mem_cgroup_swappiness(struct mem_cgroup *mem) +static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg) { return READ_ONCE(vm_swappiness); } diff --git a/mm/internal.h b/mm/internal.h index 5602393054f3..22c0c5c666ed 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -24,6 +24,71 @@ =20 struct folio_batch; =20 +bool workingset_test_recent(void *shadow, bool file, bool *workingset, + bool flush); +void workingset_age_nonresident(struct lruvec *lruvec, unsigned long nr_pa= ges); +void *workingset_eviction(struct folio *folio, + struct mem_cgroup *target_memcg); +void workingset_refault(struct folio *folio, void *shadow); +void workingset_activation(struct folio *folio); + +void lru_note_cost_unlock_irq(struct lruvec *lruvec, bool file, + unsigned int nr_io, unsigned int nr_rotated) + __releases(lruvec->lru_lock); +void lru_note_cost_refault(struct folio *folio); +void folio_add_lru_vma(struct folio *folio, struct vm_area_struct *vma); + +static inline bool folio_may_be_lru_cached(struct folio *folio) +{ + /* + * Holding PMD-sized folios in per-CPU LRU cache unbalances accounting. + * Holding small numbers of low-order mTHP folios in per-CPU LRU cache + * will be sensible, but nobody has implemented and tested that yet. + */ + return !folio_test_large(folio); +} + +static inline void lru_cache_enable(void) +{ + atomic_dec(&lru_disable_count); +} + +void lru_cache_disable(void); +void lru_add_drain(void); +void lru_add_drain_cpu(int cpu); +void lru_add_drain_cpu_zone(struct zone *zone); +void folio_deactivate(struct folio *folio); +void folio_mark_lazyfree(struct folio *folio); + +unsigned long zone_reclaimable_pages(struct zone *zone); +unsigned long try_to_free_pages(struct zonelist *zonelist, int order, + gfp_t gfp_mask, nodemask_t *mask); +unsigned long lruvec_lru_size(struct lruvec *lruvec, enum lru_list lru, + int zone_idx); + +#define MEMCG_RECLAIM_MAY_SWAP (1 << 1) +#define MEMCG_RECLAIM_PROACTIVE (1 << 2) +#define MIN_SWAPPINESS 0 +#define MAX_SWAPPINESS 200 + +/* Just reclaim from anon folios in proactive memory reclaim */ +#define SWAPPINESS_ANON_ONLY (MAX_SWAPPINESS + 1) + +unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, + unsigned long nr_pages, + gfp_t gfp_mask, + unsigned int reclaim_options, + int *swappiness); +unsigned long mem_cgroup_shrink_node(struct mem_cgroup *memcg, + gfp_t gfp_mask, bool noswap, + pg_data_t *pgdat, + unsigned long *nr_scanned); + +#ifdef CONFIG_NUMA +extern int sysctl_min_unmapped_ratio; +extern int sysctl_min_slab_ratio; +#endif + /* * Maintains state across a page table move. The operation assumes both so= urce * and destination VMAs already exist and are specified by the user. diff --git a/mm/memfd.c b/mm/memfd.c index abe13b291ddc..6c72fe6caef7 100644 --- a/mm/memfd.c +++ b/mm/memfd.c @@ -19,6 +19,7 @@ #include #include #include +#include "internal.h" #include "swap.h" =20 /* --=20 2.43.0