From: Christoph Lameter Shutdown the cache_reaper if the cpu is brought down and set the cache_reap.func to NULL. Otherwise hotplug shuts down the reaper for good. Signed-off-by: Christoph Lameter Cc: Oleg Nesterov Signed-off-by: Andrew Morton --- mm/slab.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+) diff -puN mm/slab.c~slab-shutdown-cache_reaper-when-cpu-goes-down mm/slab.c --- a/mm/slab.c~slab-shutdown-cache_reaper-when-cpu-goes-down +++ a/mm/slab.c @@ -1271,6 +1271,20 @@ static int __cpuinit cpuup_callback(stru start_cpu_timer(cpu); break; #ifdef CONFIG_HOTPLUG_CPU + case CPU_DOWN_PREPARE: + /* + * Shutdown cache reaper. Note that the cache_chain_mutex is + * held so that if cache_reap() is invoked it cannot do + * anything expensive but will only modify reap_work + * and reschedule the timer. + */ + cancel_rearming_delayed_work(&per_cpu(reap_work, cpu)); + /* Now the cache_reaper is guaranteed to be not running. */ + per_cpu(reap_work, cpu).work.func = NULL; + break; + case CPU_DOWN_FAILED: + start_cpu_timer(cpu); + break; case CPU_DEAD: /* * Even if all the cpus of a node are down, we don't free the _