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 --- mm/swapfile.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/mm/swapfile.c b/mm/swapfile.c index 517fa58f8022..3b10173cddc3 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -142,6 +143,8 @@ static DEFINE_PER_CPU(struct percpu_vswap_cluster, percpu_vswap_cluster) = { .lock = INIT_LOCAL_LOCK(), }; +static atomic_long_t vswap_alloc_reject = ATOMIC_LONG_INIT(0); + static bool vswap_alloc(struct folio *folio); static void vswap_mark_cache_only(struct swap_cluster_info *ci, unsigned int ci_off); @@ -1983,6 +1986,7 @@ static bool vswap_alloc(struct folio *folio) this_cpu_write(percpu_vswap_cluster.offset[order], SWAP_ENTRY_INVALID); local_unlock(&percpu_vswap_cluster.lock); + atomic_long_add(folio_nr_pages(folio), &vswap_alloc_reject); return false; } @@ -4795,9 +4799,25 @@ early_param("vswap", early_vswap); /* vswap does no IO on its own. */ static const struct swap_ops vswap_ops = { }; +static int vswap_used_get(void *data, u64 *val) +{ + *val = swap_usage_in_pages(vswap_si); + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(vswap_used_fops, vswap_used_get, NULL, "%llu\n"); + +static int vswap_alloc_reject_get(void *data, u64 *val) +{ + *val = atomic_long_read(&vswap_alloc_reject); + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(vswap_alloc_reject_fops, vswap_alloc_reject_get, NULL, + "%llu\n"); + static int __init vswap_init(void) { struct swap_info_struct *si; + struct dentry *root; unsigned long maxpages; int err; @@ -4841,6 +4861,12 @@ static int __init vswap_init(void) mutex_unlock(&swapon_mutex); vswap_si = si; + + root = debugfs_create_dir("vswap", NULL); + debugfs_create_file("used", 0444, root, NULL, &vswap_used_fops); + debugfs_create_file("alloc_reject", 0444, root, NULL, + &vswap_alloc_reject_fops); + pr_info("vswap: created virtual swap device (%lu pages)\n", maxpages); /* Last: everything above must be visible before routing starts. */ -- 2.53.0-Meta