|
@@ -1050,10 +1050,10 @@ static void free_alien_cache(struct alien_cache **alc_ptr)
|
|
|
}
|
|
|
|
|
|
static void __drain_alien_cache(struct kmem_cache *cachep,
|
|
|
- struct array_cache *ac, int node)
|
|
|
+ struct array_cache *ac, int node,
|
|
|
+ struct list_head *list)
|
|
|
{
|
|
|
struct kmem_cache_node *n = get_node(cachep, node);
|
|
|
- LIST_HEAD(list);
|
|
|
|
|
|
if (ac->avail) {
|
|
|
spin_lock(&n->list_lock);
|
|
@@ -1065,10 +1065,9 @@ static void __drain_alien_cache(struct kmem_cache *cachep,
|
|
|
if (n->shared)
|
|
|
transfer_objects(n->shared, ac, ac->limit);
|
|
|
|
|
|
- free_block(cachep, ac->entry, ac->avail, node, &list);
|
|
|
+ free_block(cachep, ac->entry, ac->avail, node, list);
|
|
|
ac->avail = 0;
|
|
|
spin_unlock(&n->list_lock);
|
|
|
- slabs_destroy(cachep, &list);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1086,8 +1085,11 @@ static void reap_alien(struct kmem_cache *cachep, struct kmem_cache_node *n)
|
|
|
if (alc) {
|
|
|
ac = &alc->ac;
|
|
|
if (ac->avail && spin_trylock_irq(&alc->lock)) {
|
|
|
- __drain_alien_cache(cachep, ac, node);
|
|
|
+ LIST_HEAD(list);
|
|
|
+
|
|
|
+ __drain_alien_cache(cachep, ac, node, &list);
|
|
|
spin_unlock_irq(&alc->lock);
|
|
|
+ slabs_destroy(cachep, &list);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1104,10 +1106,13 @@ static void drain_alien_cache(struct kmem_cache *cachep,
|
|
|
for_each_online_node(i) {
|
|
|
alc = alien[i];
|
|
|
if (alc) {
|
|
|
+ LIST_HEAD(list);
|
|
|
+
|
|
|
ac = &alc->ac;
|
|
|
spin_lock_irqsave(&alc->lock, flags);
|
|
|
- __drain_alien_cache(cachep, ac, i);
|
|
|
+ __drain_alien_cache(cachep, ac, i, &list);
|
|
|
spin_unlock_irqrestore(&alc->lock, flags);
|
|
|
+ slabs_destroy(cachep, &list);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1138,10 +1143,11 @@ static inline int cache_free_alien(struct kmem_cache *cachep, void *objp)
|
|
|
spin_lock(&alien->lock);
|
|
|
if (unlikely(ac->avail == ac->limit)) {
|
|
|
STATS_INC_ACOVERFLOW(cachep);
|
|
|
- __drain_alien_cache(cachep, ac, nodeid);
|
|
|
+ __drain_alien_cache(cachep, ac, nodeid, &list);
|
|
|
}
|
|
|
ac_put_obj(cachep, ac, objp);
|
|
|
spin_unlock(&alien->lock);
|
|
|
+ slabs_destroy(cachep, &list);
|
|
|
} else {
|
|
|
n = get_node(cachep, nodeid);
|
|
|
spin_lock(&n->list_lock);
|