Skip to content

Commit

Permalink
slab: print slabinfo header in seq show
Browse files Browse the repository at this point in the history
Currently we print the slabinfo header in the seq start method, which
makes it unusable for showing leaks, so we have leaks_show, which does
practically the same as s_show except it doesn't show the header.

However, we can print the header in the seq show method - we only need
to check if the current element is the first on the list.  This will
allow us to use the same set of seq iterators for both leaks and
slabinfo reporting, which is nice.

Signed-off-by: Vladimir Davydov <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Pekka Enberg <[email protected]>
Cc: David Rientjes <[email protected]>
Cc: Joonsoo Kim <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Michal Hocko <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Vladimir Davydov authored and torvalds committed Dec 11, 2014
1 parent b455def commit 1df3b26
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 16 deletions.
8 changes: 1 addition & 7 deletions mm/slab.c
Original file line number Diff line number Diff line change
Expand Up @@ -4043,12 +4043,6 @@ ssize_t slabinfo_write(struct file *file, const char __user *buffer,

#ifdef CONFIG_DEBUG_SLAB_LEAK

static void *leaks_start(struct seq_file *m, loff_t *pos)
{
mutex_lock(&slab_mutex);
return seq_list_start(&slab_caches, *pos);
}

static inline int add_caller(unsigned long *n, unsigned long v)
{
unsigned long *p;
Expand Down Expand Up @@ -4170,7 +4164,7 @@ static int leaks_show(struct seq_file *m, void *p)
}

static const struct seq_operations slabstats_op = {
.start = leaks_start,
.start = slab_start,
.next = slab_next,
.stop = slab_stop,
.show = leaks_show,
Expand Down
1 change: 1 addition & 0 deletions mm/slab.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@ static inline struct kmem_cache_node *get_node(struct kmem_cache *s, int node)

#endif

void *slab_start(struct seq_file *m, loff_t *pos);
void *slab_next(struct seq_file *m, void *p, loff_t *pos);
void slab_stop(struct seq_file *m, void *p);

Expand Down
15 changes: 6 additions & 9 deletions mm/slab_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -834,14 +834,9 @@ void print_slabinfo_header(struct seq_file *m)
seq_putc(m, '\n');
}

static void *s_start(struct seq_file *m, loff_t *pos)
void *slab_start(struct seq_file *m, loff_t *pos)
{
loff_t n = *pos;

mutex_lock(&slab_mutex);
if (!n)
print_slabinfo_header(m);

return seq_list_start(&slab_caches, *pos);
}

Expand Down Expand Up @@ -903,10 +898,12 @@ int cache_show(struct kmem_cache *s, struct seq_file *m)
return 0;
}

static int s_show(struct seq_file *m, void *p)
static int slab_show(struct seq_file *m, void *p)
{
struct kmem_cache *s = list_entry(p, struct kmem_cache, list);

if (p == slab_caches.next)
print_slabinfo_header(m);
if (!is_root_cache(s))
return 0;
return cache_show(s, m);
Expand All @@ -926,10 +923,10 @@ static int s_show(struct seq_file *m, void *p)
* + further values on SMP and with statistics enabled
*/
static const struct seq_operations slabinfo_op = {
.start = s_start,
.start = slab_start,
.next = slab_next,
.stop = slab_stop,
.show = s_show,
.show = slab_show,
};

static int slabinfo_open(struct inode *inode, struct file *file)
Expand Down

0 comments on commit 1df3b26

Please sign in to comment.