mm/slub: sort debugfs output by frequency of stack traces
authorOliver Glitta <glittao@gmail.com>
Fri, 21 May 2021 12:11:26 +0000 (14:11 +0200)
committerVlastimil Babka <vbabka@suse.cz>
Wed, 6 Apr 2022 09:09:32 +0000 (11:09 +0200)
Sort the output of debugfs alloc_traces and free_traces by the frequency
of allocation/freeing stack traces. Most frequently used stack traces
will be printed first, e.g. for easier memory leak debugging.

Signed-off-by: Oliver Glitta <glittao@gmail.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-and-tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Acked-by: David Rientjes <rientjes@google.com>
mm/slub.c

index f2e550e1adf081f1e955ff7c5b95e2223ae08d35..2963dc123336cc7826e4017da6553e8c4092777f 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -38,6 +38,7 @@
 #include <linux/memcontrol.h>
 #include <linux/random.h>
 #include <kunit/test.h>
+#include <linux/sort.h>
 
 #include <linux/debugfs.h>
 #include <trace/events/kmem.h>
@@ -6137,6 +6138,17 @@ static void *slab_debugfs_next(struct seq_file *seq, void *v, loff_t *ppos)
        return NULL;
 }
 
+static int cmp_loc_by_count(const void *a, const void *b, const void *data)
+{
+       struct location *loc1 = (struct location *)a;
+       struct location *loc2 = (struct location *)b;
+
+       if (loc1->count > loc2->count)
+               return -1;
+       else
+               return 1;
+}
+
 static void *slab_debugfs_start(struct seq_file *seq, loff_t *ppos)
 {
        struct loc_track *t = seq->private;
@@ -6198,6 +6210,10 @@ static int slab_debug_trace_open(struct inode *inode, struct file *filep)
                spin_unlock_irqrestore(&n->list_lock, flags);
        }
 
+       /* Sort locations by count */
+       sort_r(t->loc, t->count, sizeof(struct location),
+               cmp_loc_by_count, NULL, NULL);
+
        bitmap_free(obj_map);
        return 0;
 }