From nobody Mon Jun 8 08:43:55 2026 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.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 B29323264D8 for ; Sun, 31 May 2026 09:50:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780221037; cv=none; b=lhLHvAEhyWrgAmzEEdE1xgnWy51EqgWJx6/E4rzwKetRQx0tS6Fs3umhCntBx+5OsL9VWeqe5g8/JNlCm3iXqEW3ULoPhCi//hVqlilJbxs4kxQ6/NLjUnfkgGtTCGOS15w5hREUUoJK1a/SbsMvPWDpb3t1HxFsLwjGcb7Ia/g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780221037; c=relaxed/simple; bh=mrLUFkBnloVBveovWs5O1t+cMXGXSZ2wC8mpkOA5Deo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G+5GPyIThRGqLXTouICvIaZGgdtFU8wi0TidhhemtXnmQumIWDg+rtRA68dofh2y+23nOTKijkuzQgu2lK0onHPw3F6KvTvZQY54e9XWWf2Yy0PxJbmzsonyY9zsK59RrMQ3aokMVEG+KTVK6x0QZQ/KpnM9ghXu2Uqx6QsaAVE= 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=A9jag1g+; arc=none smtp.client-ip=209.85.216.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="A9jag1g+" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-36b9d265355so1701008a91.2 for ; Sun, 31 May 2026 02:50:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780221035; x=1780825835; 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=47mSNDa+DAxlZzYzP+q0XqpUS8vT2CNeajfZ7L+3/l0=; b=A9jag1g+25CFyPaGsfo4fOw0D9lpnYGKwnUog+FX+7IYbGguvgha2Hmf9ECK+pLzKX UFxqmQVmrNVTDz6YRRzpkz+lxfVLJHwSL+zLMj4e2cNHaaax0pC5Oo/jRRzNMud7FzyO zcGyuGVc+0sYiQtl2/HNj8f1CHMuQa/XFVsOPJdj3xPVS/YlcKdyxLgYOc2pa1M+tivm 1TgXc3bZboJTdPVUnnpdVHJwPsStPKbiTbFe71lWl2gTges9lHO+y4IzJSY/Pkq3lgWA j2ptgCr008LT+r0c27RrqBOUEPZ4rzUxkR6AIYAZPVZeiumdwYbs9zplr38CkO/I9kL7 UEtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780221035; x=1780825835; 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=47mSNDa+DAxlZzYzP+q0XqpUS8vT2CNeajfZ7L+3/l0=; b=iT/hydFxnW7GtsnwgGTdUjHDURCOHHzFzd0EyiyvbpL4+AHohpKyOR9PD+uEqAt6u1 g2MgXOKFUsjb+fp4ROTeclSzHxUONHCytAF5DibwDKVu6w8cnCVTyC0cTAfq7N5Ndv+D izQ1W3ppndnsZ4yzdpcg4EBq6NbEukeUkut+YjZ0D3W9986nXX9D9WgOSIrwHWkDmN9B Jqxayfoh4P5iqDLFtpJdkAZkzkzGQtXuYYafGR7OGD3wbU2Cp06zkIdlnedwHIgztVy2 uYAJg/kGTWPc8clX1mrrZeC0QOIg1VsP+Y5crRvu4UHZcyB6hK2E4qt1y7uDv+f2iktE FtVg== X-Forwarded-Encrypted: i=1; AFNElJ/l5PVQdxE9t+qeEictr5nN67RfmmOwucZnr4zsQD/vy2I+XU87EfAuA5jlVIsbVoLPuTOC1FTmY3eHZxc=@vger.kernel.org X-Gm-Message-State: AOJu0YwwCzFLz/xk/CIzCaovyCuoQ21iaQymFNzQHv2+nYMUSSfG0sDU eQ2rgllllMLFQjiivBbdDFDfa4DQVXANR854gJJdN2XgP4vETRjH1b/b X-Gm-Gg: Acq92OH+9wxRZeYaOLImmAh/6MZW7elCTVSYBzcdVSOxDVlc2H4aOWE2LCRHBH40BoE NzG1jvcK6W3uFw0BJRx/dMMyyQR8LFBIPl5ZgODIZiorgBkLfYGufiXWh0a7CQRs+CtH0J6oee4 bjMnTM3Fv5LjwCoYPsczG8Xg7N8PqzcMXlOpISVsiv2B4OC0AFwHim7Z/OwB3GiSbpyC/E4U9MP KFodfgW1R7qcgaUWiUxhOswQyBaeCjh7AJ5/YWQ6Zyzp8PL6uiHIa2Mwx+39QXm8bAT141hbwb7 29v9nkzpY5AFi6l6FYZkzt9SyQUhGkuz7zBzZvy3YTSbRe334Fe1aW/yJ6s5a0sm15VG3VXdLLT 4vsvC6oGWA484X3j9J8MRLdK5BdJqyLoQwZ9k96doi11i6CYjYOsXxgTDb+f/dnLVB7bhPWyDXW ezSkooIXq1TYWpBgUPTFbXzNU8bezYhibzIod5GkZbshwaq3JHTG0BFLRIKfEwOBf0peYme4jhD AZklcDzOw== X-Received: by 2002:a17:90b:5443:b0:369:946d:32fa with SMTP id 98e67ed59e1d1-36c4fefb47bmr6435201a91.5.1780221034839; Sun, 31 May 2026 02:50:34 -0700 (PDT) Received: from NV-J4GCB44.localdomain ([103.74.125.162]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36bbdb5c91bsm4372219a91.1.2026.05.31.02.50.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 May 2026 02:50:33 -0700 (PDT) From: Jianyue Wu Date: Sun, 31 May 2026 17:50:13 +0800 Subject: [PATCH v2 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: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-1-1b9a4ac255b4@gmail.com> References: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-0-1b9a4ac255b4@gmail.com> In-Reply-To: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-0-1b9a4ac255b4@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 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. Signed-off-by: Jianyue Wu --- include/linux/swap.h | 2 +- mm/swap.c | 36 ------------------------------------ mm/swap.h | 2 -- mm/swap_state.c | 37 +++++++++++++++++++++++++++++++++++++ mm/vmscan.c | 2 +- 5 files changed, 39 insertions(+), 40 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 636d94108166..c36f72877e8b 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -345,7 +345,7 @@ 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); +extern void swap_readahead_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..1a9b42440320 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) 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 08:43:55 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 5C9102D3A7C for ; Sun, 31 May 2026 09:50:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780221045; cv=none; b=geregIQ29FVrl9KuiBShSI4QW/X6yCDA6Zir665n1fsl/6ScrC/OswycyK0+XgQCr6JXYi8vKdYiwk/aWzpeq7ACaP0Sxh0/lUOgSxe+/LsyrEyGv63EwCN0aN0wSv8EFzwvRAhvWsPL/taJ9S3Wwy/V8lntLa8WLpuLVw6TRw0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780221045; c=relaxed/simple; bh=RNoSQjSus0yb6nKZWJk4Cv5AXKOv64+4tsgvbBDrRfk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AmJepeZ0WO2QD5T6TceZd4OggoW1HSNCNF63s6qciqkFHTWrclwmSIDuG1lKDXH6L+ct7YePpodfxK3dGHsG7ffyOM0zynnDf8bNXKNjUckI8TRTmO81ASnFst12R4e2GMFSe9xzNW/qu1gU/Rr6R4qpxOE72xAou7+Twc9cNDY= 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=AgsSCS/j; arc=none smtp.client-ip=209.85.216.41 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="AgsSCS/j" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-36ad15213fbso4189338a91.0 for ; Sun, 31 May 2026 02:50:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780221042; x=1780825842; 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=MYJjTakWZ9sz9GAtKp2FZMaIOD3c7y309pQDk163j98=; b=AgsSCS/jwhM1rl0BGDiIf0SupF83VKpUvtQwDXurDBv5fbRKUlc01Dse/6rsZW4IEC eSEAHXc/pd1daU3VE5+MZbCe0vm82RmCECW53Djh3BRK/nKa5pPS5uiyRYGJcwXep+v6 Kzoxf54z1sHi2/4Empj207iqw4RmCkGQZfg8nZRvhbCEQ/mMWFA+GQlXzlOj3sco8t06 lPrV2WnlByGD3F+ampDSA2OxX50JL1zbzWm+1SNrN2mutR/ekCCDGydgPdGca25UKABq RDTgKupk8tbau63sp/xGE51rTav08T6DZffiQdHrmRi33EPEW8CHFFsWb+a/Vlg73Kxo Eiaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780221042; x=1780825842; 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=MYJjTakWZ9sz9GAtKp2FZMaIOD3c7y309pQDk163j98=; b=m8aRrK7epXFV4VT4AHSeAjmE5KZeTCswhcHwfBns22DLCtE/whJOCuCkPIYlyRC8Yv rHsP/J7Q829bzcEHL8aYu5dgMb4a0cUCEU3nc6LV0wJJsSvjusmkakznBskWJeioo2x2 P7x8cEZ0b8RY/lanh6SAfMZ0Tr5d4N5nrhy6dBoqApVAmwg/uOYkdgBBMOaIGv1tS3mQ WP+RpNg+oQX2YieCbXEqdMvKpragu3WT6ACmRI/Hd5fdm8qHKBBgfJ38KIwjNznIb3yG cyx1+2TUZKz2RRFKnDxclLNIPH6JZB/RDB/nEd6UvnrH01CqFt/9iDc2s2khtg6yBlfl nE4Q== X-Forwarded-Encrypted: i=1; AFNElJ+ny4VhiM3AXv50YKUalGiAItzFh9X5+PSL6kyalF0TwS30MU8QDzkYcfgjSw6Sk86lLYDWkr+qdRjoBRk=@vger.kernel.org X-Gm-Message-State: AOJu0YzhaFIac4T7IvbWmWsTM0E+3ewrAcwKXX0PfY9MlsNEFIQk6B0S AF5LWSzY4ahQ3tQmrvyh3ZlF5cZa6XX7glrYFkGQyr/uESQOFxqmM2L+ X-Gm-Gg: Acq92OEogHREUMXX/ggHDfSAixVZsi0ycH3u42YV++sa1XTPf8H6IX6+98zETEjWLkE E0d6a1yPrPZwqgK25+wtuAbilXRoEYV8YiKLuH8/Cn+PZGVOIcH7PB2PVKA1lstDOTMGBmzGfvc dFleInYe4Tml/ZZTDmc8EOBlNKCM/4zOn9wntZU/UaLhh2jI7lPeWf+IvOoq0MuGiCg8XcS0Ypv qxhtPQag7xL1B4tGMhtZkCNeGrZsi3rjj9B1srrB3f8T17YbyhJ0PmmfgdZ6DgJFwWSJDFEYV+2 6kplG4Ko0MVxJlfd3ZfIceLYl7FPIHNSxj+1pN00trVlKzl7zGamq4MNiiUd42l2zBkWF0C4QNT 4mT3DSWZdNhx0tEMIcuD2d2L8AzlnObtgIRaN8Xgqf93UywScm9M64NqrUGjn3cLg7vRBBIJ5pH baTT/rG7rfOggwu2M+sg9/zfiWGxDiYFxP14n+BDvKCm8g+S+3SnlOxWrDl8wyRVL+swKLyYCJf 3Jv6b6Q/A== X-Received: by 2002:a17:90b:1881:b0:368:6a6e:94dd with SMTP id 98e67ed59e1d1-36c681958f3mr4345464a91.24.1780221042546; Sun, 31 May 2026 02:50:42 -0700 (PDT) Received: from NV-J4GCB44.localdomain ([103.74.125.162]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36bbdb5c91bsm4372219a91.1.2026.05.31.02.50.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 May 2026 02:50:42 -0700 (PDT) From: Jianyue Wu Date: Sun, 31 May 2026 17:50:14 +0800 Subject: [PATCH v2 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: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-2-1b9a4ac255b4@gmail.com> References: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-0-1b9a4ac255b4@gmail.com> In-Reply-To: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-0-1b9a4ac255b4@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 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. Signed-off-by: Jianyue Wu --- mm/Makefile | 2 +- mm/{swap.c =3D> folio_lru.c} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 08:43:55 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (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 756B527EFF7 for ; Sun, 31 May 2026 09:50:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780221053; cv=none; b=maGOf/6xpXejV63HPLRZCcH1W55eDJpTBIG1AYTZNcygu2+NanjX+TTpT4DRHggas/cSLCYc+Xl4uJCnd9tDtxhr71kn5wSwfs6WRTUDfZ09Zm6PnXST+lc+QSDiCs4mEq2+C6TvR7vcRMZqPlB5cMMdp6/TVsYONEEAsNlKP+s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780221053; c=relaxed/simple; bh=wl36bziMhz4oxIOmdieabY9BbLIgQluYK7Dpzyd/5B8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rmtL6nkZuU/IW95mR3BABGbm3ln1M2HROHjiIzWVqBG3Zb28uj2fb/AY983R8xvELK8icvTF/Xp2TZeD89jcjHtlMqwTqp46Dr0HCAAB3NfeD+3vxV5lLGNJNWWDzksoJn2Z/xuUQeir+WaFhF/ayRY/pKchFv7/h+bLp0gu2ik= 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=i/WNM1wu; arc=none smtp.client-ip=209.85.216.51 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="i/WNM1wu" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-36d630c0e35so855009a91.3 for ; Sun, 31 May 2026 02:50:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780221052; x=1780825852; 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=A4xPP1QwcL7O0fsqTypMQBaoMq59XzA16L4IQtLI0jM=; b=i/WNM1wufP87k84qa9e3WjPkq1zpRCSTnDD4EqvEDE11cblCJ3/Ta3z/1WjgWOk6Xf 6VbMYISSXlbR2952AkC/q0HSak3JTDftftl/FreoOROa1MQ3I/Mxi4/Y1K2IWuo3XfR0 78y2NQ3FL+0TbNzkBqpQ8Sces3qY3OBCEAlzh/T5i0v+Pp/SQxtrQgODcQPvtfSgBBLy GHeTqmsTaaX3n2MPdM4vfl0TXbrT3y6nDDTYhQbrJoGQ7XEUe1t0xHSsSQbiTRL3GP0/ /rduFKtNXgR0IEeXX2aMJJnAt/87xELHjUixpxKFbEt4yy4p0pN5cgTpPinmziu+BKcQ CtrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780221052; x=1780825852; 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=A4xPP1QwcL7O0fsqTypMQBaoMq59XzA16L4IQtLI0jM=; b=eU6uVGPnoz5hTn1wV2hFCHUHrLkGNmxKM/jbwdffaM6VMT7pbr6qFhoCkno5GpW4pt QxrtF9oRjw+/YqE7zVxcFt3V8E3HU8T0sMMLdw/61wGtOVhQXnlzaCRs97o72sOWFYZz GtvZay74+WAIF6lBUT2Ta+l3v1P6vaiyAo5/kv/8LPzpzFDrOIblfrhoQrONQd/CmrfE /QA1d0hhEcXagB9ynL+bTjlJNp8gIR6zGwrXPoGk5pIRzHifUHwPGT70x/AwS0obnwGV oZfXuy9561BhJ78DpXSVGZffBUVM0qqk0IVa18pVSK8dnup4tqqxqm1116yvntn+VNWF zeTw== X-Forwarded-Encrypted: i=1; AFNElJ+1/Mv5UDjWAoLRgyv8O7RAsqna299gg9Ik1GgyT/RvKw5AYs6ulsA4vkmTp0GaNi6eSk3HuqZPNjsCLyE=@vger.kernel.org X-Gm-Message-State: AOJu0YzG5V7V0u21cXuLkvmhL2GYHB3w/5H/ThGLhL7D0I/YIh50lze+ zdCtda3QFTshusPZWJIgiGusXK2NeB4r5hb4s2xluYX4BRoeCmxvXZFm X-Gm-Gg: Acq92OHEyW5rhkvByBTKWL+gPI7o4YxkAO/nhce/7GPlhMk7Xcm/PyDqhx9BrqDqUny SZ4sJbFa4gChVL+pbzLLwEFQ8DQPpzwR2IqJby0q7oejN7pKFgaxEDYGddxtiUELkCcOszA/Cq3 hUGjqDKtSfyjd4u+T1BjGoIBDkGhkgma6f3sn/kSzmrTw4hBibujrImk7Cic/qGQfdLX9M2CTyu uP6IM8yBq5i14FC3yZRNj0vtLefIdtOmqZfrp/mwysdyKGk+uakdX71G7KLozrmHHy15bv2RxJD 5QM8Pi/OABXlDvRmbBw9U/HlGAQWxc6R9LGGe3jv7csDUbHT/jyBx/Uhnwmeq7BtOkzGKP2RCMX CJ+LSdICCdsnRcOShZTOLTaFfBD35TZtMQ6g2L3p6rd7isSCr4+jlDI129qV8eECGUpOs+J5igC mtGMyGUduJ6+WVuH8M+plzBvIwowB0kZX7EHwcg0fD6l2gFfTK8Shh71EChCiIgpLEpWElBgRbU rG/9M4ctQ== X-Received: by 2002:a17:90b:5184:b0:36b:8824:d7cc with SMTP id 98e67ed59e1d1-36c501efef2mr5684731a91.20.1780221051694; Sun, 31 May 2026 02:50:51 -0700 (PDT) Received: from NV-J4GCB44.localdomain ([103.74.125.162]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36bbdb5c91bsm4372219a91.1.2026.05.31.02.50.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 May 2026 02:50:49 -0700 (PDT) From: Jianyue Wu Date: Sun, 31 May 2026 17:50:15 +0800 Subject: [PATCH v2 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: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-3-1b9a4ac255b4@gmail.com> References: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-0-1b9a4ac255b4@gmail.com> In-Reply-To: <20260531-ch-swap-series-plus-folio-lru-cleanup-v2-0-1b9a4ac255b4@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 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/. Signed-off-by: Jianyue Wu --- include/linux/swap.h | 75 +++++-------------------------------------------= ---- mm/internal.h | 66 +++++++++++++++++++++++++++++++++++++++++++++ mm/memfd.c | 1 + 3 files changed, 73 insertions(+), 69 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index c36f72877e8b..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,43 +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); -extern void swap_readahead_setup(void); - /* 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); @@ -390,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); @@ -554,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..5475ba38a621 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -24,6 +24,72 @@ =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); +void swap_readahead_setup(void); + +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