[PATCH] slab: Bypass free lists for __drain_alien_cache()
__drain_alien_cache() currently drains objects by freeing them to the (remote) freelists of the original node. However, each node also has a shared list containing objects to be used on any processor of that node. We can avoid a number of remote node accesses by copying the pointers to the free objects directly into the remote shared array. And while we are at it: Skip alien draining if the alien cache spinlock is already taken. Kiran reported that this is a performance benefit. Signed-off-by: Christoph Lameter <clameter@sgi.com> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
3ded175a4b
commit
e00946fe23
11
mm/slab.c
11
mm/slab.c
|
@ -971,6 +971,13 @@ static void __drain_alien_cache(struct kmem_cache *cachep,
|
|||
|
||||
if (ac->avail) {
|
||||
spin_lock(&rl3->list_lock);
|
||||
/*
|
||||
* Stuff objects into the remote nodes shared array first.
|
||||
* That way we could avoid the overhead of putting the objects
|
||||
* into the free lists and getting them back later.
|
||||
*/
|
||||
transfer_objects(rl3->shared, ac, ac->limit);
|
||||
|
||||
free_block(cachep, ac->entry, ac->avail, node);
|
||||
ac->avail = 0;
|
||||
spin_unlock(&rl3->list_lock);
|
||||
|
@ -986,8 +993,8 @@ static void reap_alien(struct kmem_cache *cachep, struct kmem_list3 *l3)
|
|||
|
||||
if (l3->alien) {
|
||||
struct array_cache *ac = l3->alien[node];
|
||||
if (ac && ac->avail) {
|
||||
spin_lock_irq(&ac->lock);
|
||||
|
||||
if (ac && ac->avail && spin_trylock_irq(&ac->lock)) {
|
||||
__drain_alien_cache(cachep, ac, node);
|
||||
spin_unlock_irq(&ac->lock);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue