mm,page_owner: filter out stacks by a threshold
authorOscar Salvador <osalvador@suse.de>
Thu, 15 Feb 2024 21:59:06 +0000 (22:59 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 24 Feb 2024 01:48:17 +0000 (17:48 -0800)
We want to be able to filter out the stacks based on a threshold we can
can tune.  By writing to 'count_threshold' file, we can adjust the
threshold value.

Link: https://lkml.kernel.org/r/20240215215907.20121-7-osalvador@suse.de
Signed-off-by: Oscar Salvador <osalvador@suse.de>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Marco Elver <elver@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page_owner.c

index e99fbf822dd69348ba4fdaed7f0bb8444b66ca22..e56c1e92eccf5a7ccb0919543dae21a5f9429c5f 100644 (file)
@@ -846,6 +846,8 @@ static void *stack_next(struct seq_file *m, void *v, loff_t *ppos)
        return stack;
 }
 
+static unsigned long page_owner_stack_threshold;
+
 static int stack_print(struct seq_file *m, void *v)
 {
        int i, stack_count;
@@ -858,7 +860,8 @@ static int stack_print(struct seq_file *m, void *v)
        entries = stack_record->entries;
        stack_count = refcount_read(&stack_record->count) - 1;
 
-       if (!nr_entries || nr_entries < 0 || stack_count < 1)
+       if (!nr_entries || nr_entries < 0 || stack_count < 1 ||
+           stack_count < page_owner_stack_threshold)
                return 0;
 
        for (i = 0; i < nr_entries; i++)
@@ -891,6 +894,22 @@ static const struct file_operations page_owner_stack_operations = {
        .release        = seq_release,
 };
 
+static int page_owner_threshold_get(void *data, u64 *val)
+{
+       *val = READ_ONCE(page_owner_stack_threshold);
+       return 0;
+}
+
+static int page_owner_threshold_set(void *data, u64 val)
+{
+       WRITE_ONCE(page_owner_stack_threshold, val);
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(proc_page_owner_threshold, &page_owner_threshold_get,
+                       &page_owner_threshold_set, "%llu");
+
+
 static int __init pageowner_init(void)
 {
        struct dentry *dir;
@@ -905,6 +924,8 @@ static int __init pageowner_init(void)
        dir = debugfs_create_dir("page_owner_stacks", NULL);
        debugfs_create_file("show_stacks", 0400, dir, NULL,
                            &page_owner_stack_operations);
+       debugfs_create_file("count_threshold", 0600, dir, NULL,
+                           &proc_page_owner_threshold);
 
        return 0;
 }