Commit-ID:  a96a87bf949d249039cdf532bb5f5d06622cc5e2
Gitweb:     http://git.kernel.org/tip/a96a87bf949d249039cdf532bb5f5d06622cc5e2
Author:     Sebastian Andrzej Siewior <[email protected]>
AuthorDate: Thu, 18 Aug 2016 14:57:19 +0200
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Tue, 6 Sep 2016 18:30:20 +0200

slub: Convert to hotplug state machine

Install the callbacks via the state machine.

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Pekka Enberg <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: David Rientjes <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Joonsoo Kim <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Thomas Gleixner <[email protected]>

---
 include/linux/cpuhotplug.h |  1 +
 mm/slub.c                  | 65 +++++++++++++++-------------------------------
 2 files changed, 22 insertions(+), 44 deletions(-)

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index c2cf149..82ee321 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -15,6 +15,7 @@ enum cpuhp_state {
        CPUHP_X86_HPET_DEAD,
        CPUHP_X86_APB_DEAD,
        CPUHP_VIRT_NET_DEAD,
+       CPUHP_SLUB_DEAD,
        CPUHP_WORKQUEUE_PREP,
        CPUHP_POWER_NUMA_PREPARE,
        CPUHP_HRTIMERS_PREPARE,
diff --git a/mm/slub.c b/mm/slub.c
index 9adae58..2b3e740 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -194,10 +194,6 @@ static inline bool kmem_cache_has_cpu_partial(struct 
kmem_cache *s)
 #define __OBJECT_POISON                0x80000000UL /* Poison object */
 #define __CMPXCHG_DOUBLE       0x40000000UL /* Use cmpxchg_double */
 
-#ifdef CONFIG_SMP
-static struct notifier_block slab_notifier;
-#endif
-
 /*
  * Tracking user of a slab.
  */
@@ -2305,6 +2301,25 @@ static void flush_all(struct kmem_cache *s)
 }
 
 /*
+ * Use the cpu notifier to insure that the cpu slabs are flushed when
+ * necessary.
+ */
+static int slub_cpu_dead(unsigned int cpu)
+{
+       struct kmem_cache *s;
+       unsigned long flags;
+
+       mutex_lock(&slab_mutex);
+       list_for_each_entry(s, &slab_caches, list) {
+               local_irq_save(flags);
+               __flush_cpu_slab(s, cpu);
+               local_irq_restore(flags);
+       }
+       mutex_unlock(&slab_mutex);
+       return 0;
+}
+
+/*
  * Check if the objects in a per cpu structure fit numa
  * locality expectations.
  */
@@ -4144,9 +4159,8 @@ void __init kmem_cache_init(void)
        /* Setup random freelists for each cache */
        init_freelist_randomization();
 
-#ifdef CONFIG_SMP
-       register_cpu_notifier(&slab_notifier);
-#endif
+       cpuhp_setup_state_nocalls(CPUHP_SLUB_DEAD, "slub:dead", NULL,
+                                 slub_cpu_dead);
 
        pr_info("SLUB: HWalign=%d, Order=%d-%d, MinObjects=%d, CPUs=%d, 
Nodes=%d\n",
                cache_line_size(),
@@ -4210,43 +4224,6 @@ int __kmem_cache_create(struct kmem_cache *s, unsigned 
long flags)
        return err;
 }
 
-#ifdef CONFIG_SMP
-/*
- * Use the cpu notifier to insure that the cpu slabs are flushed when
- * necessary.
- */
-static int slab_cpuup_callback(struct notifier_block *nfb,
-               unsigned long action, void *hcpu)
-{
-       long cpu = (long)hcpu;
-       struct kmem_cache *s;
-       unsigned long flags;
-
-       switch (action) {
-       case CPU_UP_CANCELED:
-       case CPU_UP_CANCELED_FROZEN:
-       case CPU_DEAD:
-       case CPU_DEAD_FROZEN:
-               mutex_lock(&slab_mutex);
-               list_for_each_entry(s, &slab_caches, list) {
-                       local_irq_save(flags);
-                       __flush_cpu_slab(s, cpu);
-                       local_irq_restore(flags);
-               }
-               mutex_unlock(&slab_mutex);
-               break;
-       default:
-               break;
-       }
-       return NOTIFY_OK;
-}
-
-static struct notifier_block slab_notifier = {
-       .notifier_call = slab_cpuup_callback
-};
-
-#endif
-
 void *__kmalloc_track_caller(size_t size, gfp_t gfpflags, unsigned long caller)
 {
        struct kmem_cache *s;

Reply via email to