linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] slub: reduce overhead of slub_debug
@ 2011-06-26 19:39 Marcin Slusarz
  2011-06-28 19:32 ` Christoph Lameter
  2011-07-07 18:07 ` Pekka Enberg
  0 siblings, 2 replies; 22+ messages in thread
From: Marcin Slusarz @ 2011-06-26 19:39 UTC (permalink / raw)
  To: Christoph Lameter, Pekka Enberg, Matt Mackall; +Cc: LKML, linux-mm

slub checks for poison one byte by one, which is highly inefficient
and shows up frequently as a highest cpu-eater in perf top.

Joining reads gives nice speedup:

(Compiling some project with different options)
                                 make -j12    make clean
slub_debug disabled:             1m 27s       1.2 s
slub_debug enabled:              1m 46s       7.6 s
slub_debug enabled + this patch: 1m 33s       3.2 s

check_bytes still shows up high, but not always at the top.

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Matt Mackall <mpm@selenic.com>
Cc: linux-mm@kvack.org
---
 mm/slub.c |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/mm/slub.c b/mm/slub.c
index 35f351f..a40ef2d 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -557,10 +557,10 @@ static void init_object(struct kmem_cache *s, void *object, u8 val)
 		memset(p + s->objsize, val, s->inuse - s->objsize);
 }
 
-static u8 *check_bytes(u8 *start, unsigned int value, unsigned int bytes)
+static u8 *check_bytes8(u8 *start, u8 value, unsigned int bytes)
 {
 	while (bytes) {
-		if (*start != (u8)value)
+		if (*start != value)
 			return start;
 		start++;
 		bytes--;
@@ -568,6 +568,38 @@ static u8 *check_bytes(u8 *start, unsigned int value, unsigned int bytes)
 	return NULL;
 }
 
+static u8 *check_bytes(u8 *start, u8 value, unsigned int bytes)
+{
+	u64 value64;
+	unsigned int words, prefix;
+
+	if (bytes <= 16)
+		return check_bytes8(start, value, bytes);
+
+	value64 = value | value << 8 | value << 16 | value << 24;
+	value64 = value64 | value64 << 32;
+	prefix = 8 - ((unsigned long)start) % 8;
+
+	if (prefix) {
+		u8 *r = check_bytes8(start, value, prefix);
+		if (r)
+			return r;
+		start += prefix;
+		bytes -= prefix;
+	}
+
+	words = bytes / 8;
+
+	while (words) {
+		if (*(u64 *)start != value64)
+			return check_bytes8(start, value, 8);
+		start += 8;
+		words--;
+	}
+
+	return check_bytes8(start, value, bytes % 8);
+}
+
 static void restore_bytes(struct kmem_cache *s, char *message, u8 data,
 						void *from, void *to)
 {
-- 
1.7.5.3


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

end of thread, other threads:[~2011-07-08 17:41 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-26 19:39 [PATCH] slub: reduce overhead of slub_debug Marcin Slusarz
2011-06-28 19:32 ` Christoph Lameter
2011-06-28 19:40   ` David Daney
2011-06-28 20:58     ` David Rientjes
2011-06-28 21:04       ` Ben Greear
2011-06-28 21:10         ` David Rientjes
2011-06-28 21:16       ` Dave Jones
2011-07-07 18:07 ` Pekka Enberg
2011-07-07 18:17   ` Christoph Lameter
2011-07-07 18:30     ` Ben Greear
2011-07-07 18:42       ` Christoph Lameter
2011-07-07 18:54         ` Ben Greear
2011-07-07 18:30     ` Matt Mackall
2011-07-07 18:52     ` Pekka Enberg
2011-07-07 18:55       ` Matt Mackall
2011-07-07 19:12       ` Christoph Lameter
2011-07-07 19:21         ` David Miller
2011-07-07 19:49           ` Pekka Enberg
2011-07-07 20:12             ` Christoph Lameter
2011-07-08  5:23               ` Andi Kleen
2011-07-08 17:41                 ` Christoph Lameter
2011-07-08  5:38               ` Pekka Enberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).