Install the callbacks via the state machine.

Cc: [email protected]
Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
---
 include/linux/cpuhotplug.h |  1 +
 mm/page_alloc.c            | 49 +++++++++++++++++++++++-----------------------
 2 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 89310fb1031d..31c58f6ec3c6 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -35,6 +35,7 @@ enum cpuhp_state {
        CPUHP_MM_MEMCQ_DEAD,
        CPUHP_PERCPU_CNT_DEAD,
        CPUHP_RADIX_DEAD,
+       CPUHP_PAGE_ALLOC_DEAD,
        CPUHP_WORKQUEUE_PREP,
        CPUHP_POWER_NUMA_PREPARE,
        CPUHP_HRTIMERS_PREPARE,
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 8fd42aa7c4bd..68873a164cc0 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6491,38 +6491,39 @@ void __init free_area_init(unsigned long *zones_size)
                        __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL);
 }
 
-static int page_alloc_cpu_notify(struct notifier_block *self,
-                                unsigned long action, void *hcpu)
+static int page_alloc_cpu_dead(unsigned int cpu)
 {
-       int cpu = (unsigned long)hcpu;
 
-       if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
-               lru_add_drain_cpu(cpu);
-               drain_pages(cpu);
+       lru_add_drain_cpu(cpu);
+       drain_pages(cpu);
 
-               /*
-                * Spill the event counters of the dead processor
-                * into the current processors event counters.
-                * This artificially elevates the count of the current
-                * processor.
-                */
-               vm_events_fold_cpu(cpu);
+       /*
+        * Spill the event counters of the dead processor
+        * into the current processors event counters.
+        * This artificially elevates the count of the current
+        * processor.
+        */
+       vm_events_fold_cpu(cpu);
 
-               /*
-                * Zero the differential counters of the dead processor
-                * so that the vm statistics are consistent.
-                *
-                * This is only okay since the processor is dead and cannot
-                * race with what we are doing.
-                */
-               cpu_vm_stats_fold(cpu);
-       }
-       return NOTIFY_OK;
+       /*
+        * Zero the differential counters of the dead processor
+        * so that the vm statistics are consistent.
+        *
+        * This is only okay since the processor is dead and cannot
+        * race with what we are doing.
+        */
+       cpu_vm_stats_fold(cpu);
+       return 0;
 }
 
 void __init page_alloc_init(void)
 {
-       hotcpu_notifier(page_alloc_cpu_notify, 0);
+       int ret;
+
+       ret = cpuhp_setup_state_nocalls(CPUHP_PAGE_ALLOC_DEAD,
+                                       "mm/page_alloc:dead", NULL,
+                                       page_alloc_cpu_dead);
+       WARN_ON(ret < 0);
 }
 
 /*
-- 
2.10.2

Reply via email to