From: Oliver Glitta <glittao@xxxxxxxxx> Sort objects in slub cache by the frequency of stack trace used in object location in alloc_calls and free_calls implementation in debugfs. Most frequently used stack traces will be the first. Signed-off-by: Oliver Glitta <glittao@xxxxxxxxx> --- mm/slub.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mm/slub.c b/mm/slub.c index d5ed6ed7d68b..247983d647cd 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -37,6 +37,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> @@ -5893,6 +5894,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 kmem_cache_node *n; @@ -5944,6 +5956,11 @@ static void *slab_debugfs_start(struct seq_file *seq, loff_t *ppos) process_slab(&t, s, page, alloc); 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); + } if (*ppos < t.count) { -- 2.31.1.272.g89b43f80a5