In prepration for the implementation of swap virtualization, add new scaffolds for the new code: a new mm/vswap.c source file, which currently only holds the logic to set up the (for now, empty) vswap debugfs directory. Hook this up in the swap setup step in mm/swap_state.c, and set up vswap compilation in the Makefile. Other than the debugfs directory, no behavioral change intended. Finally, make Johannes a swap reviewer, given that he has contributed majorly to the developments of virtual swap. Signed-off-by: Nhat Pham --- MAINTAINERS | 2 ++ include/linux/swap.h | 3 +++ mm/Makefile | 2 +- mm/swap_state.c | 6 ++++++ mm/vswap.c | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 mm/vswap.c diff --git a/MAINTAINERS b/MAINTAINERS index d3780bb330378..042dbc06c3d3c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16728,6 +16728,7 @@ R: Kemeng Shi R: Nhat Pham R: Baoquan He R: Barry Song +R: Johannes Weiner L: linux-mm@kvack.org S: Maintained F: include/linux/swap.h @@ -16739,6 +16740,7 @@ F: mm/swap.h F: mm/swap_table.h F: mm/swap_state.c F: mm/swapfile.c +F: mm/vswap.c MEMORY MANAGEMENT - THP (TRANSPARENT HUGE PAGE) M: Andrew Morton diff --git a/include/linux/swap.h b/include/linux/swap.h index 918b47da55f44..df0771903a952 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -423,6 +423,9 @@ extern void __meminit kswapd_stop(int nid); #ifdef CONFIG_SWAP +/* Virtual swap space API (mm/vswap.c) */ +int vswap_init(void); + /* Lifecycle swap API (mm/swapfile.c) */ int folio_alloc_swap(struct folio *folio); bool folio_free_swap(struct folio *folio); diff --git a/mm/Makefile b/mm/Makefile index 2d0570a16e5be..67fa4586e7e18 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -75,7 +75,7 @@ ifdef CONFIG_MMU obj-$(CONFIG_ADVISE_SYSCALLS) += madvise.o endif -obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o +obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o vswap.o obj-$(CONFIG_ZSWAP) += zswap.o obj-$(CONFIG_HAS_DMA) += dmapool.o obj-$(CONFIG_HUGETLBFS) += hugetlb.o hugetlb_sysfs.o hugetlb_sysctl.o diff --git a/mm/swap_state.c b/mm/swap_state.c index e2e9f55bea3bb..29ec666be4204 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -882,6 +882,12 @@ static int __init swap_init(void) int err; struct kobject *swap_kobj; + err = vswap_init(); + if (err) { + pr_err("failed to initialize virtual swap space\n"); + return err; + } + swap_kobj = kobject_create_and_add("swap", mm_kobj); if (!swap_kobj) { pr_err("failed to create swap kobject\n"); diff --git a/mm/vswap.c b/mm/vswap.c new file mode 100644 index 0000000000000..e68234f053fc9 --- /dev/null +++ b/mm/vswap.c @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Virtual swap space + * + * Copyright (C) 2024 Meta Platforms, Inc., Nhat Pham + */ +#include + +#ifdef CONFIG_DEBUG_FS +#include + +static struct dentry *vswap_debugfs_root; + +static int vswap_debug_fs_init(void) +{ + if (!debugfs_initialized()) + return -ENODEV; + + vswap_debugfs_root = debugfs_create_dir("vswap", NULL); + return 0; +} +#else +static int vswap_debug_fs_init(void) +{ + return 0; +} +#endif + +int vswap_init(void) +{ + if (vswap_debug_fs_init()) + pr_warn("Failed to initialize vswap debugfs\n"); + + return 0; +} -- 2.52.0