Commit 4fbb7159 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6:
  SLUB: dynamic per-cache MIN_PARTIAL
  mm: unexport ksize
parents e6ca2328 5595cffc
...@@ -46,6 +46,7 @@ struct kmem_cache_cpu { ...@@ -46,6 +46,7 @@ struct kmem_cache_cpu {
struct kmem_cache_node { struct kmem_cache_node {
spinlock_t list_lock; /* Protect partial list and nr_partial */ spinlock_t list_lock; /* Protect partial list and nr_partial */
unsigned long nr_partial; unsigned long nr_partial;
unsigned long min_partial;
struct list_head partial; struct list_head partial;
#ifdef CONFIG_SLUB_DEBUG #ifdef CONFIG_SLUB_DEBUG
atomic_long_t nr_slabs; atomic_long_t nr_slabs;
......
...@@ -4472,4 +4472,3 @@ size_t ksize(const void *objp) ...@@ -4472,4 +4472,3 @@ size_t ksize(const void *objp)
return obj_size(virt_to_cache(objp)); return obj_size(virt_to_cache(objp));
} }
EXPORT_SYMBOL(ksize);
...@@ -519,7 +519,6 @@ size_t ksize(const void *block) ...@@ -519,7 +519,6 @@ size_t ksize(const void *block)
else else
return sp->page.private; return sp->page.private;
} }
EXPORT_SYMBOL(ksize);
struct kmem_cache { struct kmem_cache {
unsigned int size, align; unsigned int size, align;
......
...@@ -1329,7 +1329,7 @@ static struct page *get_any_partial(struct kmem_cache *s, gfp_t flags) ...@@ -1329,7 +1329,7 @@ static struct page *get_any_partial(struct kmem_cache *s, gfp_t flags)
n = get_node(s, zone_to_nid(zone)); n = get_node(s, zone_to_nid(zone));
if (n && cpuset_zone_allowed_hardwall(zone, flags) && if (n && cpuset_zone_allowed_hardwall(zone, flags) &&
n->nr_partial > MIN_PARTIAL) { n->nr_partial > n->min_partial) {
page = get_partial_node(n); page = get_partial_node(n);
if (page) if (page)
return page; return page;
...@@ -1381,7 +1381,7 @@ static void unfreeze_slab(struct kmem_cache *s, struct page *page, int tail) ...@@ -1381,7 +1381,7 @@ static void unfreeze_slab(struct kmem_cache *s, struct page *page, int tail)
slab_unlock(page); slab_unlock(page);
} else { } else {
stat(c, DEACTIVATE_EMPTY); stat(c, DEACTIVATE_EMPTY);
if (n->nr_partial < MIN_PARTIAL) { if (n->nr_partial < n->min_partial) {
/* /*
* Adding an empty slab to the partial slabs in order * Adding an empty slab to the partial slabs in order
* to avoid page allocator overhead. This slab needs * to avoid page allocator overhead. This slab needs
...@@ -1913,9 +1913,21 @@ static void init_kmem_cache_cpu(struct kmem_cache *s, ...@@ -1913,9 +1913,21 @@ static void init_kmem_cache_cpu(struct kmem_cache *s,
#endif #endif
} }
static void init_kmem_cache_node(struct kmem_cache_node *n) static void
init_kmem_cache_node(struct kmem_cache_node *n, struct kmem_cache *s)
{ {
n->nr_partial = 0; n->nr_partial = 0;
/*
* The larger the object size is, the more pages we want on the partial
* list to avoid pounding the page allocator excessively.
*/
n->min_partial = ilog2(s->size);
if (n->min_partial < MIN_PARTIAL)
n->min_partial = MIN_PARTIAL;
else if (n->min_partial > MAX_PARTIAL)
n->min_partial = MAX_PARTIAL;
spin_lock_init(&n->list_lock); spin_lock_init(&n->list_lock);
INIT_LIST_HEAD(&n->partial); INIT_LIST_HEAD(&n->partial);
#ifdef CONFIG_SLUB_DEBUG #ifdef CONFIG_SLUB_DEBUG
...@@ -2087,7 +2099,7 @@ static struct kmem_cache_node *early_kmem_cache_node_alloc(gfp_t gfpflags, ...@@ -2087,7 +2099,7 @@ static struct kmem_cache_node *early_kmem_cache_node_alloc(gfp_t gfpflags,
init_object(kmalloc_caches, n, 1); init_object(kmalloc_caches, n, 1);
init_tracking(kmalloc_caches, n); init_tracking(kmalloc_caches, n);
#endif #endif
init_kmem_cache_node(n); init_kmem_cache_node(n, kmalloc_caches);
inc_slabs_node(kmalloc_caches, node, page->objects); inc_slabs_node(kmalloc_caches, node, page->objects);
/* /*
...@@ -2144,7 +2156,7 @@ static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags) ...@@ -2144,7 +2156,7 @@ static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags)
} }
s->node[node] = n; s->node[node] = n;
init_kmem_cache_node(n); init_kmem_cache_node(n, s);
} }
return 1; return 1;
} }
...@@ -2155,7 +2167,7 @@ static void free_kmem_cache_nodes(struct kmem_cache *s) ...@@ -2155,7 +2167,7 @@ static void free_kmem_cache_nodes(struct kmem_cache *s)
static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags) static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags)
{ {
init_kmem_cache_node(&s->local_node); init_kmem_cache_node(&s->local_node, s);
return 1; return 1;
} }
#endif #endif
...@@ -2715,7 +2727,6 @@ size_t ksize(const void *object) ...@@ -2715,7 +2727,6 @@ size_t ksize(const void *object)
*/ */
return s->size; return s->size;
} }
EXPORT_SYMBOL(ksize);
void kfree(const void *x) void kfree(const void *x)
{ {
...@@ -2890,7 +2901,7 @@ static int slab_mem_going_online_callback(void *arg) ...@@ -2890,7 +2901,7 @@ static int slab_mem_going_online_callback(void *arg)
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
init_kmem_cache_node(n); init_kmem_cache_node(n, s);
s->node[nid] = n; s->node[nid] = n;
} }
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment