slub: Get rid of the node field

The node field is always page_to_nid(c->page). So its rather easy to
replace. Note that there maybe slightly more overhead in various hot paths
due to the need to shift the bits from page->flags. However, that is mostly
compensated for by a smaller footprint of the kmem_cache_cpu structure (this
patch reduces that to 3 words per cache) which allows better caching.

Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
Christoph Lameter 2012-05-09 10:09:56 -05:00 committed by Pekka Enberg
parent 188fd06320
commit ec3ab083a7
2 changed files with 16 additions and 20 deletions

View file

@ -48,7 +48,6 @@ struct kmem_cache_cpu {
unsigned long tid; /* Globally unique transaction id */ unsigned long tid; /* Globally unique transaction id */
struct page *page; /* The slab from which we are allocating */ struct page *page; /* The slab from which we are allocating */
struct page *partial; /* Partially allocated frozen slabs */ struct page *partial; /* Partially allocated frozen slabs */
int node; /* The node of the page (or -1 for debug) */
#ifdef CONFIG_SLUB_STATS #ifdef CONFIG_SLUB_STATS
unsigned stat[NR_SLUB_STAT_ITEMS]; unsigned stat[NR_SLUB_STAT_ITEMS];
#endif #endif

View file

@ -1561,7 +1561,6 @@ static void *get_partial_node(struct kmem_cache *s,
if (!object) { if (!object) {
c->page = page; c->page = page;
c->node = page_to_nid(page);
stat(s, ALLOC_FROM_PARTIAL); stat(s, ALLOC_FROM_PARTIAL);
object = t; object = t;
available = page->objects - page->inuse; available = page->objects - page->inuse;
@ -2057,7 +2056,7 @@ static void flush_all(struct kmem_cache *s)
static inline int node_match(struct kmem_cache_cpu *c, int node) static inline int node_match(struct kmem_cache_cpu *c, int node)
{ {
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
if (node != NUMA_NO_NODE && c->node != node) if (node != NUMA_NO_NODE && page_to_nid(c->page) != node)
return 0; return 0;
#endif #endif
return 1; return 1;
@ -2152,7 +2151,6 @@ static inline void *new_slab_objects(struct kmem_cache *s, gfp_t flags,
page->freelist = NULL; page->freelist = NULL;
stat(s, ALLOC_SLAB); stat(s, ALLOC_SLAB);
c->node = page_to_nid(page);
c->page = page; c->page = page;
*pc = c; *pc = c;
} else } else
@ -2269,7 +2267,6 @@ new_slab:
if (c->partial) { if (c->partial) {
c->page = c->partial; c->page = c->partial;
c->partial = c->page->next; c->partial = c->page->next;
c->node = page_to_nid(c->page);
stat(s, CPU_PARTIAL_ALLOC); stat(s, CPU_PARTIAL_ALLOC);
c->freelist = NULL; c->freelist = NULL;
goto redo; goto redo;
@ -2294,7 +2291,6 @@ new_slab:
c->freelist = get_freepointer(s, freelist); c->freelist = get_freepointer(s, freelist);
deactivate_slab(s, c); deactivate_slab(s, c);
c->node = NUMA_NO_NODE;
local_irq_restore(flags); local_irq_restore(flags);
return freelist; return freelist;
} }
@ -4507,30 +4503,31 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu); struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu);
int node = ACCESS_ONCE(c->node); int node;
struct page *page; struct page *page;
if (node < 0)
continue;
page = ACCESS_ONCE(c->page); page = ACCESS_ONCE(c->page);
if (page) { if (!page)
if (flags & SO_TOTAL) continue;
x = page->objects;
else if (flags & SO_OBJECTS)
x = page->inuse;
else
x = 1;
total += x; node = page_to_nid(page);
nodes[node] += x; if (flags & SO_TOTAL)
} x = page->objects;
page = c->partial; else if (flags & SO_OBJECTS)
x = page->inuse;
else
x = 1;
total += x;
nodes[node] += x;
page = ACCESS_ONCE(c->partial);
if (page) { if (page) {
x = page->pobjects; x = page->pobjects;
total += x; total += x;
nodes[node] += x; nodes[node] += x;
} }
per_cpu[node]++; per_cpu[node]++;
} }
} }