Thread (2 messages) 2 messages, 2 authors, 2008-08-12

Re: [PATCH 05/30] mm: slb: add knowledge of reserve pages

From: Peter Zijlstra <hidden>
Date: 2008-08-12 10:23:48
Also in: linux-mm, lkml

On Tue, 2008-08-12 at 19:35 +1000, Neil Brown wrote:
On Tuesday August 12, a.p.zijlstra@chello.nl wrote:
quoted
On Tue, 2008-08-12 at 15:35 +1000, Neil Brown wrote:
quoted
On Thursday July 24, a.p.zijlstra@chello.nl wrote:
quoted
Restrict objects from reserve slabs (ALLOC_NO_WATERMARKS) to allocation
contexts that are entitled to it. This is done to ensure reserve pages don't
leak out and get consumed.
This looks good (we are still missing slob though, aren't we :-( )
I actually have that now, just needs some testing..
Cool!
quoted
quoted
quoted
@@ -1526,7 +1540,7 @@ load_freelist:
 	object = c->page->freelist;
 	if (unlikely(!object))
 		goto another_slab;
-	if (unlikely(SLABDEBUG && PageSlubDebug(c->page)))
+	if (unlikely(PageSlubDebug(c->page) || c->reserve))
 		goto debug;
This looks suspiciously like debugging code that you have left in.
Is it??
Its not, we need to force slub into the debug slow path when we have a
reserve page, otherwise we cannot do the permission check on each
allocation.
I see.... a little.  I'm trying to avoid understanding slub too
deeply, I don't want to use up valuable brain cell :-)
:-)
Would we be justified in changing the label from 'debug:' to
'slow_path:'  or something?  
Could do I guess.

Index: linux-2.6/mm/slub.c
===================================================================
--- linux-2.6.orig/mm/slub.c
+++ linux-2.6/mm/slub.c
@@ -1543,7 +1543,7 @@ load_freelist:
 	if (unlikely(!object))
 		goto another_slab;
 	if (unlikely(PageSlubDebug(c->page) || c->reserve))
-		goto debug;
+		goto slow_path;
 
 	c->freelist = object[c->offset];
 	c->page->inuse = c->page->objects;
@@ -1586,11 +1586,21 @@ grow_slab:
 		goto load_freelist;
 	}
 	return NULL;
-debug:
+
+slow_path:
 	if (PageSlubDebug(c->page) &&
 			!alloc_debug_processing(s, c->page, object, addr))
 		goto another_slab;
 
+	/*
+	 * Avoid the slub fast path in slab_alloc by not setting
+	 * c->freelist and the fast path in slab_fere by making 
+	 * node_match() fail by setting c->node to -1.
+	 *
+	 * We use this for for debug checks and reserve handling,
+	 * which needs to do permission checks on each allocation.
+	 */
+
 	c->page->inuse++;
 	c->page->freelist = object[c->offset];
 	c->node = -1;

And if it is just c->reserve, should
we avoid the call to alloc_debug_processing?
We already do:

	if (PageSlubDebug(c->page) &&
			!alloc_debug_processing(s, c->page, object, addr))
		goto another_slab;

since in that case PageSlubDebug() will be false.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help