Skip to content

Commit

Permalink
SLUB: fix locking for hotplug callbacks
Browse files Browse the repository at this point in the history
Hotplug callbacks are performed with interrupts enabled.  Slub requires
interrupts to be disabled for flushing caches.

Signed-off-by: Christoph Lameter <[email protected]>
Cc: Michal Piotrowski <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Jun 1, 2007
1 parent ac140a8 commit 27390bc
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion mm/slub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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;
Expand Down

0 comments on commit 27390bc

Please sign in to comment.