mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
mm/slub: sort debugfs output by frequency of stack traces
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>
This commit is contained in:
parent
8ea9fb921b
commit
553c0369b3
16
mm/slub.c
16
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user