summaryrefslogtreecommitdiffstats
path: root/mm/slub.c
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2012-05-09 11:09:58 -0400
committerPekka Enberg <penberg@kernel.org>2012-06-01 02:25:41 -0400
commitf6e7def7f7d749759e4bf36dcc25ae289a20d868 (patch)
tree6933c30c5b94e429f1c452c83dc91f4359c0c879 /mm/slub.c
parentc17dda40a6a4ed95f035db38b7ba4fab0d99da44 (diff)
slub: Use page variable instead of c->page.
Store the value of c->page to avoid additional fetches from per cpu data. Acked-by: David Rientjes <rientjes@google.com> Signed-off-by: Christoph Lameter <cl@linux.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'mm/slub.c')
-rw-r--r--mm/slub.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 2389a016577e..6b60fc907a71 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2208,6 +2208,7 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
2208 unsigned long addr, struct kmem_cache_cpu *c) 2208 unsigned long addr, struct kmem_cache_cpu *c)
2209{ 2209{
2210 void *freelist; 2210 void *freelist;
2211 struct page *page;
2211 unsigned long flags; 2212 unsigned long flags;
2212 2213
2213 local_irq_save(flags); 2214 local_irq_save(flags);
@@ -2220,13 +2221,14 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
2220 c = this_cpu_ptr(s->cpu_slab); 2221 c = this_cpu_ptr(s->cpu_slab);
2221#endif 2222#endif
2222 2223
2223 if (!c->page) 2224 page = c->page;
2225 if (!page)
2224 goto new_slab; 2226 goto new_slab;
2225redo: 2227redo:
2226 2228
2227 if (unlikely(!node_match(c, node))) { 2229 if (unlikely(!node_match(c, node))) {
2228 stat(s, ALLOC_NODE_MISMATCH); 2230 stat(s, ALLOC_NODE_MISMATCH);
2229 deactivate_slab(s, c->page, c->freelist); 2231 deactivate_slab(s, page, c->freelist);
2230 c->page = NULL; 2232 c->page = NULL;
2231 c->freelist = NULL; 2233 c->freelist = NULL;
2232 goto new_slab; 2234 goto new_slab;
@@ -2239,7 +2241,7 @@ redo:
2239 2241
2240 stat(s, ALLOC_SLOWPATH); 2242 stat(s, ALLOC_SLOWPATH);
2241 2243
2242 freelist = get_freelist(s, c->page); 2244 freelist = get_freelist(s, page);
2243 2245
2244 if (!freelist) { 2246 if (!freelist) {
2245 c->page = NULL; 2247 c->page = NULL;
@@ -2264,8 +2266,8 @@ load_freelist:
2264new_slab: 2266new_slab:
2265 2267
2266 if (c->partial) { 2268 if (c->partial) {
2267 c->page = c->partial; 2269 page = c->page = c->partial;
2268 c->partial = c->page->next; 2270 c->partial = page->next;
2269 stat(s, CPU_PARTIAL_ALLOC); 2271 stat(s, CPU_PARTIAL_ALLOC);
2270 c->freelist = NULL; 2272 c->freelist = NULL;
2271 goto redo; 2273 goto redo;
@@ -2281,14 +2283,15 @@ new_slab:
2281 return NULL; 2283 return NULL;
2282 } 2284 }
2283 2285
2286 page = c->page;
2284 if (likely(!kmem_cache_debug(s))) 2287 if (likely(!kmem_cache_debug(s)))
2285 goto load_freelist; 2288 goto load_freelist;
2286 2289
2287 /* Only entered in the debug case */ 2290 /* Only entered in the debug case */
2288 if (!alloc_debug_processing(s, c->page, freelist, addr)) 2291 if (!alloc_debug_processing(s, page, freelist, addr))
2289 goto new_slab; /* Slab failed checks. Next slab needed */ 2292 goto new_slab; /* Slab failed checks. Next slab needed */
2290 2293
2291 deactivate_slab(s, c->page, get_freepointer(s, freelist)); 2294 deactivate_slab(s, page, get_freepointer(s, freelist));
2292 c->page = NULL; 2295 c->page = NULL;
2293 c->freelist = NULL; 2296 c->freelist = NULL;
2294 local_irq_restore(flags); 2297 local_irq_restore(flags);