linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] move slabinfo processing to common code
@ 2012-09-27 14:37 Glauber Costa
  2012-09-27 14:37 ` [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c Glauber Costa
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Glauber Costa @ 2012-09-27 14:37 UTC (permalink / raw)
  To: linux-mm
  Cc: linux-kernel, Andrew Morton, Pekka Enberg, David Rientjes,
	Christoph Lameter

Hi,

This patch moves on with the slab caches commonization, by moving
the slabinfo processing to common code in slab_common.c. It only touches
slub and slab, since slob doesn't create that file, which is protected
by a Kconfig switch.

Enjoy,

Glauber Costa (4):
  move slabinfo processing to slab_common.c
  move print_slabinfo_header to slab_common.c
  slub: move slub internal functions to its header
  sl[au]b: process slabinfo_show in common code

 include/linux/slab_def.h |  10 ++++
 include/linux/slub_def.h |  25 ++++++++++
 mm/slab.c                | 116 ++++++++++-------------------------------------
 mm/slab.h                |  16 +++++++
 mm/slab_common.c         | 109 ++++++++++++++++++++++++++++++++++++++++++++
 mm/slub.c                |  89 ++++--------------------------------
 6 files changed, 193 insertions(+), 172 deletions(-)

-- 
1.7.11.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c
  2012-09-27 14:37 [PATCH 0/4] move slabinfo processing to common code Glauber Costa
@ 2012-09-27 14:37 ` Glauber Costa
  2012-09-27 14:50   ` Christoph Lameter
  2012-09-27 14:37 ` [PATCH 2/4] sl[au]b: move print_slabinfo_header " Glauber Costa
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Glauber Costa @ 2012-09-27 14:37 UTC (permalink / raw)
  To: linux-mm
  Cc: linux-kernel, Andrew Morton, Pekka Enberg, David Rientjes,
	Christoph Lameter, Glauber Costa, Pekka Enberg

This patch moves all the common machinery to slabinfo processing
to slab_common.c. We can do better by noticing that the output is
heavily common, and having the allocators to just provide finished
information about this. But after this first step, this can be done
easier.

Signed-off-by: Glauber Costa <glommer@parallels.com>
CC: Christoph Lameter <cl@linux.com>
CC: Pekka Enberg <penberg@cs.helsinki.fi>
CC: David Rientjes <rientjes@google.com>
---
 mm/slab.c        | 72 ++++++++++----------------------------------------------
 mm/slab.h        |  6 +++++
 mm/slab_common.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mm/slub.c        | 51 ++++-----------------------------------
 4 files changed, 94 insertions(+), 105 deletions(-)

diff --git a/mm/slab.c b/mm/slab.c
index 8524923..9502dfc 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -4284,7 +4284,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
@@ -4307,28 +4307,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;
@@ -4425,27 +4404,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
@@ -4454,7 +4412,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;
@@ -4497,19 +4455,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)
@@ -4638,6 +4583,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,
@@ -4672,7 +4627,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
diff --git a/mm/slab.h b/mm/slab.h
index 7deeb44..ac0053f6 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -47,4 +47,10 @@ static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t siz
 
 int __kmem_cache_shutdown(struct kmem_cache *);
 
+void print_slabinfo_header(struct seq_file *m);
+
+int slabinfo_show(struct seq_file *m, void *p);
+
+ssize_t slabinfo_write(struct file *file, const char __user *buffer,
+		       size_t count, loff_t *ppos);
 #endif
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 9c21725..2e0061a 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -13,6 +13,8 @@
 #include <linux/module.h>
 #include <linux/cpu.h>
 #include <linux/uaccess.h>
+#include <linux/seq_file.h>
+#include <linux/proc_fs.h>
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
 #include <asm/page.h>
@@ -189,3 +191,71 @@ int slab_is_available(void)
 {
 	return slab_state >= UP;
 }
+
+#ifdef CONFIG_SLABINFO
+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)
+{
+	return slabinfo_show(m, p);
+}
+
+/*
+ * 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,
+};
+
+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,
+};
+
+static int __init slab_proc_init(void)
+{
+	proc_create("slabinfo", S_IRUSR, NULL, &proc_slabinfo_operations);
+	return 0;
+}
+module_init(slab_proc_init);
+#endif /* CONFIG_SLABINFO */
diff --git a/mm/slub.c b/mm/slub.c
index 2258ed8..6383622 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5392,7 +5392,7 @@ __initcall(slab_sysfs_init);
  * The /proc/slabinfo ABI
  */
 #ifdef CONFIG_SLABINFO
-static void print_slabinfo_header(struct seq_file *m)
+void print_slabinfo_header(struct seq_file *m)
 {
 	seq_puts(m, "slabinfo - version: 2.1\n");
 	seq_puts(m, "# name            <active_objs> <num_objs> <object_size> "
@@ -5402,28 +5402,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)
 {
 	unsigned long nr_partials = 0;
 	unsigned long nr_slabs = 0;
@@ -5459,29 +5438,9 @@ static int s_show(struct seq_file *m, void *p)
 	return 0;
 }
 
-static const struct seq_operations slabinfo_op = {
-	.start = s_start,
-	.next = s_next,
-	.stop = s_stop,
-	.show = s_show,
-};
-
-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,
-	.llseek		= seq_lseek,
-	.release	= seq_release,
-};
-
-static int __init slab_proc_init(void)
+ssize_t slabinfo_write(struct file *file, const char __user *buffer,
+		       size_t count, loff_t *ppos)
 {
-	proc_create("slabinfo", S_IRUSR, NULL, &proc_slabinfo_operations);
-	return 0;
+	return -EIO;
 }
-module_init(slab_proc_init);
 #endif /* CONFIG_SLABINFO */
-- 
1.7.11.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 2/4] sl[au]b: move print_slabinfo_header to slab_common.c
  2012-09-27 14:37 [PATCH 0/4] move slabinfo processing to common code Glauber Costa
  2012-09-27 14:37 ` [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c Glauber Costa
@ 2012-09-27 14:37 ` Glauber Costa
  2012-09-27 14:51   ` Christoph Lameter
  2012-09-27 14:37 ` [PATCH 3/4] slub: move slub internal functions to its header Glauber Costa
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Glauber Costa @ 2012-09-27 14:37 UTC (permalink / raw)
  To: linux-mm
  Cc: linux-kernel, Andrew Morton, Pekka Enberg, David Rientjes,
	Christoph Lameter, Glauber Costa, Pekka Enberg

The header format is highly similar between slab and slub. The main
difference lays in the fact that slab may optionally have statistics
added here in case of CONFIG_SLAB_DEBUG, while the slub will stick them
somewhere else.

By making sure that information conditionally lives inside a
globally-visible CONFIG_DEBUG_SLAB switch, we can move the header
printing to a common location.

Signed-off-by: Glauber Costa <glommer@parallels.com>
CC: Christoph Lameter <cl@linux.com>
CC: Pekka Enberg <penberg@cs.helsinki.fi>
CC: David Rientjes <rientjes@google.com>
---
 mm/slab.c        | 24 ------------------------
 mm/slab.h        |  2 --
 mm/slab_common.c | 23 +++++++++++++++++++++++
 mm/slub.c        | 10 ----------
 4 files changed, 23 insertions(+), 36 deletions(-)

diff --git a/mm/slab.c b/mm/slab.c
index 9502dfc..a3de3e5 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -4283,30 +4283,6 @@ out:
 }
 
 #ifdef CONFIG_SLABINFO
-
-void print_slabinfo_header(struct seq_file *m)
-{
-	/*
-	 * Output format version, so at least we can change it
-	 * without _too_ many complaints.
-	 */
-#if STATS
-	seq_puts(m, "slabinfo - version: 2.1 (statistics)\n");
-#else
-	seq_puts(m, "slabinfo - version: 2.1\n");
-#endif
-	seq_puts(m, "# name            <active_objs> <num_objs> <objsize> "
-		 "<objperslab> <pagesperslab>");
-	seq_puts(m, " : tunables <limit> <batchcount> <sharedfactor>");
-	seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
-#if STATS
-	seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> "
-		 "<error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>");
-	seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>");
-#endif
-	seq_putc(m, '\n');
-}
-
 int slabinfo_show(struct seq_file *m, void *p)
 {
 	struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);
diff --git a/mm/slab.h b/mm/slab.h
index ac0053f6..45b75c8 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -47,8 +47,6 @@ static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t siz
 
 int __kmem_cache_shutdown(struct kmem_cache *);
 
-void print_slabinfo_header(struct seq_file *m);
-
 int slabinfo_show(struct seq_file *m, void *p);
 
 ssize_t slabinfo_write(struct file *file, const char __user *buffer,
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 2e0061a..1bde24a 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -193,6 +193,29 @@ int slab_is_available(void)
 }
 
 #ifdef CONFIG_SLABINFO
+void print_slabinfo_header(struct seq_file *m)
+{
+	/*
+	 * Output format version, so at least we can change it
+	 * without _too_ many complaints.
+	 */
+#ifdef CONFIG_DEBUG_SLAB
+	seq_puts(m, "slabinfo - version: 2.1 (statistics)\n");
+#else
+	seq_puts(m, "slabinfo - version: 2.1\n");
+#endif
+	seq_puts(m, "# name            <active_objs> <num_objs> <objsize> "
+		 "<objperslab> <pagesperslab>");
+	seq_puts(m, " : tunables <limit> <batchcount> <sharedfactor>");
+	seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
+#ifdef CONFIG_DEBUG_SLAB
+	seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> "
+		 "<error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>");
+	seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>");
+#endif
+	seq_putc(m, '\n');
+}
+
 static void *s_start(struct seq_file *m, loff_t *pos)
 {
 	loff_t n = *pos;
diff --git a/mm/slub.c b/mm/slub.c
index 6383622..4c2c092 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5392,16 +5392,6 @@ __initcall(slab_sysfs_init);
  * The /proc/slabinfo ABI
  */
 #ifdef CONFIG_SLABINFO
-void print_slabinfo_header(struct seq_file *m)
-{
-	seq_puts(m, "slabinfo - version: 2.1\n");
-	seq_puts(m, "# name            <active_objs> <num_objs> <object_size> "
-		 "<objperslab> <pagesperslab>");
-	seq_puts(m, " : tunables <limit> <batchcount> <sharedfactor>");
-	seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
-	seq_putc(m, '\n');
-}
-
 int slabinfo_show(struct seq_file *m, void *p)
 {
 	unsigned long nr_partials = 0;
-- 
1.7.11.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 3/4] slub: move slub internal functions to its header
  2012-09-27 14:37 [PATCH 0/4] move slabinfo processing to common code Glauber Costa
  2012-09-27 14:37 ` [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c Glauber Costa
  2012-09-27 14:37 ` [PATCH 2/4] sl[au]b: move print_slabinfo_header " Glauber Costa
@ 2012-09-27 14:37 ` Glauber Costa
  2012-09-27 14:53   ` Christoph Lameter
  2012-09-27 14:37 ` [PATCH 4/4] sl[au]b: process slabinfo_show in common code Glauber Costa
  2012-09-27 14:48 ` [PATCH 0/4] move slabinfo processing to " Christoph Lameter
  4 siblings, 1 reply; 12+ messages in thread
From: Glauber Costa @ 2012-09-27 14:37 UTC (permalink / raw)
  To: linux-mm
  Cc: linux-kernel, Andrew Morton, Pekka Enberg, David Rientjes,
	Christoph Lameter, Glauber Costa, Pekka Enberg

The functions oo_order() and oo_objects() are used by the slub to
determine respectively the order of a candidate allocation, and the
number of objects made available from it. I would like a stable visible
location outside slub.c so it can be acessed from slab_common.c.

I considered also just making it a common field between slub and slab,
but decided to move those to slub_def.h due to two main reasons: first,
it still deals with implementation specific details of the caches, so it
is better to just use wrappers. Second, because it is not necessarily
the order determined at cache creation time, but possibly a smaller
order in case of a retry. When we use it in slab_common.c we will be
talking about "base" values, but those functions would still have to
exist inside slub, so doing this we can just reuse them.

Signed-off-by: Glauber Costa <glommer@parallels.com>
CC: Christoph Lameter <cl@linux.com>
CC: Pekka Enberg <penberg@cs.helsinki.fi>
CC: David Rientjes <rientjes@google.com>
---
 include/linux/slub_def.h | 14 ++++++++++++++
 mm/slub.c                | 14 --------------
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index df448ad..f1590c9 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -73,6 +73,20 @@ struct kmem_cache_order_objects {
 	unsigned long x;
 };
 
+#define OO_SHIFT	16
+#define OO_MASK		((1 << OO_SHIFT) - 1)
+#define MAX_OBJS_PER_PAGE	32767 /* since page.objects is u15 */
+
+static inline int oo_order(struct kmem_cache_order_objects x)
+{
+	return x.x >> OO_SHIFT;
+}
+
+static inline int oo_objects(struct kmem_cache_order_objects x)
+{
+	return x.x & OO_MASK;
+}
+
 /*
  * Slab cache management.
  */
diff --git a/mm/slub.c b/mm/slub.c
index 4c2c092..9e72722 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -171,10 +171,6 @@ static inline int kmem_cache_debug(struct kmem_cache *s)
 #define SLUB_MERGE_SAME (SLAB_DEBUG_FREE | SLAB_RECLAIM_ACCOUNT | \
 		SLAB_CACHE_DMA | SLAB_NOTRACK)
 
-#define OO_SHIFT	16
-#define OO_MASK		((1 << OO_SHIFT) - 1)
-#define MAX_OBJS_PER_PAGE	32767 /* since page.objects is u15 */
-
 /* Internal SLUB flags */
 #define __OBJECT_POISON		0x80000000UL /* Poison object */
 #define __CMPXCHG_DOUBLE	0x40000000UL /* Use cmpxchg_double */
@@ -325,16 +321,6 @@ static inline struct kmem_cache_order_objects oo_make(int order,
 	return x;
 }
 
-static inline int oo_order(struct kmem_cache_order_objects x)
-{
-	return x.x >> OO_SHIFT;
-}
-
-static inline int oo_objects(struct kmem_cache_order_objects x)
-{
-	return x.x & OO_MASK;
-}
-
 /*
  * Per slab locking using the pagelock
  */
-- 
1.7.11.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 4/4] sl[au]b: process slabinfo_show in common code
  2012-09-27 14:37 [PATCH 0/4] move slabinfo processing to common code Glauber Costa
                   ` (2 preceding siblings ...)
  2012-09-27 14:37 ` [PATCH 3/4] slub: move slub internal functions to its header Glauber Costa
@ 2012-09-27 14:37 ` Glauber Costa
  2012-09-27 15:07   ` Christoph Lameter
  2012-09-27 14:48 ` [PATCH 0/4] move slabinfo processing to " Christoph Lameter
  4 siblings, 1 reply; 12+ messages in thread
From: Glauber Costa @ 2012-09-27 14:37 UTC (permalink / raw)
  To: linux-mm
  Cc: linux-kernel, Andrew Morton, Pekka Enberg, David Rientjes,
	Christoph Lameter, Glauber Costa, Pekka Enberg

With all the infrastructure in place, we can now have slabinfo_show
done from slab_common.c. A cache-specific function is called to grab
information about the cache itself, since that is still heavily
dependent on the implementation. But with the values produced by it, all
the printing and handling is done from common code.

Signed-off-by: Glauber Costa <glommer@parallels.com>
CC: Christoph Lameter <cl@linux.com>
CC: Pekka Enberg <penberg@cs.helsinki.fi>
CC: David Rientjes <rientjes@google.com>
---
 include/linux/slab_def.h | 10 ++++++++++
 include/linux/slub_def.h | 11 +++++++++++
 mm/slab.c                | 24 +++++++++++++-----------
 mm/slab.h                | 14 +++++++++++++-
 mm/slab_common.c         | 18 +++++++++++++++++-
 mm/slub.c                | 22 ++++++++--------------
 6 files changed, 72 insertions(+), 27 deletions(-)

diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h
index 36d7031..384cf17 100644
--- a/include/linux/slab_def.h
+++ b/include/linux/slab_def.h
@@ -97,6 +97,16 @@ struct kmem_cache {
 	 */
 };
 
+static inline int cache_order(struct kmem_cache *s)
+{
+	return s->gfporder;
+}
+
+static inline int objects_per_slab(struct kmem_cache *s)
+{
+	return s->num;
+}
+
 /* Size description struct for general caches. */
 struct cache_sizes {
 	size_t		 	cs_size;
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index f1590c9..668b9f1 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -125,6 +125,17 @@ struct kmem_cache {
 	struct kmem_cache_node *node[MAX_NUMNODES];
 };
 
+static inline int cache_order(struct kmem_cache *s)
+{
+	return oo_order(s->oo);
+}
+
+static inline int objects_per_slab(struct kmem_cache *s)
+{
+	return oo_objects(s->oo);
+}
+
+
 /*
  * Kmalloc subsystem.
  */
diff --git a/mm/slab.c b/mm/slab.c
index a3de3e5..1781150 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -4283,9 +4283,8 @@ out:
 }
 
 #ifdef CONFIG_SLABINFO
-int slabinfo_show(struct seq_file *m, void *p)
+void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
 {
-	struct kmem_cache *cachep = list_entry(p, struct kmem_cache, list);
 	struct slab *slabp;
 	unsigned long active_objs;
 	unsigned long num_objs;
@@ -4340,13 +4339,18 @@ int slabinfo_show(struct seq_file *m, void *p)
 	if (error)
 		printk(KERN_ERR "slab: cache %s error: %s\n", name, error);
 
-	seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
-		   name, active_objs, num_objs, cachep->size,
-		   cachep->num, (1 << cachep->gfporder));
-	seq_printf(m, " : tunables %4u %4u %4u",
-		   cachep->limit, cachep->batchcount, cachep->shared);
-	seq_printf(m, " : slabdata %6lu %6lu %6lu",
-		   active_slabs, num_slabs, shared_avail);
+	sinfo->active_objs = active_objs;
+	sinfo->num_objs = num_objs;
+	sinfo->active_slabs = active_slabs;
+	sinfo->num_slabs = num_slabs;
+	sinfo->shared_avail = shared_avail;
+	sinfo->limit = cachep->limit;
+	sinfo->batchcount = cachep->batchcount;
+	sinfo->shared = cachep->shared;
+}
+
+void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep)
+{
 #if STATS
 	{			/* list3 stats */
 		unsigned long high = cachep->high_mark;
@@ -4376,8 +4380,6 @@ int slabinfo_show(struct seq_file *m, void *p)
 			   allochit, allocmiss, freehit, freemiss);
 	}
 #endif
-	seq_putc(m, '\n');
-	return 0;
 }
 
 #define MAX_SLABINFO_WRITE 128
diff --git a/mm/slab.h b/mm/slab.h
index 45b75c8..763f019 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -47,8 +47,20 @@ static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t siz
 
 int __kmem_cache_shutdown(struct kmem_cache *);
 
-int slabinfo_show(struct seq_file *m, void *p);
+struct slabinfo {
+	unsigned long active_objs;
+	unsigned long num_objs;
+	unsigned long active_slabs;
+	unsigned long num_slabs;
+	unsigned long shared_avail;
+	unsigned int limit;
+	unsigned int batchcount;
+	unsigned int shared;
 
+};
+
+void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo);
+void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s);
 ssize_t slabinfo_write(struct file *file, const char __user *buffer,
 		       size_t count, loff_t *ppos);
 #endif
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 1bde24a..89db427 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -239,7 +239,23 @@ static void s_stop(struct seq_file *m, void *p)
 
 static int s_show(struct seq_file *m, void *p)
 {
-	return slabinfo_show(m, p);
+	struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
+	struct slabinfo sinfo;
+
+	memset(&sinfo, 0, sizeof(sinfo));
+	get_slabinfo(s, &sinfo);
+
+	seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
+		   s->name, sinfo.active_objs, sinfo.num_objs, s->size,
+		   objects_per_slab(s), (1 << cache_order(s)));
+
+	seq_printf(m, " : tunables %4u %4u %4u",
+		   sinfo.limit, sinfo.batchcount, sinfo.shared);
+	seq_printf(m, " : slabdata %6lu %6lu %6lu",
+		   sinfo.active_slabs, sinfo.num_slabs, sinfo.shared_avail);
+	slabinfo_show_stats(m, s);
+	seq_putc(m, '\n');
+	return 0;
 }
 
 /*
diff --git a/mm/slub.c b/mm/slub.c
index 9e72722..d01cb9a 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5378,18 +5378,14 @@ __initcall(slab_sysfs_init);
  * The /proc/slabinfo ABI
  */
 #ifdef CONFIG_SLABINFO
-int slabinfo_show(struct seq_file *m, void *p)
+void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo)
 {
 	unsigned long nr_partials = 0;
 	unsigned long nr_slabs = 0;
-	unsigned long nr_inuse = 0;
 	unsigned long nr_objs = 0;
 	unsigned long nr_free = 0;
-	struct kmem_cache *s;
 	int node;
 
-	s = list_entry(p, struct kmem_cache, list);
-
 	for_each_online_node(node) {
 		struct kmem_cache_node *n = get_node(s, node);
 
@@ -5402,16 +5398,14 @@ int slabinfo_show(struct seq_file *m, void *p)
 		nr_free += count_partial(n, count_free);
 	}
 
-	nr_inuse = nr_objs - nr_free;
+	sinfo->active_objs = nr_objs - nr_free;
+	sinfo->num_objs = nr_objs;
+	sinfo->active_slabs = nr_slabs;
+	sinfo->num_slabs = nr_slabs;
+}
 
-	seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d", s->name, nr_inuse,
-		   nr_objs, s->size, oo_objects(s->oo),
-		   (1 << oo_order(s->oo)));
-	seq_printf(m, " : tunables %4u %4u %4u", 0, 0, 0);
-	seq_printf(m, " : slabdata %6lu %6lu %6lu", nr_slabs, nr_slabs,
-		   0UL);
-	seq_putc(m, '\n');
-	return 0;
+void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s)
+{
 }
 
 ssize_t slabinfo_write(struct file *file, const char __user *buffer,
-- 
1.7.11.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/4] move slabinfo processing to common code
  2012-09-27 14:37 [PATCH 0/4] move slabinfo processing to common code Glauber Costa
                   ` (3 preceding siblings ...)
  2012-09-27 14:37 ` [PATCH 4/4] sl[au]b: process slabinfo_show in common code Glauber Costa
@ 2012-09-27 14:48 ` Christoph Lameter
  4 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2012-09-27 14:48 UTC (permalink / raw)
  To: Glauber Costa
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg, David Rientjes

On Thu, 27 Sep 2012, Glauber Costa wrote:

> This patch moves on with the slab caches commonization, by moving
> the slabinfo processing to common code in slab_common.c. It only touches
> slub and slab, since slob doesn't create that file, which is protected
> by a Kconfig switch.

Thanks. That was also something on my todo list.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c
  2012-09-27 14:37 ` [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c Glauber Costa
@ 2012-09-27 14:50   ` Christoph Lameter
  0 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2012-09-27 14:50 UTC (permalink / raw)
  To: Glauber Costa
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg,
	David Rientjes, Pekka Enberg

On Thu, 27 Sep 2012, Glauber Costa wrote:

> This patch moves all the common machinery to slabinfo processing
> to slab_common.c. We can do better by noticing that the output is
> heavily common, and having the allocators to just provide finished
> information about this. But after this first step, this can be done
> easier.

Acked-by: Christoph Lameter <cl@linux.com>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/4] sl[au]b: move print_slabinfo_header to slab_common.c
  2012-09-27 14:37 ` [PATCH 2/4] sl[au]b: move print_slabinfo_header " Glauber Costa
@ 2012-09-27 14:51   ` Christoph Lameter
  0 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2012-09-27 14:51 UTC (permalink / raw)
  To: Glauber Costa
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg,
	David Rientjes, Pekka Enberg

On Thu, 27 Sep 2012, Glauber Costa wrote:

> By making sure that information conditionally lives inside a
> globally-visible CONFIG_DEBUG_SLAB switch, we can move the header
> printing to a common location.

Acked-by: Christoph Lameter <cl@linux.com>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] slub: move slub internal functions to its header
  2012-09-27 14:37 ` [PATCH 3/4] slub: move slub internal functions to its header Glauber Costa
@ 2012-09-27 14:53   ` Christoph Lameter
  0 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2012-09-27 14:53 UTC (permalink / raw)
  To: Glauber Costa
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg,
	David Rientjes, Pekka Enberg

On Thu, 27 Sep 2012, Glauber Costa wrote:

> The functions oo_order() and oo_objects() are used by the slub to
> determine respectively the order of a candidate allocation, and the
> number of objects made available from it. I would like a stable visible
> location outside slub.c so it can be acessed from slab_common.c.

Patch looks okay but it worries me that we export this internal stuff.

Acked-by: Christoph Lameter <cl@linux.com>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/4] sl[au]b: process slabinfo_show in common code
  2012-09-27 14:37 ` [PATCH 4/4] sl[au]b: process slabinfo_show in common code Glauber Costa
@ 2012-09-27 15:07   ` Christoph Lameter
  2012-09-27 16:38     ` Glauber Costa
  0 siblings, 1 reply; 12+ messages in thread
From: Christoph Lameter @ 2012-09-27 15:07 UTC (permalink / raw)
  To: Glauber Costa
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg,
	David Rientjes, Pekka Enberg

On Thu, 27 Sep 2012, Glauber Costa wrote:

> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -239,7 +239,23 @@ static void s_stop(struct seq_file *m, void *p)
>
>  static int s_show(struct seq_file *m, void *p)
>  {
> -	return slabinfo_show(m, p);
> +	struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
> +	struct slabinfo sinfo;
> +
> +	memset(&sinfo, 0, sizeof(sinfo));
> +	get_slabinfo(s, &sinfo);

Could get_slabinfo() also set the objects per slab etc in some additional
field in struct slabinfo? Then we can avoid the exporting of the oo_
functions and we do not need the cache_order() etc functions.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/4] sl[au]b: process slabinfo_show in common code
  2012-09-27 15:07   ` Christoph Lameter
@ 2012-09-27 16:38     ` Glauber Costa
  2012-09-27 17:53       ` Christoph Lameter
  0 siblings, 1 reply; 12+ messages in thread
From: Glauber Costa @ 2012-09-27 16:38 UTC (permalink / raw)
  To: Christoph Lameter
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg,
	David Rientjes, Pekka Enberg

On 09/27/2012 07:07 PM, Christoph Lameter wrote:
> On Thu, 27 Sep 2012, Glauber Costa wrote:
> 
>> --- a/mm/slab_common.c
>> +++ b/mm/slab_common.c
>> @@ -239,7 +239,23 @@ static void s_stop(struct seq_file *m, void *p)
>>
>>  static int s_show(struct seq_file *m, void *p)
>>  {
>> -	return slabinfo_show(m, p);
>> +	struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
>> +	struct slabinfo sinfo;
>> +
>> +	memset(&sinfo, 0, sizeof(sinfo));
>> +	get_slabinfo(s, &sinfo);
> 
> Could get_slabinfo() also set the objects per slab etc in some additional
> field in struct slabinfo? Then we can avoid the exporting of the oo_
> functions and we do not need the cache_order() etc functions.
> 
Yes. As a matter of fact, I first implemented it this way, and later
switched. I was anticipating that people would be likely to point out
that those properties are directly derivable from the caches, and it
would be better to just get them from there.

I am more than happy to stick them in the slabinfo struct.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/4] sl[au]b: process slabinfo_show in common code
  2012-09-27 16:38     ` Glauber Costa
@ 2012-09-27 17:53       ` Christoph Lameter
  0 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2012-09-27 17:53 UTC (permalink / raw)
  To: Glauber Costa
  Cc: linux-mm, linux-kernel, Andrew Morton, Pekka Enberg,
	David Rientjes, Pekka Enberg

On Thu, 27 Sep 2012, Glauber Costa wrote:

> Yes. As a matter of fact, I first implemented it this way, and later
> switched. I was anticipating that people would be likely to point out
> that those properties are directly derivable from the caches, and it
> would be better to just get them from there.

That is not the case if the information is packet as in the case of SLUB.

SLOB (which at some point also could be supported) has an altogether
different way of arranging objects in pagbes.


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-09-27 17:53 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-27 14:37 [PATCH 0/4] move slabinfo processing to common code Glauber Costa
2012-09-27 14:37 ` [PATCH 1/4] sl[au]b: move slabinfo processing to slab_common.c Glauber Costa
2012-09-27 14:50   ` Christoph Lameter
2012-09-27 14:37 ` [PATCH 2/4] sl[au]b: move print_slabinfo_header " Glauber Costa
2012-09-27 14:51   ` Christoph Lameter
2012-09-27 14:37 ` [PATCH 3/4] slub: move slub internal functions to its header Glauber Costa
2012-09-27 14:53   ` Christoph Lameter
2012-09-27 14:37 ` [PATCH 4/4] sl[au]b: process slabinfo_show in common code Glauber Costa
2012-09-27 15:07   ` Christoph Lameter
2012-09-27 16:38     ` Glauber Costa
2012-09-27 17:53       ` Christoph Lameter
2012-09-27 14:48 ` [PATCH 0/4] move slabinfo processing to " Christoph Lameter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox