Skip to content

Commit

Permalink
mm/slab: Fix drain freelist excessively
Browse files Browse the repository at this point in the history
The drain_freelist is called to drain slabs_free lists for cache reap,
cache shrink, memory hotplug callback etc. The tofree parameter should
be the number of slab to free instead of the number of slab objects to
free.

This patch fix the callers that pass # of objects. Make sure they pass #
of slabs.

Acked-by: Christoph Lameter <[email protected]>
Signed-off-by: Wanpeng Li <[email protected]>
Signed-off-by: Pekka Enberg <[email protected]>
  • Loading branch information
Wanpeng Li authored and penberg committed Jul 7, 2013
1 parent 069e2b3 commit 0fa8103
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions mm/slab.c
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,12 @@ static int init_cache_node_node(int node)
return 0;
}

static inline int slabs_tofree(struct kmem_cache *cachep,
struct kmem_cache_node *n)
{
return (n->free_objects + cachep->num - 1) / cachep->num;
}

static void __cpuinit cpuup_canceled(long cpu)
{
struct kmem_cache *cachep;
Expand Down Expand Up @@ -1241,7 +1247,7 @@ static void __cpuinit cpuup_canceled(long cpu)
n = cachep->node[node];
if (!n)
continue;
drain_freelist(cachep, n, n->free_objects);
drain_freelist(cachep, n, slabs_tofree(cachep, n));
}
}

Expand Down Expand Up @@ -1408,7 +1414,7 @@ static int __meminit drain_cache_node_node(int node)
if (!n)
continue;

drain_freelist(cachep, n, n->free_objects);
drain_freelist(cachep, n, slabs_tofree(cachep, n));

if (!list_empty(&n->slabs_full) ||
!list_empty(&n->slabs_partial)) {
Expand Down Expand Up @@ -2534,7 +2540,7 @@ static int __cache_shrink(struct kmem_cache *cachep)
if (!n)
continue;

drain_freelist(cachep, n, n->free_objects);
drain_freelist(cachep, n, slabs_tofree(cachep, n));

ret += !list_empty(&n->slabs_full) ||
!list_empty(&n->slabs_partial);
Expand Down

0 comments on commit 0fa8103

Please sign in to comment.