diff options
author | Christoph Lameter <cl@linux.com> | 2012-05-09 11:09:58 -0400 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-06-01 02:25:41 -0400 |
commit | f6e7def7f7d749759e4bf36dcc25ae289a20d868 (patch) | |
tree | 6933c30c5b94e429f1c452c83dc91f4359c0c879 /mm/slub.c | |
parent | c17dda40a6a4ed95f035db38b7ba4fab0d99da44 (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.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -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; |
2225 | redo: | 2227 | redo: |
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: | |||
2264 | new_slab: | 2266 | new_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); |