SLUB: fix locking for hotplug callbacks

Hotplug callbacks are performed with interrupts enabled.  Slub requires
interrupts to be disabled for flushing caches.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Cc: Michal Piotrowski <michal.k.k.piotrowski@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Christoph Lameter 2007-06-01 00:47:09 -07:00 committed by Linus Torvalds
parent ac140a8f83
commit 27390bc335
1 changed files with 14 additions and 1 deletions

View File

@ -2607,6 +2607,19 @@ static void for_all_slabs(void (*func)(struct kmem_cache *, int), int cpu)
up_read(&slub_lock);
}
/*
* Version of __flush_cpu_slab for the case that interrupts
* are enabled.
*/
static void cpu_slab_flush(struct kmem_cache *s, int cpu)
{
unsigned long flags;
local_irq_save(flags);
__flush_cpu_slab(s, cpu);
local_irq_restore(flags);
}
/*
* Use the cpu notifier to insure that the cpu slabs are flushed when
* necessary.
@ -2621,7 +2634,7 @@ static int __cpuinit slab_cpuup_callback(struct notifier_block *nfb,
case CPU_UP_CANCELED_FROZEN:
case CPU_DEAD:
case CPU_DEAD_FROZEN:
for_all_slabs(__flush_cpu_slab, cpu);
for_all_slabs(cpu_slab_flush, cpu);
break;
default:
break;