[PATCH v3 09/11] mm, swap: add debugfs counters for vswap
Nhat Pham <[email protected]> Thu, 6 Aug 2026 11:42:52 -0700
| Newsgroups | org.kernel.vger.cgroups,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Add /sys/kernel/debug/vswap/ with two counters: * used: virtual swap slots (pages) currently allocated * alloc_reject: cumulative pages that failed to get a vswap slot Signed-off-by: Nhat Pham <[email protected]> --- mm/swapfile.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/mm/swapfile.c b/mm/swapfile.c index 1a2d9d9625fc..b4d7af21ca1c 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -7,6 +7,7 @@ */ #include <linux/blkdev.h> +#include <linux/debugfs.h> #include <linux/mm.h> #include <linux/sched/mm.h> #include <linux/sched/task.h> @@ -133,6 +134,9 @@ static DEFINE_PER_CPU(struct percpu_swap_cluster, percpu_swap_cluster) = { .lock = INIT_LOCAL_LOCK(), }; +static atomic_t __maybe_unused vswap_used = ATOMIC_INIT(0); +static atomic_t __maybe_unused vswap_alloc_reject = ATOMIC_INIT(0); + #ifdef CONFIG_VSWAP static int sysctl_vswap_enabled = IS_ENABLED(CONFIG_VSWAP_DEFAULT_ON); @@ -2056,11 +2060,13 @@ static bool vswap_alloc(struct folio *folio) if (folio_test_swapcache(folio)) { /* alloc_swap_scan_cluster updated percpu offset already */ local_unlock(&percpu_vswap_cluster.lock); + atomic_add(folio_nr_pages(folio), &vswap_used); return true; } this_cpu_write(percpu_vswap_cluster.offset[order], SWAP_ENTRY_INVALID); local_unlock(&percpu_vswap_cluster.lock); + atomic_add(folio_nr_pages(folio), &vswap_alloc_reject); return false; } #endif @@ -2665,8 +2671,10 @@ void __swap_cluster_free_entries(struct swap_info_struct *si, VM_WARN_ON(ci->count < nr_pages); - if (is_vswap) + if (is_vswap) { __vswap_release_backing(ci, ci_start, nr_pages); + atomic_sub(nr_pages, &vswap_used); + } ci->count -= nr_pages; do { @@ -4862,6 +4870,7 @@ static const struct ctl_table vswap_sysctls[] = { static int __init vswap_init(void) { struct swap_info_struct *si; + struct dentry *root; unsigned long maxpages; int err; @@ -4896,6 +4905,10 @@ static int __init vswap_init(void) register_sysctl_init("vm", vswap_sysctls); + root = debugfs_create_dir("vswap", NULL); + debugfs_create_atomic_t("used", 0444, root, &vswap_used); + debugfs_create_atomic_t("alloc_reject", 0444, root, &vswap_alloc_reject); + pr_info("vswap: created virtual swap device (%lu pages)\n", maxpages); return 0; -- 2.53.0-Meta