patch-slab-split-04-drain
PATCH 1/1 patch-slab-split-04-drain
part 4:
- spin_lock(); within the smp_call_function callback is now permitted, remove/cleanup the workaround.
Untested due to lack of SMP test systems, but trivial.
--
Manfred
mm/slab.c +10 -20
@@ -917,29 +917,19 @@static void free_block (kmem_cache_t * cachep,void ** objpp,int len); -static void drain_cpu_caches (kmem_cache_t *cachep) +static void do_drain (void *arg) { -ccupdate_struct_t new; -int i; - -memset (&new.new,0 ,sizeof (new.new)); - - new.cachep = cachep; +kmem_cache_t *cachep = (kmem_cache_t *)arg; +cpucache_t *cc; -down (&cache_chain_sem); -smp_call_function_all_cpus (do_ccupdate_local, (void *)&new); + cc =cc_data (cachep); +free_block (cachep, &cc_entry (cc)[0 ], cc->avail); + cc->avail =0 ; +} -for (i =0 ; i <NR_CPUS ; i++) { -cpucache_t * ccold = new.new[i]; -if (!ccold || (ccold->avail ==0 )) -continue ; -local_irq_disable (); -free_block (cachep,cc_entry (ccold), ccold->avail); -local_irq_enable (); - ccold->avail =0 ; - } -smp_call_function_all_cpus (do_ccupdate_local, (void *)&new); -up (&cache_chain_sem); +static void drain_cpu_caches (kmem_cache_t *cachep) +{ +smp_call_function_all_cpus (do_drain, cachep); }static int __cache_shrink (kmem_cache_t *cachep)