Loading include/linux/slub_def.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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; Loading mm/slab.c +0 −1 Original line number Original line Diff line number Diff line Loading @@ -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); mm/slob.c +0 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading mm/slub.c +19 −8 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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); /* /* Loading Loading @@ -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; } } Loading @@ -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 Loading Loading @@ -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) { { Loading Loading @@ -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: Loading Loading
include/linux/slub_def.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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; Loading
mm/slab.c +0 −1 Original line number Original line Diff line number Diff line Loading @@ -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);
mm/slob.c +0 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading
mm/slub.c +19 −8 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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); /* /* Loading Loading @@ -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; } } Loading @@ -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 Loading Loading @@ -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) { { Loading Loading @@ -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: Loading