Make /proc/slabinfo use seq_list_xxx helpers
This entry prints a header in .start callback. This is OK, but the more elegant solution would be to move this into the .show callback and use seq_list_start_head() in .start one. I have left it as is in order to make the patch just switch to new API and noting more. [adobriyan@sw.ru: Wrong pointer was used as kmem_cache pointer] Signed-off-by: Pavel Emelianov <xemul@openvz.org> Cc: Christoph Lameter <clameter@sgi.com> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Signed-off-by: Alexey Dobriyan <adobriyan@sw.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
68e116a3b5
commit
b92151bab9
30
mm/slab.c
30
mm/slab.c
@@ -4157,26 +4157,17 @@ static void print_slabinfo_header(struct seq_file *m)
|
|||||||
static void *s_start(struct seq_file *m, loff_t *pos)
|
static void *s_start(struct seq_file *m, loff_t *pos)
|
||||||
{
|
{
|
||||||
loff_t n = *pos;
|
loff_t n = *pos;
|
||||||
struct list_head *p;
|
|
||||||
|
|
||||||
mutex_lock(&cache_chain_mutex);
|
mutex_lock(&cache_chain_mutex);
|
||||||
if (!n)
|
if (!n)
|
||||||
print_slabinfo_header(m);
|
print_slabinfo_header(m);
|
||||||
p = cache_chain.next;
|
|
||||||
while (n--) {
|
return seq_list_start(&cache_chain, *pos);
|
||||||
p = p->next;
|
|
||||||
if (p == &cache_chain)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return list_entry(p, struct kmem_cache, next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *s_next(struct seq_file *m, void *p, loff_t *pos)
|
static void *s_next(struct seq_file *m, void *p, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct kmem_cache *cachep = p;
|
return seq_list_next(p, &cache_chain, pos);
|
||||||
++*pos;
|
|
||||||
return cachep->next.next == &cache_chain ?
|
|
||||||
NULL : list_entry(cachep->next.next, struct kmem_cache, next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s_stop(struct seq_file *m, void *p)
|
static void s_stop(struct seq_file *m, void *p)
|
||||||
@@ -4186,7 +4177,7 @@ static void s_stop(struct seq_file *m, void *p)
|
|||||||
|
|
||||||
static int s_show(struct seq_file *m, void *p)
|
static int s_show(struct seq_file *m, void *p)
|
||||||
{
|
{
|
||||||
struct kmem_cache *cachep = p;
|
struct kmem_cache *cachep = list_entry(p, struct kmem_cache, next);
|
||||||
struct slab *slabp;
|
struct slab *slabp;
|
||||||
unsigned long active_objs;
|
unsigned long active_objs;
|
||||||
unsigned long num_objs;
|
unsigned long num_objs;
|
||||||
@@ -4355,17 +4346,8 @@ ssize_t slabinfo_write(struct file *file, const char __user * buffer,
|
|||||||
|
|
||||||
static void *leaks_start(struct seq_file *m, loff_t *pos)
|
static void *leaks_start(struct seq_file *m, loff_t *pos)
|
||||||
{
|
{
|
||||||
loff_t n = *pos;
|
|
||||||
struct list_head *p;
|
|
||||||
|
|
||||||
mutex_lock(&cache_chain_mutex);
|
mutex_lock(&cache_chain_mutex);
|
||||||
p = cache_chain.next;
|
return seq_list_start(&cache_chain, *pos);
|
||||||
while (n--) {
|
|
||||||
p = p->next;
|
|
||||||
if (p == &cache_chain)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return list_entry(p, struct kmem_cache, next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int add_caller(unsigned long *n, unsigned long v)
|
static inline int add_caller(unsigned long *n, unsigned long v)
|
||||||
@@ -4430,7 +4412,7 @@ static void show_symbol(struct seq_file *m, unsigned long address)
|
|||||||
|
|
||||||
static int leaks_show(struct seq_file *m, void *p)
|
static int leaks_show(struct seq_file *m, void *p)
|
||||||
{
|
{
|
||||||
struct kmem_cache *cachep = p;
|
struct kmem_cache *cachep = list_entry(p, struct kmem_cache, next);
|
||||||
struct slab *slabp;
|
struct slab *slabp;
|
||||||
struct kmem_list3 *l3;
|
struct kmem_list3 *l3;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
Reference in New Issue
Block a user