|
@@ -4277,7 +4277,7 @@ out:
|
|
|
|
|
|
#ifdef CONFIG_SLABINFO
|
|
|
|
|
|
-static void print_slabinfo_header(struct seq_file *m)
|
|
|
+void print_slabinfo_header(struct seq_file *m)
|
|
|
{
|
|
|
/*
|
|
|
* Output format version, so at least we can change it
|
|
@@ -4300,28 +4300,7 @@ static void print_slabinfo_header(struct seq_file *m)
|
|
|
seq_putc(m, '\n');
|
|
|
}
|
|
|
|
|
|
-static void *s_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);
|
|
|
-}
|
|
|
-
|
|
|
-static void *s_next(struct seq_file *m, void *p, loff_t *pos)
|
|
|
-{
|
|
|
- return seq_list_next(p, &slab_caches, pos);
|
|
|
-}
|
|
|
-
|
|
|
-static void s_stop(struct seq_file *m, void *p)
|
|
|
-{
|
|
|
- mutex_unlock(&slab_mutex);
|
|
|
-}
|
|
|
-
|
|
|
-static int s_show(struct seq_file *m, void *p)
|
|
|
+int slabinfo_show(struct seq_file *m, void *p)
|
|
|
{
|
|
|
struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);
|
|
|
struct slab *slabp;
|
|
@@ -4418,27 +4397,6 @@ static int s_show(struct seq_file *m, void *p)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * slabinfo_op - iterator that generates /proc/slabinfo
|
|
|
- *
|
|
|
- * Output layout:
|
|
|
- * cache-name
|
|
|
- * num-active-objs
|
|
|
- * total-objs
|
|
|
- * object size
|
|
|
- * num-active-slabs
|
|
|
- * total-slabs
|
|
|
- * num-pages-per-slab
|
|
|
- * + further values on SMP and with statistics enabled
|
|
|
- */
|
|
|
-
|
|
|
-static const struct seq_operations slabinfo_op = {
|
|
|
- .start = s_start,
|
|
|
- .next = s_next,
|
|
|
- .stop = s_stop,
|
|
|
- .show = s_show,
|
|
|
-};
|
|
|
-
|
|
|
#define MAX_SLABINFO_WRITE 128
|
|
|
/**
|
|
|
* slabinfo_write - Tuning for the slab allocator
|
|
@@ -4447,7 +4405,7 @@ static const struct seq_operations slabinfo_op = {
|
|
|
* @count: data length
|
|
|
* @ppos: unused
|
|
|
*/
|
|
|
-static ssize_t slabinfo_write(struct file *file, const char __user *buffer,
|
|
|
+ssize_t slabinfo_write(struct file *file, const char __user *buffer,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
char kbuf[MAX_SLABINFO_WRITE + 1], *tmp;
|
|
@@ -4490,19 +4448,6 @@ static ssize_t slabinfo_write(struct file *file, const char __user *buffer,
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-static int slabinfo_open(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- return seq_open(file, &slabinfo_op);
|
|
|
-}
|
|
|
-
|
|
|
-static const struct file_operations proc_slabinfo_operations = {
|
|
|
- .open = slabinfo_open,
|
|
|
- .read = seq_read,
|
|
|
- .write = slabinfo_write,
|
|
|
- .llseek = seq_lseek,
|
|
|
- .release = seq_release,
|
|
|
-};
|
|
|
-
|
|
|
#ifdef CONFIG_DEBUG_SLAB_LEAK
|
|
|
|
|
|
static void *leaks_start(struct seq_file *m, loff_t *pos)
|
|
@@ -4631,6 +4576,16 @@ static int leaks_show(struct seq_file *m, void *p)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void *s_next(struct seq_file *m, void *p, loff_t *pos)
|
|
|
+{
|
|
|
+ return seq_list_next(p, &slab_caches, pos);
|
|
|
+}
|
|
|
+
|
|
|
+static void s_stop(struct seq_file *m, void *p)
|
|
|
+{
|
|
|
+ mutex_unlock(&slab_mutex);
|
|
|
+}
|
|
|
+
|
|
|
static const struct seq_operations slabstats_op = {
|
|
|
.start = leaks_start,
|
|
|
.next = s_next,
|
|
@@ -4665,7 +4620,6 @@ static const struct file_operations proc_slabstats_operations = {
|
|
|
|
|
|
static int __init slab_proc_init(void)
|
|
|
{
|
|
|
- proc_create("slabinfo",S_IWUSR|S_IRUSR,NULL,&proc_slabinfo_operations);
|
|
|
#ifdef CONFIG_DEBUG_SLAB_LEAK
|
|
|
proc_create("slab_allocators", 0, NULL, &proc_slabstats_operations);
|
|
|
#endif
|