LCOV - code coverage report
Current view: top level - kernel - cpu.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 96 200 48.0 %
Date: 2022-12-09 01:23:36 Functions: 11 21 52.4 %

          Line data    Source code
       1             : /* CPU control.
       2             :  * (C) 2001, 2002, 2003, 2004 Rusty Russell
       3             :  *
       4             :  * This code is licenced under the GPL.
       5             :  */
       6             : #include <linux/sched/mm.h>
       7             : #include <linux/proc_fs.h>
       8             : #include <linux/smp.h>
       9             : #include <linux/init.h>
      10             : #include <linux/notifier.h>
      11             : #include <linux/sched/signal.h>
      12             : #include <linux/sched/hotplug.h>
      13             : #include <linux/sched/isolation.h>
      14             : #include <linux/sched/task.h>
      15             : #include <linux/sched/smt.h>
      16             : #include <linux/unistd.h>
      17             : #include <linux/cpu.h>
      18             : #include <linux/oom.h>
      19             : #include <linux/rcupdate.h>
      20             : #include <linux/export.h>
      21             : #include <linux/bug.h>
      22             : #include <linux/kthread.h>
      23             : #include <linux/stop_machine.h>
      24             : #include <linux/mutex.h>
      25             : #include <linux/gfp.h>
      26             : #include <linux/suspend.h>
      27             : #include <linux/lockdep.h>
      28             : #include <linux/tick.h>
      29             : #include <linux/irq.h>
      30             : #include <linux/nmi.h>
      31             : #include <linux/smpboot.h>
      32             : #include <linux/relay.h>
      33             : #include <linux/slab.h>
      34             : #include <linux/scs.h>
      35             : #include <linux/percpu-rwsem.h>
      36             : #include <linux/cpuset.h>
      37             : #include <linux/random.h>
      38             : 
      39             : #include <trace/events/power.h>
      40             : #define CREATE_TRACE_POINTS
      41             : #include <trace/events/cpuhp.h>
      42             : 
      43             : #include "smpboot.h"
      44             : 
      45             : /**
      46             :  * struct cpuhp_cpu_state - Per cpu hotplug state storage
      47             :  * @state:      The current cpu state
      48             :  * @target:     The target state
      49             :  * @fail:       Current CPU hotplug callback state
      50             :  * @thread:     Pointer to the hotplug thread
      51             :  * @should_run: Thread should execute
      52             :  * @rollback:   Perform a rollback
      53             :  * @single:     Single callback invocation
      54             :  * @bringup:    Single callback bringup or teardown selector
      55             :  * @cpu:        CPU number
      56             :  * @node:       Remote CPU node; for multi-instance, do a
      57             :  *              single entry callback for install/remove
      58             :  * @last:       For multi-instance rollback, remember how far we got
      59             :  * @cb_state:   The state for a single callback (install/uninstall)
      60             :  * @result:     Result of the operation
      61             :  * @done_up:    Signal completion to the issuer of the task for cpu-up
      62             :  * @done_down:  Signal completion to the issuer of the task for cpu-down
      63             :  */
      64             : struct cpuhp_cpu_state {
      65             :         enum cpuhp_state        state;
      66             :         enum cpuhp_state        target;
      67             :         enum cpuhp_state        fail;
      68             : #ifdef CONFIG_SMP
      69             :         struct task_struct      *thread;
      70             :         bool                    should_run;
      71             :         bool                    rollback;
      72             :         bool                    single;
      73             :         bool                    bringup;
      74             :         struct hlist_node       *node;
      75             :         struct hlist_node       *last;
      76             :         enum cpuhp_state        cb_state;
      77             :         int                     result;
      78             :         struct completion       done_up;
      79             :         struct completion       done_down;
      80             : #endif
      81             : };
      82             : 
      83             : static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = {
      84             :         .fail = CPUHP_INVALID,
      85             : };
      86             : 
      87             : #ifdef CONFIG_SMP
      88             : cpumask_t cpus_booted_once_mask;
      89             : #endif
      90             : 
      91             : #if defined(CONFIG_LOCKDEP) && defined(CONFIG_SMP)
      92             : static struct lockdep_map cpuhp_state_up_map =
      93             :         STATIC_LOCKDEP_MAP_INIT("cpuhp_state-up", &cpuhp_state_up_map);
      94             : static struct lockdep_map cpuhp_state_down_map =
      95             :         STATIC_LOCKDEP_MAP_INIT("cpuhp_state-down", &cpuhp_state_down_map);
      96             : 
      97             : 
      98             : static inline void cpuhp_lock_acquire(bool bringup)
      99             : {
     100             :         lock_map_acquire(bringup ? &cpuhp_state_up_map : &cpuhp_state_down_map);
     101             : }
     102             : 
     103             : static inline void cpuhp_lock_release(bool bringup)
     104             : {
     105             :         lock_map_release(bringup ? &cpuhp_state_up_map : &cpuhp_state_down_map);
     106             : }
     107             : #else
     108             : 
     109             : static inline void cpuhp_lock_acquire(bool bringup) { }
     110             : static inline void cpuhp_lock_release(bool bringup) { }
     111             : 
     112             : #endif
     113             : 
     114             : /**
     115             :  * struct cpuhp_step - Hotplug state machine step
     116             :  * @name:       Name of the step
     117             :  * @startup:    Startup function of the step
     118             :  * @teardown:   Teardown function of the step
     119             :  * @cant_stop:  Bringup/teardown can't be stopped at this step
     120             :  * @multi_instance:     State has multiple instances which get added afterwards
     121             :  */
     122             : struct cpuhp_step {
     123             :         const char              *name;
     124             :         union {
     125             :                 int             (*single)(unsigned int cpu);
     126             :                 int             (*multi)(unsigned int cpu,
     127             :                                          struct hlist_node *node);
     128             :         } startup;
     129             :         union {
     130             :                 int             (*single)(unsigned int cpu);
     131             :                 int             (*multi)(unsigned int cpu,
     132             :                                          struct hlist_node *node);
     133             :         } teardown;
     134             :         /* private: */
     135             :         struct hlist_head       list;
     136             :         /* public: */
     137             :         bool                    cant_stop;
     138             :         bool                    multi_instance;
     139             : };
     140             : 
     141             : static DEFINE_MUTEX(cpuhp_state_mutex);
     142             : static struct cpuhp_step cpuhp_hp_states[];
     143             : 
     144             : static struct cpuhp_step *cpuhp_get_step(enum cpuhp_state state)
     145             : {
     146          26 :         return cpuhp_hp_states + state;
     147             : }
     148             : 
     149             : static bool cpuhp_step_empty(bool bringup, struct cpuhp_step *step)
     150             : {
     151           6 :         return bringup ? !step->startup.single : !step->teardown.single;
     152             : }
     153             : 
     154             : /**
     155             :  * cpuhp_invoke_callback - Invoke the callbacks for a given state
     156             :  * @cpu:        The cpu for which the callback should be invoked
     157             :  * @state:      The state to do callbacks for
     158             :  * @bringup:    True if the bringup callback should be invoked
     159             :  * @node:       For multi-instance, do a single entry callback for install/remove
     160             :  * @lastp:      For multi-instance rollback, remember how far we got
     161             :  *
     162             :  * Called from cpu hotplug and from the state register machinery.
     163             :  *
     164             :  * Return: %0 on success or a negative errno code
     165             :  */
     166           3 : static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,
     167             :                                  bool bringup, struct hlist_node *node,
     168             :                                  struct hlist_node **lastp)
     169             : {
     170           3 :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
     171           3 :         struct cpuhp_step *step = cpuhp_get_step(state);
     172             :         int (*cbm)(unsigned int cpu, struct hlist_node *node);
     173             :         int (*cb)(unsigned int cpu);
     174             :         int ret, cnt;
     175             : 
     176           3 :         if (st->fail == state) {
     177           0 :                 st->fail = CPUHP_INVALID;
     178           0 :                 return -EAGAIN;
     179             :         }
     180             : 
     181           3 :         if (cpuhp_step_empty(bringup, step)) {
     182           0 :                 WARN_ON_ONCE(1);
     183             :                 return 0;
     184             :         }
     185             : 
     186           3 :         if (!step->multi_instance) {
     187           3 :                 WARN_ON_ONCE(lastp && *lastp);
     188           3 :                 cb = bringup ? step->startup.single : step->teardown.single;
     189             : 
     190           3 :                 trace_cpuhp_enter(cpu, st->target, state, cb);
     191           3 :                 ret = cb(cpu);
     192           3 :                 trace_cpuhp_exit(cpu, st->state, state, ret);
     193           3 :                 return ret;
     194             :         }
     195           0 :         cbm = bringup ? step->startup.multi : step->teardown.multi;
     196             : 
     197             :         /* Single invocation for instance add/remove */
     198           0 :         if (node) {
     199           0 :                 WARN_ON_ONCE(lastp && *lastp);
     200           0 :                 trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
     201           0 :                 ret = cbm(cpu, node);
     202           0 :                 trace_cpuhp_exit(cpu, st->state, state, ret);
     203           0 :                 return ret;
     204             :         }
     205             : 
     206             :         /* State transition. Invoke on all instances */
     207           0 :         cnt = 0;
     208           0 :         hlist_for_each(node, &step->list) {
     209           0 :                 if (lastp && node == *lastp)
     210             :                         break;
     211             : 
     212           0 :                 trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
     213           0 :                 ret = cbm(cpu, node);
     214           0 :                 trace_cpuhp_exit(cpu, st->state, state, ret);
     215           0 :                 if (ret) {
     216           0 :                         if (!lastp)
     217             :                                 goto err;
     218             : 
     219           0 :                         *lastp = node;
     220           0 :                         return ret;
     221             :                 }
     222           0 :                 cnt++;
     223             :         }
     224           0 :         if (lastp)
     225           0 :                 *lastp = NULL;
     226             :         return 0;
     227             : err:
     228             :         /* Rollback the instances if one failed */
     229           0 :         cbm = !bringup ? step->startup.multi : step->teardown.multi;
     230           0 :         if (!cbm)
     231             :                 return ret;
     232             : 
     233           0 :         hlist_for_each(node, &step->list) {
     234           0 :                 if (!cnt--)
     235             :                         break;
     236             : 
     237           0 :                 trace_cpuhp_multi_enter(cpu, st->target, state, cbm, node);
     238           0 :                 ret = cbm(cpu, node);
     239           0 :                 trace_cpuhp_exit(cpu, st->state, state, ret);
     240             :                 /*
     241             :                  * Rollback must not fail,
     242             :                  */
     243           0 :                 WARN_ON_ONCE(ret);
     244             :         }
     245             :         return ret;
     246             : }
     247             : 
     248             : #ifdef CONFIG_SMP
     249             : static bool cpuhp_is_ap_state(enum cpuhp_state state)
     250             : {
     251             :         /*
     252             :          * The extra check for CPUHP_TEARDOWN_CPU is only for documentation
     253             :          * purposes as that state is handled explicitly in cpu_down.
     254             :          */
     255             :         return state > CPUHP_BRINGUP_CPU && state != CPUHP_TEARDOWN_CPU;
     256             : }
     257             : 
     258             : static inline void wait_for_ap_thread(struct cpuhp_cpu_state *st, bool bringup)
     259             : {
     260             :         struct completion *done = bringup ? &st->done_up : &st->done_down;
     261             :         wait_for_completion(done);
     262             : }
     263             : 
     264             : static inline void complete_ap_thread(struct cpuhp_cpu_state *st, bool bringup)
     265             : {
     266             :         struct completion *done = bringup ? &st->done_up : &st->done_down;
     267             :         complete(done);
     268             : }
     269             : 
     270             : /*
     271             :  * The former STARTING/DYING states, ran with IRQs disabled and must not fail.
     272             :  */
     273             : static bool cpuhp_is_atomic_state(enum cpuhp_state state)
     274             : {
     275             :         return CPUHP_AP_IDLE_DEAD <= state && state < CPUHP_AP_ONLINE;
     276             : }
     277             : 
     278             : /* Serializes the updates to cpu_online_mask, cpu_present_mask */
     279             : static DEFINE_MUTEX(cpu_add_remove_lock);
     280             : bool cpuhp_tasks_frozen;
     281             : EXPORT_SYMBOL_GPL(cpuhp_tasks_frozen);
     282             : 
     283             : /*
     284             :  * The following two APIs (cpu_maps_update_begin/done) must be used when
     285             :  * attempting to serialize the updates to cpu_online_mask & cpu_present_mask.
     286             :  */
     287             : void cpu_maps_update_begin(void)
     288             : {
     289             :         mutex_lock(&cpu_add_remove_lock);
     290             : }
     291             : 
     292             : void cpu_maps_update_done(void)
     293             : {
     294             :         mutex_unlock(&cpu_add_remove_lock);
     295             : }
     296             : 
     297             : /*
     298             :  * If set, cpu_up and cpu_down will return -EBUSY and do nothing.
     299             :  * Should always be manipulated under cpu_add_remove_lock
     300             :  */
     301             : static int cpu_hotplug_disabled;
     302             : 
     303             : #ifdef CONFIG_HOTPLUG_CPU
     304             : 
     305             : DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock);
     306             : 
     307             : void cpus_read_lock(void)
     308             : {
     309             :         percpu_down_read(&cpu_hotplug_lock);
     310             : }
     311             : EXPORT_SYMBOL_GPL(cpus_read_lock);
     312             : 
     313             : int cpus_read_trylock(void)
     314             : {
     315             :         return percpu_down_read_trylock(&cpu_hotplug_lock);
     316             : }
     317             : EXPORT_SYMBOL_GPL(cpus_read_trylock);
     318             : 
     319             : void cpus_read_unlock(void)
     320             : {
     321             :         percpu_up_read(&cpu_hotplug_lock);
     322             : }
     323             : EXPORT_SYMBOL_GPL(cpus_read_unlock);
     324             : 
     325             : void cpus_write_lock(void)
     326             : {
     327             :         percpu_down_write(&cpu_hotplug_lock);
     328             : }
     329             : 
     330             : void cpus_write_unlock(void)
     331             : {
     332             :         percpu_up_write(&cpu_hotplug_lock);
     333             : }
     334             : 
     335             : void lockdep_assert_cpus_held(void)
     336             : {
     337             :         /*
     338             :          * We can't have hotplug operations before userspace starts running,
     339             :          * and some init codepaths will knowingly not take the hotplug lock.
     340             :          * This is all valid, so mute lockdep until it makes sense to report
     341             :          * unheld locks.
     342             :          */
     343             :         if (system_state < SYSTEM_RUNNING)
     344             :                 return;
     345             : 
     346             :         percpu_rwsem_assert_held(&cpu_hotplug_lock);
     347             : }
     348             : 
     349             : #ifdef CONFIG_LOCKDEP
     350             : int lockdep_is_cpus_held(void)
     351             : {
     352             :         return percpu_rwsem_is_held(&cpu_hotplug_lock);
     353             : }
     354             : #endif
     355             : 
     356             : static void lockdep_acquire_cpus_lock(void)
     357             : {
     358             :         rwsem_acquire(&cpu_hotplug_lock.dep_map, 0, 0, _THIS_IP_);
     359             : }
     360             : 
     361             : static void lockdep_release_cpus_lock(void)
     362             : {
     363             :         rwsem_release(&cpu_hotplug_lock.dep_map, _THIS_IP_);
     364             : }
     365             : 
     366             : /*
     367             :  * Wait for currently running CPU hotplug operations to complete (if any) and
     368             :  * disable future CPU hotplug (from sysfs). The 'cpu_add_remove_lock' protects
     369             :  * the 'cpu_hotplug_disabled' flag. The same lock is also acquired by the
     370             :  * hotplug path before performing hotplug operations. So acquiring that lock
     371             :  * guarantees mutual exclusion from any currently running hotplug operations.
     372             :  */
     373             : void cpu_hotplug_disable(void)
     374             : {
     375             :         cpu_maps_update_begin();
     376             :         cpu_hotplug_disabled++;
     377             :         cpu_maps_update_done();
     378             : }
     379             : EXPORT_SYMBOL_GPL(cpu_hotplug_disable);
     380             : 
     381             : static void __cpu_hotplug_enable(void)
     382             : {
     383             :         if (WARN_ONCE(!cpu_hotplug_disabled, "Unbalanced cpu hotplug enable\n"))
     384             :                 return;
     385             :         cpu_hotplug_disabled--;
     386             : }
     387             : 
     388             : void cpu_hotplug_enable(void)
     389             : {
     390             :         cpu_maps_update_begin();
     391             :         __cpu_hotplug_enable();
     392             :         cpu_maps_update_done();
     393             : }
     394             : EXPORT_SYMBOL_GPL(cpu_hotplug_enable);
     395             : 
     396             : #else
     397             : 
     398             : static void lockdep_acquire_cpus_lock(void)
     399             : {
     400             : }
     401             : 
     402             : static void lockdep_release_cpus_lock(void)
     403             : {
     404             : }
     405             : 
     406             : #endif  /* CONFIG_HOTPLUG_CPU */
     407             : 
     408             : /*
     409             :  * Architectures that need SMT-specific errata handling during SMT hotplug
     410             :  * should override this.
     411             :  */
     412             : void __weak arch_smt_update(void) { }
     413             : 
     414             : #ifdef CONFIG_HOTPLUG_SMT
     415             : enum cpuhp_smt_control cpu_smt_control __read_mostly = CPU_SMT_ENABLED;
     416             : 
     417             : void __init cpu_smt_disable(bool force)
     418             : {
     419             :         if (!cpu_smt_possible())
     420             :                 return;
     421             : 
     422             :         if (force) {
     423             :                 pr_info("SMT: Force disabled\n");
     424             :                 cpu_smt_control = CPU_SMT_FORCE_DISABLED;
     425             :         } else {
     426             :                 pr_info("SMT: disabled\n");
     427             :                 cpu_smt_control = CPU_SMT_DISABLED;
     428             :         }
     429             : }
     430             : 
     431             : /*
     432             :  * The decision whether SMT is supported can only be done after the full
     433             :  * CPU identification. Called from architecture code.
     434             :  */
     435             : void __init cpu_smt_check_topology(void)
     436             : {
     437             :         if (!topology_smt_supported())
     438             :                 cpu_smt_control = CPU_SMT_NOT_SUPPORTED;
     439             : }
     440             : 
     441             : static int __init smt_cmdline_disable(char *str)
     442             : {
     443             :         cpu_smt_disable(str && !strcmp(str, "force"));
     444             :         return 0;
     445             : }
     446             : early_param("nosmt", smt_cmdline_disable);
     447             : 
     448             : static inline bool cpu_smt_allowed(unsigned int cpu)
     449             : {
     450             :         if (cpu_smt_control == CPU_SMT_ENABLED)
     451             :                 return true;
     452             : 
     453             :         if (topology_is_primary_thread(cpu))
     454             :                 return true;
     455             : 
     456             :         /*
     457             :          * On x86 it's required to boot all logical CPUs at least once so
     458             :          * that the init code can get a chance to set CR4.MCE on each
     459             :          * CPU. Otherwise, a broadcasted MCE observing CR4.MCE=0b on any
     460             :          * core will shutdown the machine.
     461             :          */
     462             :         return !cpumask_test_cpu(cpu, &cpus_booted_once_mask);
     463             : }
     464             : 
     465             : /* Returns true if SMT is not supported of forcefully (irreversibly) disabled */
     466             : bool cpu_smt_possible(void)
     467             : {
     468             :         return cpu_smt_control != CPU_SMT_FORCE_DISABLED &&
     469             :                 cpu_smt_control != CPU_SMT_NOT_SUPPORTED;
     470             : }
     471             : EXPORT_SYMBOL_GPL(cpu_smt_possible);
     472             : #else
     473             : static inline bool cpu_smt_allowed(unsigned int cpu) { return true; }
     474             : #endif
     475             : 
     476             : static inline enum cpuhp_state
     477             : cpuhp_set_state(int cpu, struct cpuhp_cpu_state *st, enum cpuhp_state target)
     478             : {
     479             :         enum cpuhp_state prev_state = st->state;
     480             :         bool bringup = st->state < target;
     481             : 
     482             :         st->rollback = false;
     483             :         st->last = NULL;
     484             : 
     485             :         st->target = target;
     486             :         st->single = false;
     487             :         st->bringup = bringup;
     488             :         if (cpu_dying(cpu) != !bringup)
     489             :                 set_cpu_dying(cpu, !bringup);
     490             : 
     491             :         return prev_state;
     492             : }
     493             : 
     494             : static inline void
     495             : cpuhp_reset_state(int cpu, struct cpuhp_cpu_state *st,
     496             :                   enum cpuhp_state prev_state)
     497             : {
     498             :         bool bringup = !st->bringup;
     499             : 
     500             :         st->target = prev_state;
     501             : 
     502             :         /*
     503             :          * Already rolling back. No need invert the bringup value or to change
     504             :          * the current state.
     505             :          */
     506             :         if (st->rollback)
     507             :                 return;
     508             : 
     509             :         st->rollback = true;
     510             : 
     511             :         /*
     512             :          * If we have st->last we need to undo partial multi_instance of this
     513             :          * state first. Otherwise start undo at the previous state.
     514             :          */
     515             :         if (!st->last) {
     516             :                 if (st->bringup)
     517             :                         st->state--;
     518             :                 else
     519             :                         st->state++;
     520             :         }
     521             : 
     522             :         st->bringup = bringup;
     523             :         if (cpu_dying(cpu) != !bringup)
     524             :                 set_cpu_dying(cpu, !bringup);
     525             : }
     526             : 
     527             : /* Regular hotplug invocation of the AP hotplug thread */
     528             : static void __cpuhp_kick_ap(struct cpuhp_cpu_state *st)
     529             : {
     530             :         if (!st->single && st->state == st->target)
     531             :                 return;
     532             : 
     533             :         st->result = 0;
     534             :         /*
     535             :          * Make sure the above stores are visible before should_run becomes
     536             :          * true. Paired with the mb() above in cpuhp_thread_fun()
     537             :          */
     538             :         smp_mb();
     539             :         st->should_run = true;
     540             :         wake_up_process(st->thread);
     541             :         wait_for_ap_thread(st, st->bringup);
     542             : }
     543             : 
     544             : static int cpuhp_kick_ap(int cpu, struct cpuhp_cpu_state *st,
     545             :                          enum cpuhp_state target)
     546             : {
     547             :         enum cpuhp_state prev_state;
     548             :         int ret;
     549             : 
     550             :         prev_state = cpuhp_set_state(cpu, st, target);
     551             :         __cpuhp_kick_ap(st);
     552             :         if ((ret = st->result)) {
     553             :                 cpuhp_reset_state(cpu, st, prev_state);
     554             :                 __cpuhp_kick_ap(st);
     555             :         }
     556             : 
     557             :         return ret;
     558             : }
     559             : 
     560             : static int bringup_wait_for_ap(unsigned int cpu)
     561             : {
     562             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
     563             : 
     564             :         /* Wait for the CPU to reach CPUHP_AP_ONLINE_IDLE */
     565             :         wait_for_ap_thread(st, true);
     566             :         if (WARN_ON_ONCE((!cpu_online(cpu))))
     567             :                 return -ECANCELED;
     568             : 
     569             :         /* Unpark the hotplug thread of the target cpu */
     570             :         kthread_unpark(st->thread);
     571             : 
     572             :         /*
     573             :          * SMT soft disabling on X86 requires to bring the CPU out of the
     574             :          * BIOS 'wait for SIPI' state in order to set the CR4.MCE bit.  The
     575             :          * CPU marked itself as booted_once in notify_cpu_starting() so the
     576             :          * cpu_smt_allowed() check will now return false if this is not the
     577             :          * primary sibling.
     578             :          */
     579             :         if (!cpu_smt_allowed(cpu))
     580             :                 return -ECANCELED;
     581             : 
     582             :         if (st->target <= CPUHP_AP_ONLINE_IDLE)
     583             :                 return 0;
     584             : 
     585             :         return cpuhp_kick_ap(cpu, st, st->target);
     586             : }
     587             : 
     588             : static int bringup_cpu(unsigned int cpu)
     589             : {
     590             :         struct task_struct *idle = idle_thread_get(cpu);
     591             :         int ret;
     592             : 
     593             :         /*
     594             :          * Reset stale stack state from the last time this CPU was online.
     595             :          */
     596             :         scs_task_reset(idle);
     597             :         kasan_unpoison_task_stack(idle);
     598             : 
     599             :         /*
     600             :          * Some architectures have to walk the irq descriptors to
     601             :          * setup the vector space for the cpu which comes online.
     602             :          * Prevent irq alloc/free across the bringup.
     603             :          */
     604             :         irq_lock_sparse();
     605             : 
     606             :         /* Arch-specific enabling code. */
     607             :         ret = __cpu_up(cpu, idle);
     608             :         irq_unlock_sparse();
     609             :         if (ret)
     610             :                 return ret;
     611             :         return bringup_wait_for_ap(cpu);
     612             : }
     613             : 
     614             : static int finish_cpu(unsigned int cpu)
     615             : {
     616             :         struct task_struct *idle = idle_thread_get(cpu);
     617             :         struct mm_struct *mm = idle->active_mm;
     618             : 
     619             :         /*
     620             :          * idle_task_exit() will have switched to &init_mm, now
     621             :          * clean up any remaining active_mm state.
     622             :          */
     623             :         if (mm != &init_mm)
     624             :                 idle->active_mm = &init_mm;
     625             :         mmdrop(mm);
     626             :         return 0;
     627             : }
     628             : 
     629             : /*
     630             :  * Hotplug state machine related functions
     631             :  */
     632             : 
     633             : /*
     634             :  * Get the next state to run. Empty ones will be skipped. Returns true if a
     635             :  * state must be run.
     636             :  *
     637             :  * st->state will be modified ahead of time, to match state_to_run, as if it
     638             :  * has already ran.
     639             :  */
     640             : static bool cpuhp_next_state(bool bringup,
     641             :                              enum cpuhp_state *state_to_run,
     642             :                              struct cpuhp_cpu_state *st,
     643             :                              enum cpuhp_state target)
     644             : {
     645             :         do {
     646             :                 if (bringup) {
     647             :                         if (st->state >= target)
     648             :                                 return false;
     649             : 
     650             :                         *state_to_run = ++st->state;
     651             :                 } else {
     652             :                         if (st->state <= target)
     653             :                                 return false;
     654             : 
     655             :                         *state_to_run = st->state--;
     656             :                 }
     657             : 
     658             :                 if (!cpuhp_step_empty(bringup, cpuhp_get_step(*state_to_run)))
     659             :                         break;
     660             :         } while (true);
     661             : 
     662             :         return true;
     663             : }
     664             : 
     665             : static int cpuhp_invoke_callback_range(bool bringup,
     666             :                                        unsigned int cpu,
     667             :                                        struct cpuhp_cpu_state *st,
     668             :                                        enum cpuhp_state target)
     669             : {
     670             :         enum cpuhp_state state;
     671             :         int err = 0;
     672             : 
     673             :         while (cpuhp_next_state(bringup, &state, st, target)) {
     674             :                 err = cpuhp_invoke_callback(cpu, state, bringup, NULL, NULL);
     675             :                 if (err)
     676             :                         break;
     677             :         }
     678             : 
     679             :         return err;
     680             : }
     681             : 
     682             : static inline bool can_rollback_cpu(struct cpuhp_cpu_state *st)
     683             : {
     684             :         if (IS_ENABLED(CONFIG_HOTPLUG_CPU))
     685             :                 return true;
     686             :         /*
     687             :          * When CPU hotplug is disabled, then taking the CPU down is not
     688             :          * possible because takedown_cpu() and the architecture and
     689             :          * subsystem specific mechanisms are not available. So the CPU
     690             :          * which would be completely unplugged again needs to stay around
     691             :          * in the current state.
     692             :          */
     693             :         return st->state <= CPUHP_BRINGUP_CPU;
     694             : }
     695             : 
     696             : static int cpuhp_up_callbacks(unsigned int cpu, struct cpuhp_cpu_state *st,
     697             :                               enum cpuhp_state target)
     698             : {
     699             :         enum cpuhp_state prev_state = st->state;
     700             :         int ret = 0;
     701             : 
     702             :         ret = cpuhp_invoke_callback_range(true, cpu, st, target);
     703             :         if (ret) {
     704             :                 pr_debug("CPU UP failed (%d) CPU %u state %s (%d)\n",
     705             :                          ret, cpu, cpuhp_get_step(st->state)->name,
     706             :                          st->state);
     707             : 
     708             :                 cpuhp_reset_state(cpu, st, prev_state);
     709             :                 if (can_rollback_cpu(st))
     710             :                         WARN_ON(cpuhp_invoke_callback_range(false, cpu, st,
     711             :                                                             prev_state));
     712             :         }
     713             :         return ret;
     714             : }
     715             : 
     716             : /*
     717             :  * The cpu hotplug threads manage the bringup and teardown of the cpus
     718             :  */
     719             : static void cpuhp_create(unsigned int cpu)
     720             : {
     721             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
     722             : 
     723             :         init_completion(&st->done_up);
     724             :         init_completion(&st->done_down);
     725             : }
     726             : 
     727             : static int cpuhp_should_run(unsigned int cpu)
     728             : {
     729             :         struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
     730             : 
     731             :         return st->should_run;
     732             : }
     733             : 
     734             : /*
     735             :  * Execute teardown/startup callbacks on the plugged cpu. Also used to invoke
     736             :  * callbacks when a state gets [un]installed at runtime.
     737             :  *
     738             :  * Each invocation of this function by the smpboot thread does a single AP
     739             :  * state callback.
     740             :  *
     741             :  * It has 3 modes of operation:
     742             :  *  - single: runs st->cb_state
     743             :  *  - up:     runs ++st->state, while st->state < st->target
     744             :  *  - down:   runs st->state--, while st->state > st->target
     745             :  *
     746             :  * When complete or on error, should_run is cleared and the completion is fired.
     747             :  */
     748             : static void cpuhp_thread_fun(unsigned int cpu)
     749             : {
     750             :         struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
     751             :         bool bringup = st->bringup;
     752             :         enum cpuhp_state state;
     753             : 
     754             :         if (WARN_ON_ONCE(!st->should_run))
     755             :                 return;
     756             : 
     757             :         /*
     758             :          * ACQUIRE for the cpuhp_should_run() load of ->should_run. Ensures
     759             :          * that if we see ->should_run we also see the rest of the state.
     760             :          */
     761             :         smp_mb();
     762             : 
     763             :         /*
     764             :          * The BP holds the hotplug lock, but we're now running on the AP,
     765             :          * ensure that anybody asserting the lock is held, will actually find
     766             :          * it so.
     767             :          */
     768             :         lockdep_acquire_cpus_lock();
     769             :         cpuhp_lock_acquire(bringup);
     770             : 
     771             :         if (st->single) {
     772             :                 state = st->cb_state;
     773             :                 st->should_run = false;
     774             :         } else {
     775             :                 st->should_run = cpuhp_next_state(bringup, &state, st, st->target);
     776             :                 if (!st->should_run)
     777             :                         goto end;
     778             :         }
     779             : 
     780             :         WARN_ON_ONCE(!cpuhp_is_ap_state(state));
     781             : 
     782             :         if (cpuhp_is_atomic_state(state)) {
     783             :                 local_irq_disable();
     784             :                 st->result = cpuhp_invoke_callback(cpu, state, bringup, st->node, &st->last);
     785             :                 local_irq_enable();
     786             : 
     787             :                 /*
     788             :                  * STARTING/DYING must not fail!
     789             :                  */
     790             :                 WARN_ON_ONCE(st->result);
     791             :         } else {
     792             :                 st->result = cpuhp_invoke_callback(cpu, state, bringup, st->node, &st->last);
     793             :         }
     794             : 
     795             :         if (st->result) {
     796             :                 /*
     797             :                  * If we fail on a rollback, we're up a creek without no
     798             :                  * paddle, no way forward, no way back. We loose, thanks for
     799             :                  * playing.
     800             :                  */
     801             :                 WARN_ON_ONCE(st->rollback);
     802             :                 st->should_run = false;
     803             :         }
     804             : 
     805             : end:
     806             :         cpuhp_lock_release(bringup);
     807             :         lockdep_release_cpus_lock();
     808             : 
     809             :         if (!st->should_run)
     810             :                 complete_ap_thread(st, bringup);
     811             : }
     812             : 
     813             : /* Invoke a single callback on a remote cpu */
     814             : static int
     815             : cpuhp_invoke_ap_callback(int cpu, enum cpuhp_state state, bool bringup,
     816             :                          struct hlist_node *node)
     817             : {
     818             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
     819             :         int ret;
     820             : 
     821             :         if (!cpu_online(cpu))
     822             :                 return 0;
     823             : 
     824             :         cpuhp_lock_acquire(false);
     825             :         cpuhp_lock_release(false);
     826             : 
     827             :         cpuhp_lock_acquire(true);
     828             :         cpuhp_lock_release(true);
     829             : 
     830             :         /*
     831             :          * If we are up and running, use the hotplug thread. For early calls
     832             :          * we invoke the thread function directly.
     833             :          */
     834             :         if (!st->thread)
     835             :                 return cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
     836             : 
     837             :         st->rollback = false;
     838             :         st->last = NULL;
     839             : 
     840             :         st->node = node;
     841             :         st->bringup = bringup;
     842             :         st->cb_state = state;
     843             :         st->single = true;
     844             : 
     845             :         __cpuhp_kick_ap(st);
     846             : 
     847             :         /*
     848             :          * If we failed and did a partial, do a rollback.
     849             :          */
     850             :         if ((ret = st->result) && st->last) {
     851             :                 st->rollback = true;
     852             :                 st->bringup = !bringup;
     853             : 
     854             :                 __cpuhp_kick_ap(st);
     855             :         }
     856             : 
     857             :         /*
     858             :          * Clean up the leftovers so the next hotplug operation wont use stale
     859             :          * data.
     860             :          */
     861             :         st->node = st->last = NULL;
     862             :         return ret;
     863             : }
     864             : 
     865             : static int cpuhp_kick_ap_work(unsigned int cpu)
     866             : {
     867             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
     868             :         enum cpuhp_state prev_state = st->state;
     869             :         int ret;
     870             : 
     871             :         cpuhp_lock_acquire(false);
     872             :         cpuhp_lock_release(false);
     873             : 
     874             :         cpuhp_lock_acquire(true);
     875             :         cpuhp_lock_release(true);
     876             : 
     877             :         trace_cpuhp_enter(cpu, st->target, prev_state, cpuhp_kick_ap_work);
     878             :         ret = cpuhp_kick_ap(cpu, st, st->target);
     879             :         trace_cpuhp_exit(cpu, st->state, prev_state, ret);
     880             : 
     881             :         return ret;
     882             : }
     883             : 
     884             : static struct smp_hotplug_thread cpuhp_threads = {
     885             :         .store                  = &cpuhp_state.thread,
     886             :         .create                 = &cpuhp_create,
     887             :         .thread_should_run      = cpuhp_should_run,
     888             :         .thread_fn              = cpuhp_thread_fun,
     889             :         .thread_comm            = "cpuhp/%u",
     890             :         .selfparking            = true,
     891             : };
     892             : 
     893             : void __init cpuhp_threads_init(void)
     894             : {
     895             :         BUG_ON(smpboot_register_percpu_thread(&cpuhp_threads));
     896             :         kthread_unpark(this_cpu_read(cpuhp_state.thread));
     897             : }
     898             : 
     899             : /*
     900             :  *
     901             :  * Serialize hotplug trainwrecks outside of the cpu_hotplug_lock
     902             :  * protected region.
     903             :  *
     904             :  * The operation is still serialized against concurrent CPU hotplug via
     905             :  * cpu_add_remove_lock, i.e. CPU map protection.  But it is _not_
     906             :  * serialized against other hotplug related activity like adding or
     907             :  * removing of state callbacks and state instances, which invoke either the
     908             :  * startup or the teardown callback of the affected state.
     909             :  *
     910             :  * This is required for subsystems which are unfixable vs. CPU hotplug and
     911             :  * evade lock inversion problems by scheduling work which has to be
     912             :  * completed _before_ cpu_up()/_cpu_down() returns.
     913             :  *
     914             :  * Don't even think about adding anything to this for any new code or even
     915             :  * drivers. It's only purpose is to keep existing lock order trainwrecks
     916             :  * working.
     917             :  *
     918             :  * For cpu_down() there might be valid reasons to finish cleanups which are
     919             :  * not required to be done under cpu_hotplug_lock, but that's a different
     920             :  * story and would be not invoked via this.
     921             :  */
     922             : static void cpu_up_down_serialize_trainwrecks(bool tasks_frozen)
     923             : {
     924             :         /*
     925             :          * cpusets delegate hotplug operations to a worker to "solve" the
     926             :          * lock order problems. Wait for the worker, but only if tasks are
     927             :          * _not_ frozen (suspend, hibernate) as that would wait forever.
     928             :          *
     929             :          * The wait is required because otherwise the hotplug operation
     930             :          * returns with inconsistent state, which could even be observed in
     931             :          * user space when a new CPU is brought up. The CPU plug uevent
     932             :          * would be delivered and user space reacting on it would fail to
     933             :          * move tasks to the newly plugged CPU up to the point where the
     934             :          * work has finished because up to that point the newly plugged CPU
     935             :          * is not assignable in cpusets/cgroups. On unplug that's not
     936             :          * necessarily a visible issue, but it is still inconsistent state,
     937             :          * which is the real problem which needs to be "fixed". This can't
     938             :          * prevent the transient state between scheduling the work and
     939             :          * returning from waiting for it.
     940             :          */
     941             :         if (!tasks_frozen)
     942             :                 cpuset_wait_for_hotplug();
     943             : }
     944             : 
     945             : #ifdef CONFIG_HOTPLUG_CPU
     946             : #ifndef arch_clear_mm_cpumask_cpu
     947             : #define arch_clear_mm_cpumask_cpu(cpu, mm) cpumask_clear_cpu(cpu, mm_cpumask(mm))
     948             : #endif
     949             : 
     950             : /**
     951             :  * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU
     952             :  * @cpu: a CPU id
     953             :  *
     954             :  * This function walks all processes, finds a valid mm struct for each one and
     955             :  * then clears a corresponding bit in mm's cpumask.  While this all sounds
     956             :  * trivial, there are various non-obvious corner cases, which this function
     957             :  * tries to solve in a safe manner.
     958             :  *
     959             :  * Also note that the function uses a somewhat relaxed locking scheme, so it may
     960             :  * be called only for an already offlined CPU.
     961             :  */
     962             : void clear_tasks_mm_cpumask(int cpu)
     963             : {
     964             :         struct task_struct *p;
     965             : 
     966             :         /*
     967             :          * This function is called after the cpu is taken down and marked
     968             :          * offline, so its not like new tasks will ever get this cpu set in
     969             :          * their mm mask. -- Peter Zijlstra
     970             :          * Thus, we may use rcu_read_lock() here, instead of grabbing
     971             :          * full-fledged tasklist_lock.
     972             :          */
     973             :         WARN_ON(cpu_online(cpu));
     974             :         rcu_read_lock();
     975             :         for_each_process(p) {
     976             :                 struct task_struct *t;
     977             : 
     978             :                 /*
     979             :                  * Main thread might exit, but other threads may still have
     980             :                  * a valid mm. Find one.
     981             :                  */
     982             :                 t = find_lock_task_mm(p);
     983             :                 if (!t)
     984             :                         continue;
     985             :                 arch_clear_mm_cpumask_cpu(cpu, t->mm);
     986             :                 task_unlock(t);
     987             :         }
     988             :         rcu_read_unlock();
     989             : }
     990             : 
     991             : /* Take this CPU down. */
     992             : static int take_cpu_down(void *_param)
     993             : {
     994             :         struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
     995             :         enum cpuhp_state target = max((int)st->target, CPUHP_AP_OFFLINE);
     996             :         int err, cpu = smp_processor_id();
     997             :         int ret;
     998             : 
     999             :         /* Ensure this CPU doesn't handle any more interrupts. */
    1000             :         err = __cpu_disable();
    1001             :         if (err < 0)
    1002             :                 return err;
    1003             : 
    1004             :         /*
    1005             :          * Must be called from CPUHP_TEARDOWN_CPU, which means, as we are going
    1006             :          * down, that the current state is CPUHP_TEARDOWN_CPU - 1.
    1007             :          */
    1008             :         WARN_ON(st->state != (CPUHP_TEARDOWN_CPU - 1));
    1009             : 
    1010             :         /* Invoke the former CPU_DYING callbacks */
    1011             :         ret = cpuhp_invoke_callback_range(false, cpu, st, target);
    1012             : 
    1013             :         /*
    1014             :          * DYING must not fail!
    1015             :          */
    1016             :         WARN_ON_ONCE(ret);
    1017             : 
    1018             :         /* Give up timekeeping duties */
    1019             :         tick_handover_do_timer();
    1020             :         /* Remove CPU from timer broadcasting */
    1021             :         tick_offline_cpu(cpu);
    1022             :         /* Park the stopper thread */
    1023             :         stop_machine_park(cpu);
    1024             :         return 0;
    1025             : }
    1026             : 
    1027             : static int takedown_cpu(unsigned int cpu)
    1028             : {
    1029             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    1030             :         int err;
    1031             : 
    1032             :         /* Park the smpboot threads */
    1033             :         kthread_park(st->thread);
    1034             : 
    1035             :         /*
    1036             :          * Prevent irq alloc/free while the dying cpu reorganizes the
    1037             :          * interrupt affinities.
    1038             :          */
    1039             :         irq_lock_sparse();
    1040             : 
    1041             :         /*
    1042             :          * So now all preempt/rcu users must observe !cpu_active().
    1043             :          */
    1044             :         err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu));
    1045             :         if (err) {
    1046             :                 /* CPU refused to die */
    1047             :                 irq_unlock_sparse();
    1048             :                 /* Unpark the hotplug thread so we can rollback there */
    1049             :                 kthread_unpark(st->thread);
    1050             :                 return err;
    1051             :         }
    1052             :         BUG_ON(cpu_online(cpu));
    1053             : 
    1054             :         /*
    1055             :          * The teardown callback for CPUHP_AP_SCHED_STARTING will have removed
    1056             :          * all runnable tasks from the CPU, there's only the idle task left now
    1057             :          * that the migration thread is done doing the stop_machine thing.
    1058             :          *
    1059             :          * Wait for the stop thread to go away.
    1060             :          */
    1061             :         wait_for_ap_thread(st, false);
    1062             :         BUG_ON(st->state != CPUHP_AP_IDLE_DEAD);
    1063             : 
    1064             :         /* Interrupts are moved away from the dying cpu, reenable alloc/free */
    1065             :         irq_unlock_sparse();
    1066             : 
    1067             :         hotplug_cpu__broadcast_tick_pull(cpu);
    1068             :         /* This actually kills the CPU. */
    1069             :         __cpu_die(cpu);
    1070             : 
    1071             :         tick_cleanup_dead_cpu(cpu);
    1072             :         rcutree_migrate_callbacks(cpu);
    1073             :         return 0;
    1074             : }
    1075             : 
    1076             : static void cpuhp_complete_idle_dead(void *arg)
    1077             : {
    1078             :         struct cpuhp_cpu_state *st = arg;
    1079             : 
    1080             :         complete_ap_thread(st, false);
    1081             : }
    1082             : 
    1083             : void cpuhp_report_idle_dead(void)
    1084             : {
    1085             :         struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
    1086             : 
    1087             :         BUG_ON(st->state != CPUHP_AP_OFFLINE);
    1088             :         rcu_report_dead(smp_processor_id());
    1089             :         st->state = CPUHP_AP_IDLE_DEAD;
    1090             :         /*
    1091             :          * We cannot call complete after rcu_report_dead() so we delegate it
    1092             :          * to an online cpu.
    1093             :          */
    1094             :         smp_call_function_single(cpumask_first(cpu_online_mask),
    1095             :                                  cpuhp_complete_idle_dead, st, 0);
    1096             : }
    1097             : 
    1098             : static int cpuhp_down_callbacks(unsigned int cpu, struct cpuhp_cpu_state *st,
    1099             :                                 enum cpuhp_state target)
    1100             : {
    1101             :         enum cpuhp_state prev_state = st->state;
    1102             :         int ret = 0;
    1103             : 
    1104             :         ret = cpuhp_invoke_callback_range(false, cpu, st, target);
    1105             :         if (ret) {
    1106             :                 pr_debug("CPU DOWN failed (%d) CPU %u state %s (%d)\n",
    1107             :                          ret, cpu, cpuhp_get_step(st->state)->name,
    1108             :                          st->state);
    1109             : 
    1110             :                 cpuhp_reset_state(cpu, st, prev_state);
    1111             : 
    1112             :                 if (st->state < prev_state)
    1113             :                         WARN_ON(cpuhp_invoke_callback_range(true, cpu, st,
    1114             :                                                             prev_state));
    1115             :         }
    1116             : 
    1117             :         return ret;
    1118             : }
    1119             : 
    1120             : /* Requires cpu_add_remove_lock to be held */
    1121             : static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
    1122             :                            enum cpuhp_state target)
    1123             : {
    1124             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    1125             :         int prev_state, ret = 0;
    1126             : 
    1127             :         if (num_online_cpus() == 1)
    1128             :                 return -EBUSY;
    1129             : 
    1130             :         if (!cpu_present(cpu))
    1131             :                 return -EINVAL;
    1132             : 
    1133             :         cpus_write_lock();
    1134             : 
    1135             :         cpuhp_tasks_frozen = tasks_frozen;
    1136             : 
    1137             :         prev_state = cpuhp_set_state(cpu, st, target);
    1138             :         /*
    1139             :          * If the current CPU state is in the range of the AP hotplug thread,
    1140             :          * then we need to kick the thread.
    1141             :          */
    1142             :         if (st->state > CPUHP_TEARDOWN_CPU) {
    1143             :                 st->target = max((int)target, CPUHP_TEARDOWN_CPU);
    1144             :                 ret = cpuhp_kick_ap_work(cpu);
    1145             :                 /*
    1146             :                  * The AP side has done the error rollback already. Just
    1147             :                  * return the error code..
    1148             :                  */
    1149             :                 if (ret)
    1150             :                         goto out;
    1151             : 
    1152             :                 /*
    1153             :                  * We might have stopped still in the range of the AP hotplug
    1154             :                  * thread. Nothing to do anymore.
    1155             :                  */
    1156             :                 if (st->state > CPUHP_TEARDOWN_CPU)
    1157             :                         goto out;
    1158             : 
    1159             :                 st->target = target;
    1160             :         }
    1161             :         /*
    1162             :          * The AP brought itself down to CPUHP_TEARDOWN_CPU. So we need
    1163             :          * to do the further cleanups.
    1164             :          */
    1165             :         ret = cpuhp_down_callbacks(cpu, st, target);
    1166             :         if (ret && st->state < prev_state) {
    1167             :                 if (st->state == CPUHP_TEARDOWN_CPU) {
    1168             :                         cpuhp_reset_state(cpu, st, prev_state);
    1169             :                         __cpuhp_kick_ap(st);
    1170             :                 } else {
    1171             :                         WARN(1, "DEAD callback error for CPU%d", cpu);
    1172             :                 }
    1173             :         }
    1174             : 
    1175             : out:
    1176             :         cpus_write_unlock();
    1177             :         /*
    1178             :          * Do post unplug cleanup. This is still protected against
    1179             :          * concurrent CPU hotplug via cpu_add_remove_lock.
    1180             :          */
    1181             :         lockup_detector_cleanup();
    1182             :         arch_smt_update();
    1183             :         cpu_up_down_serialize_trainwrecks(tasks_frozen);
    1184             :         return ret;
    1185             : }
    1186             : 
    1187             : static int cpu_down_maps_locked(unsigned int cpu, enum cpuhp_state target)
    1188             : {
    1189             :         if (cpu_hotplug_disabled)
    1190             :                 return -EBUSY;
    1191             :         return _cpu_down(cpu, 0, target);
    1192             : }
    1193             : 
    1194             : static int cpu_down(unsigned int cpu, enum cpuhp_state target)
    1195             : {
    1196             :         int err;
    1197             : 
    1198             :         cpu_maps_update_begin();
    1199             :         err = cpu_down_maps_locked(cpu, target);
    1200             :         cpu_maps_update_done();
    1201             :         return err;
    1202             : }
    1203             : 
    1204             : /**
    1205             :  * cpu_device_down - Bring down a cpu device
    1206             :  * @dev: Pointer to the cpu device to offline
    1207             :  *
    1208             :  * This function is meant to be used by device core cpu subsystem only.
    1209             :  *
    1210             :  * Other subsystems should use remove_cpu() instead.
    1211             :  *
    1212             :  * Return: %0 on success or a negative errno code
    1213             :  */
    1214             : int cpu_device_down(struct device *dev)
    1215             : {
    1216             :         return cpu_down(dev->id, CPUHP_OFFLINE);
    1217             : }
    1218             : 
    1219             : int remove_cpu(unsigned int cpu)
    1220             : {
    1221             :         int ret;
    1222             : 
    1223             :         lock_device_hotplug();
    1224             :         ret = device_offline(get_cpu_device(cpu));
    1225             :         unlock_device_hotplug();
    1226             : 
    1227             :         return ret;
    1228             : }
    1229             : EXPORT_SYMBOL_GPL(remove_cpu);
    1230             : 
    1231             : void smp_shutdown_nonboot_cpus(unsigned int primary_cpu)
    1232             : {
    1233             :         unsigned int cpu;
    1234             :         int error;
    1235             : 
    1236             :         cpu_maps_update_begin();
    1237             : 
    1238             :         /*
    1239             :          * Make certain the cpu I'm about to reboot on is online.
    1240             :          *
    1241             :          * This is inline to what migrate_to_reboot_cpu() already do.
    1242             :          */
    1243             :         if (!cpu_online(primary_cpu))
    1244             :                 primary_cpu = cpumask_first(cpu_online_mask);
    1245             : 
    1246             :         for_each_online_cpu(cpu) {
    1247             :                 if (cpu == primary_cpu)
    1248             :                         continue;
    1249             : 
    1250             :                 error = cpu_down_maps_locked(cpu, CPUHP_OFFLINE);
    1251             :                 if (error) {
    1252             :                         pr_err("Failed to offline CPU%d - error=%d",
    1253             :                                 cpu, error);
    1254             :                         break;
    1255             :                 }
    1256             :         }
    1257             : 
    1258             :         /*
    1259             :          * Ensure all but the reboot CPU are offline.
    1260             :          */
    1261             :         BUG_ON(num_online_cpus() > 1);
    1262             : 
    1263             :         /*
    1264             :          * Make sure the CPUs won't be enabled by someone else after this
    1265             :          * point. Kexec will reboot to a new kernel shortly resetting
    1266             :          * everything along the way.
    1267             :          */
    1268             :         cpu_hotplug_disabled++;
    1269             : 
    1270             :         cpu_maps_update_done();
    1271             : }
    1272             : 
    1273             : #else
    1274             : #define takedown_cpu            NULL
    1275             : #endif /*CONFIG_HOTPLUG_CPU*/
    1276             : 
    1277             : /**
    1278             :  * notify_cpu_starting(cpu) - Invoke the callbacks on the starting CPU
    1279             :  * @cpu: cpu that just started
    1280             :  *
    1281             :  * It must be called by the arch code on the new cpu, before the new cpu
    1282             :  * enables interrupts and before the "boot" cpu returns from __cpu_up().
    1283             :  */
    1284             : void notify_cpu_starting(unsigned int cpu)
    1285             : {
    1286             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    1287             :         enum cpuhp_state target = min((int)st->target, CPUHP_AP_ONLINE);
    1288             :         int ret;
    1289             : 
    1290             :         rcu_cpu_starting(cpu);  /* Enables RCU usage on this CPU. */
    1291             :         cpumask_set_cpu(cpu, &cpus_booted_once_mask);
    1292             :         ret = cpuhp_invoke_callback_range(true, cpu, st, target);
    1293             : 
    1294             :         /*
    1295             :          * STARTING must not fail!
    1296             :          */
    1297             :         WARN_ON_ONCE(ret);
    1298             : }
    1299             : 
    1300             : /*
    1301             :  * Called from the idle task. Wake up the controlling task which brings the
    1302             :  * hotplug thread of the upcoming CPU up and then delegates the rest of the
    1303             :  * online bringup to the hotplug thread.
    1304             :  */
    1305             : void cpuhp_online_idle(enum cpuhp_state state)
    1306             : {
    1307             :         struct cpuhp_cpu_state *st = this_cpu_ptr(&cpuhp_state);
    1308             : 
    1309             :         /* Happens for the boot cpu */
    1310             :         if (state != CPUHP_AP_ONLINE_IDLE)
    1311             :                 return;
    1312             : 
    1313             :         /*
    1314             :          * Unpart the stopper thread before we start the idle loop (and start
    1315             :          * scheduling); this ensures the stopper task is always available.
    1316             :          */
    1317             :         stop_machine_unpark(smp_processor_id());
    1318             : 
    1319             :         st->state = CPUHP_AP_ONLINE_IDLE;
    1320             :         complete_ap_thread(st, true);
    1321             : }
    1322             : 
    1323             : /* Requires cpu_add_remove_lock to be held */
    1324             : static int _cpu_up(unsigned int cpu, int tasks_frozen, enum cpuhp_state target)
    1325             : {
    1326             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    1327             :         struct task_struct *idle;
    1328             :         int ret = 0;
    1329             : 
    1330             :         cpus_write_lock();
    1331             : 
    1332             :         if (!cpu_present(cpu)) {
    1333             :                 ret = -EINVAL;
    1334             :                 goto out;
    1335             :         }
    1336             : 
    1337             :         /*
    1338             :          * The caller of cpu_up() might have raced with another
    1339             :          * caller. Nothing to do.
    1340             :          */
    1341             :         if (st->state >= target)
    1342             :                 goto out;
    1343             : 
    1344             :         if (st->state == CPUHP_OFFLINE) {
    1345             :                 /* Let it fail before we try to bring the cpu up */
    1346             :                 idle = idle_thread_get(cpu);
    1347             :                 if (IS_ERR(idle)) {
    1348             :                         ret = PTR_ERR(idle);
    1349             :                         goto out;
    1350             :                 }
    1351             :         }
    1352             : 
    1353             :         cpuhp_tasks_frozen = tasks_frozen;
    1354             : 
    1355             :         cpuhp_set_state(cpu, st, target);
    1356             :         /*
    1357             :          * If the current CPU state is in the range of the AP hotplug thread,
    1358             :          * then we need to kick the thread once more.
    1359             :          */
    1360             :         if (st->state > CPUHP_BRINGUP_CPU) {
    1361             :                 ret = cpuhp_kick_ap_work(cpu);
    1362             :                 /*
    1363             :                  * The AP side has done the error rollback already. Just
    1364             :                  * return the error code..
    1365             :                  */
    1366             :                 if (ret)
    1367             :                         goto out;
    1368             :         }
    1369             : 
    1370             :         /*
    1371             :          * Try to reach the target state. We max out on the BP at
    1372             :          * CPUHP_BRINGUP_CPU. After that the AP hotplug thread is
    1373             :          * responsible for bringing it up to the target state.
    1374             :          */
    1375             :         target = min((int)target, CPUHP_BRINGUP_CPU);
    1376             :         ret = cpuhp_up_callbacks(cpu, st, target);
    1377             : out:
    1378             :         cpus_write_unlock();
    1379             :         arch_smt_update();
    1380             :         cpu_up_down_serialize_trainwrecks(tasks_frozen);
    1381             :         return ret;
    1382             : }
    1383             : 
    1384             : static int cpu_up(unsigned int cpu, enum cpuhp_state target)
    1385             : {
    1386             :         int err = 0;
    1387             : 
    1388             :         if (!cpu_possible(cpu)) {
    1389             :                 pr_err("can't online cpu %d because it is not configured as may-hotadd at boot time\n",
    1390             :                        cpu);
    1391             : #if defined(CONFIG_IA64)
    1392             :                 pr_err("please check additional_cpus= boot parameter\n");
    1393             : #endif
    1394             :                 return -EINVAL;
    1395             :         }
    1396             : 
    1397             :         err = try_online_node(cpu_to_node(cpu));
    1398             :         if (err)
    1399             :                 return err;
    1400             : 
    1401             :         cpu_maps_update_begin();
    1402             : 
    1403             :         if (cpu_hotplug_disabled) {
    1404             :                 err = -EBUSY;
    1405             :                 goto out;
    1406             :         }
    1407             :         if (!cpu_smt_allowed(cpu)) {
    1408             :                 err = -EPERM;
    1409             :                 goto out;
    1410             :         }
    1411             : 
    1412             :         err = _cpu_up(cpu, 0, target);
    1413             : out:
    1414             :         cpu_maps_update_done();
    1415             :         return err;
    1416             : }
    1417             : 
    1418             : /**
    1419             :  * cpu_device_up - Bring up a cpu device
    1420             :  * @dev: Pointer to the cpu device to online
    1421             :  *
    1422             :  * This function is meant to be used by device core cpu subsystem only.
    1423             :  *
    1424             :  * Other subsystems should use add_cpu() instead.
    1425             :  *
    1426             :  * Return: %0 on success or a negative errno code
    1427             :  */
    1428             : int cpu_device_up(struct device *dev)
    1429             : {
    1430             :         return cpu_up(dev->id, CPUHP_ONLINE);
    1431             : }
    1432             : 
    1433             : int add_cpu(unsigned int cpu)
    1434             : {
    1435             :         int ret;
    1436             : 
    1437             :         lock_device_hotplug();
    1438             :         ret = device_online(get_cpu_device(cpu));
    1439             :         unlock_device_hotplug();
    1440             : 
    1441             :         return ret;
    1442             : }
    1443             : EXPORT_SYMBOL_GPL(add_cpu);
    1444             : 
    1445             : /**
    1446             :  * bringup_hibernate_cpu - Bring up the CPU that we hibernated on
    1447             :  * @sleep_cpu: The cpu we hibernated on and should be brought up.
    1448             :  *
    1449             :  * On some architectures like arm64, we can hibernate on any CPU, but on
    1450             :  * wake up the CPU we hibernated on might be offline as a side effect of
    1451             :  * using maxcpus= for example.
    1452             :  *
    1453             :  * Return: %0 on success or a negative errno code
    1454             :  */
    1455             : int bringup_hibernate_cpu(unsigned int sleep_cpu)
    1456             : {
    1457             :         int ret;
    1458             : 
    1459             :         if (!cpu_online(sleep_cpu)) {
    1460             :                 pr_info("Hibernated on a CPU that is offline! Bringing CPU up.\n");
    1461             :                 ret = cpu_up(sleep_cpu, CPUHP_ONLINE);
    1462             :                 if (ret) {
    1463             :                         pr_err("Failed to bring hibernate-CPU up!\n");
    1464             :                         return ret;
    1465             :                 }
    1466             :         }
    1467             :         return 0;
    1468             : }
    1469             : 
    1470             : void bringup_nonboot_cpus(unsigned int setup_max_cpus)
    1471             : {
    1472             :         unsigned int cpu;
    1473             : 
    1474             :         for_each_present_cpu(cpu) {
    1475             :                 if (num_online_cpus() >= setup_max_cpus)
    1476             :                         break;
    1477             :                 if (!cpu_online(cpu))
    1478             :                         cpu_up(cpu, CPUHP_ONLINE);
    1479             :         }
    1480             : }
    1481             : 
    1482             : #ifdef CONFIG_PM_SLEEP_SMP
    1483             : static cpumask_var_t frozen_cpus;
    1484             : 
    1485             : int freeze_secondary_cpus(int primary)
    1486             : {
    1487             :         int cpu, error = 0;
    1488             : 
    1489             :         cpu_maps_update_begin();
    1490             :         if (primary == -1) {
    1491             :                 primary = cpumask_first(cpu_online_mask);
    1492             :                 if (!housekeeping_cpu(primary, HK_TYPE_TIMER))
    1493             :                         primary = housekeeping_any_cpu(HK_TYPE_TIMER);
    1494             :         } else {
    1495             :                 if (!cpu_online(primary))
    1496             :                         primary = cpumask_first(cpu_online_mask);
    1497             :         }
    1498             : 
    1499             :         /*
    1500             :          * We take down all of the non-boot CPUs in one shot to avoid races
    1501             :          * with the userspace trying to use the CPU hotplug at the same time
    1502             :          */
    1503             :         cpumask_clear(frozen_cpus);
    1504             : 
    1505             :         pr_info("Disabling non-boot CPUs ...\n");
    1506             :         for_each_online_cpu(cpu) {
    1507             :                 if (cpu == primary)
    1508             :                         continue;
    1509             : 
    1510             :                 if (pm_wakeup_pending()) {
    1511             :                         pr_info("Wakeup pending. Abort CPU freeze\n");
    1512             :                         error = -EBUSY;
    1513             :                         break;
    1514             :                 }
    1515             : 
    1516             :                 trace_suspend_resume(TPS("CPU_OFF"), cpu, true);
    1517             :                 error = _cpu_down(cpu, 1, CPUHP_OFFLINE);
    1518             :                 trace_suspend_resume(TPS("CPU_OFF"), cpu, false);
    1519             :                 if (!error)
    1520             :                         cpumask_set_cpu(cpu, frozen_cpus);
    1521             :                 else {
    1522             :                         pr_err("Error taking CPU%d down: %d\n", cpu, error);
    1523             :                         break;
    1524             :                 }
    1525             :         }
    1526             : 
    1527             :         if (!error)
    1528             :                 BUG_ON(num_online_cpus() > 1);
    1529             :         else
    1530             :                 pr_err("Non-boot CPUs are not disabled\n");
    1531             : 
    1532             :         /*
    1533             :          * Make sure the CPUs won't be enabled by someone else. We need to do
    1534             :          * this even in case of failure as all freeze_secondary_cpus() users are
    1535             :          * supposed to do thaw_secondary_cpus() on the failure path.
    1536             :          */
    1537             :         cpu_hotplug_disabled++;
    1538             : 
    1539             :         cpu_maps_update_done();
    1540             :         return error;
    1541             : }
    1542             : 
    1543             : void __weak arch_thaw_secondary_cpus_begin(void)
    1544             : {
    1545             : }
    1546             : 
    1547             : void __weak arch_thaw_secondary_cpus_end(void)
    1548             : {
    1549             : }
    1550             : 
    1551             : void thaw_secondary_cpus(void)
    1552             : {
    1553             :         int cpu, error;
    1554             : 
    1555             :         /* Allow everyone to use the CPU hotplug again */
    1556             :         cpu_maps_update_begin();
    1557             :         __cpu_hotplug_enable();
    1558             :         if (cpumask_empty(frozen_cpus))
    1559             :                 goto out;
    1560             : 
    1561             :         pr_info("Enabling non-boot CPUs ...\n");
    1562             : 
    1563             :         arch_thaw_secondary_cpus_begin();
    1564             : 
    1565             :         for_each_cpu(cpu, frozen_cpus) {
    1566             :                 trace_suspend_resume(TPS("CPU_ON"), cpu, true);
    1567             :                 error = _cpu_up(cpu, 1, CPUHP_ONLINE);
    1568             :                 trace_suspend_resume(TPS("CPU_ON"), cpu, false);
    1569             :                 if (!error) {
    1570             :                         pr_info("CPU%d is up\n", cpu);
    1571             :                         continue;
    1572             :                 }
    1573             :                 pr_warn("Error taking CPU%d up: %d\n", cpu, error);
    1574             :         }
    1575             : 
    1576             :         arch_thaw_secondary_cpus_end();
    1577             : 
    1578             :         cpumask_clear(frozen_cpus);
    1579             : out:
    1580             :         cpu_maps_update_done();
    1581             : }
    1582             : 
    1583             : static int __init alloc_frozen_cpus(void)
    1584             : {
    1585             :         if (!alloc_cpumask_var(&frozen_cpus, GFP_KERNEL|__GFP_ZERO))
    1586             :                 return -ENOMEM;
    1587             :         return 0;
    1588             : }
    1589             : core_initcall(alloc_frozen_cpus);
    1590             : 
    1591             : /*
    1592             :  * When callbacks for CPU hotplug notifications are being executed, we must
    1593             :  * ensure that the state of the system with respect to the tasks being frozen
    1594             :  * or not, as reported by the notification, remains unchanged *throughout the
    1595             :  * duration* of the execution of the callbacks.
    1596             :  * Hence we need to prevent the freezer from racing with regular CPU hotplug.
    1597             :  *
    1598             :  * This synchronization is implemented by mutually excluding regular CPU
    1599             :  * hotplug and Suspend/Hibernate call paths by hooking onto the Suspend/
    1600             :  * Hibernate notifications.
    1601             :  */
    1602             : static int
    1603             : cpu_hotplug_pm_callback(struct notifier_block *nb,
    1604             :                         unsigned long action, void *ptr)
    1605             : {
    1606             :         switch (action) {
    1607             : 
    1608             :         case PM_SUSPEND_PREPARE:
    1609             :         case PM_HIBERNATION_PREPARE:
    1610             :                 cpu_hotplug_disable();
    1611             :                 break;
    1612             : 
    1613             :         case PM_POST_SUSPEND:
    1614             :         case PM_POST_HIBERNATION:
    1615             :                 cpu_hotplug_enable();
    1616             :                 break;
    1617             : 
    1618             :         default:
    1619             :                 return NOTIFY_DONE;
    1620             :         }
    1621             : 
    1622             :         return NOTIFY_OK;
    1623             : }
    1624             : 
    1625             : 
    1626             : static int __init cpu_hotplug_pm_sync_init(void)
    1627             : {
    1628             :         /*
    1629             :          * cpu_hotplug_pm_callback has higher priority than x86
    1630             :          * bsp_pm_callback which depends on cpu_hotplug_pm_callback
    1631             :          * to disable cpu hotplug to avoid cpu hotplug race.
    1632             :          */
    1633             :         pm_notifier(cpu_hotplug_pm_callback, 0);
    1634             :         return 0;
    1635             : }
    1636             : core_initcall(cpu_hotplug_pm_sync_init);
    1637             : 
    1638             : #endif /* CONFIG_PM_SLEEP_SMP */
    1639             : 
    1640             : int __boot_cpu_id;
    1641             : 
    1642             : #endif /* CONFIG_SMP */
    1643             : 
    1644             : /* Boot processor state steps */
    1645             : static struct cpuhp_step cpuhp_hp_states[] = {
    1646             :         [CPUHP_OFFLINE] = {
    1647             :                 .name                   = "offline",
    1648             :                 .startup.single         = NULL,
    1649             :                 .teardown.single        = NULL,
    1650             :         },
    1651             : #ifdef CONFIG_SMP
    1652             :         [CPUHP_CREATE_THREADS]= {
    1653             :                 .name                   = "threads:prepare",
    1654             :                 .startup.single         = smpboot_create_threads,
    1655             :                 .teardown.single        = NULL,
    1656             :                 .cant_stop              = true,
    1657             :         },
    1658             :         [CPUHP_PERF_PREPARE] = {
    1659             :                 .name                   = "perf:prepare",
    1660             :                 .startup.single         = perf_event_init_cpu,
    1661             :                 .teardown.single        = perf_event_exit_cpu,
    1662             :         },
    1663             :         [CPUHP_RANDOM_PREPARE] = {
    1664             :                 .name                   = "random:prepare",
    1665             :                 .startup.single         = random_prepare_cpu,
    1666             :                 .teardown.single        = NULL,
    1667             :         },
    1668             :         [CPUHP_WORKQUEUE_PREP] = {
    1669             :                 .name                   = "workqueue:prepare",
    1670             :                 .startup.single         = workqueue_prepare_cpu,
    1671             :                 .teardown.single        = NULL,
    1672             :         },
    1673             :         [CPUHP_HRTIMERS_PREPARE] = {
    1674             :                 .name                   = "hrtimers:prepare",
    1675             :                 .startup.single         = hrtimers_prepare_cpu,
    1676             :                 .teardown.single        = hrtimers_dead_cpu,
    1677             :         },
    1678             :         [CPUHP_SMPCFD_PREPARE] = {
    1679             :                 .name                   = "smpcfd:prepare",
    1680             :                 .startup.single         = smpcfd_prepare_cpu,
    1681             :                 .teardown.single        = smpcfd_dead_cpu,
    1682             :         },
    1683             :         [CPUHP_RELAY_PREPARE] = {
    1684             :                 .name                   = "relay:prepare",
    1685             :                 .startup.single         = relay_prepare_cpu,
    1686             :                 .teardown.single        = NULL,
    1687             :         },
    1688             :         [CPUHP_SLAB_PREPARE] = {
    1689             :                 .name                   = "slab:prepare",
    1690             :                 .startup.single         = slab_prepare_cpu,
    1691             :                 .teardown.single        = slab_dead_cpu,
    1692             :         },
    1693             :         [CPUHP_RCUTREE_PREP] = {
    1694             :                 .name                   = "RCU/tree:prepare",
    1695             :                 .startup.single         = rcutree_prepare_cpu,
    1696             :                 .teardown.single        = rcutree_dead_cpu,
    1697             :         },
    1698             :         /*
    1699             :          * On the tear-down path, timers_dead_cpu() must be invoked
    1700             :          * before blk_mq_queue_reinit_notify() from notify_dead(),
    1701             :          * otherwise a RCU stall occurs.
    1702             :          */
    1703             :         [CPUHP_TIMERS_PREPARE] = {
    1704             :                 .name                   = "timers:prepare",
    1705             :                 .startup.single         = timers_prepare_cpu,
    1706             :                 .teardown.single        = timers_dead_cpu,
    1707             :         },
    1708             :         /* Kicks the plugged cpu into life */
    1709             :         [CPUHP_BRINGUP_CPU] = {
    1710             :                 .name                   = "cpu:bringup",
    1711             :                 .startup.single         = bringup_cpu,
    1712             :                 .teardown.single        = finish_cpu,
    1713             :                 .cant_stop              = true,
    1714             :         },
    1715             :         /* Final state before CPU kills itself */
    1716             :         [CPUHP_AP_IDLE_DEAD] = {
    1717             :                 .name                   = "idle:dead",
    1718             :         },
    1719             :         /*
    1720             :          * Last state before CPU enters the idle loop to die. Transient state
    1721             :          * for synchronization.
    1722             :          */
    1723             :         [CPUHP_AP_OFFLINE] = {
    1724             :                 .name                   = "ap:offline",
    1725             :                 .cant_stop              = true,
    1726             :         },
    1727             :         /* First state is scheduler control. Interrupts are disabled */
    1728             :         [CPUHP_AP_SCHED_STARTING] = {
    1729             :                 .name                   = "sched:starting",
    1730             :                 .startup.single         = sched_cpu_starting,
    1731             :                 .teardown.single        = sched_cpu_dying,
    1732             :         },
    1733             :         [CPUHP_AP_RCUTREE_DYING] = {
    1734             :                 .name                   = "RCU/tree:dying",
    1735             :                 .startup.single         = NULL,
    1736             :                 .teardown.single        = rcutree_dying_cpu,
    1737             :         },
    1738             :         [CPUHP_AP_SMPCFD_DYING] = {
    1739             :                 .name                   = "smpcfd:dying",
    1740             :                 .startup.single         = NULL,
    1741             :                 .teardown.single        = smpcfd_dying_cpu,
    1742             :         },
    1743             :         /* Entry state on starting. Interrupts enabled from here on. Transient
    1744             :          * state for synchronsization */
    1745             :         [CPUHP_AP_ONLINE] = {
    1746             :                 .name                   = "ap:online",
    1747             :         },
    1748             :         /*
    1749             :          * Handled on control processor until the plugged processor manages
    1750             :          * this itself.
    1751             :          */
    1752             :         [CPUHP_TEARDOWN_CPU] = {
    1753             :                 .name                   = "cpu:teardown",
    1754             :                 .startup.single         = NULL,
    1755             :                 .teardown.single        = takedown_cpu,
    1756             :                 .cant_stop              = true,
    1757             :         },
    1758             : 
    1759             :         [CPUHP_AP_SCHED_WAIT_EMPTY] = {
    1760             :                 .name                   = "sched:waitempty",
    1761             :                 .startup.single         = NULL,
    1762             :                 .teardown.single        = sched_cpu_wait_empty,
    1763             :         },
    1764             : 
    1765             :         /* Handle smpboot threads park/unpark */
    1766             :         [CPUHP_AP_SMPBOOT_THREADS] = {
    1767             :                 .name                   = "smpboot/threads:online",
    1768             :                 .startup.single         = smpboot_unpark_threads,
    1769             :                 .teardown.single        = smpboot_park_threads,
    1770             :         },
    1771             :         [CPUHP_AP_IRQ_AFFINITY_ONLINE] = {
    1772             :                 .name                   = "irq/affinity:online",
    1773             :                 .startup.single         = irq_affinity_online_cpu,
    1774             :                 .teardown.single        = NULL,
    1775             :         },
    1776             :         [CPUHP_AP_PERF_ONLINE] = {
    1777             :                 .name                   = "perf:online",
    1778             :                 .startup.single         = perf_event_init_cpu,
    1779             :                 .teardown.single        = perf_event_exit_cpu,
    1780             :         },
    1781             :         [CPUHP_AP_WATCHDOG_ONLINE] = {
    1782             :                 .name                   = "lockup_detector:online",
    1783             :                 .startup.single         = lockup_detector_online_cpu,
    1784             :                 .teardown.single        = lockup_detector_offline_cpu,
    1785             :         },
    1786             :         [CPUHP_AP_WORKQUEUE_ONLINE] = {
    1787             :                 .name                   = "workqueue:online",
    1788             :                 .startup.single         = workqueue_online_cpu,
    1789             :                 .teardown.single        = workqueue_offline_cpu,
    1790             :         },
    1791             :         [CPUHP_AP_RANDOM_ONLINE] = {
    1792             :                 .name                   = "random:online",
    1793             :                 .startup.single         = random_online_cpu,
    1794             :                 .teardown.single        = NULL,
    1795             :         },
    1796             :         [CPUHP_AP_RCUTREE_ONLINE] = {
    1797             :                 .name                   = "RCU/tree:online",
    1798             :                 .startup.single         = rcutree_online_cpu,
    1799             :                 .teardown.single        = rcutree_offline_cpu,
    1800             :         },
    1801             : #endif
    1802             :         /*
    1803             :          * The dynamically registered state space is here
    1804             :          */
    1805             : 
    1806             : #ifdef CONFIG_SMP
    1807             :         /* Last state is scheduler control setting the cpu active */
    1808             :         [CPUHP_AP_ACTIVE] = {
    1809             :                 .name                   = "sched:active",
    1810             :                 .startup.single         = sched_cpu_activate,
    1811             :                 .teardown.single        = sched_cpu_deactivate,
    1812             :         },
    1813             : #endif
    1814             : 
    1815             :         /* CPU is fully up and running. */
    1816             :         [CPUHP_ONLINE] = {
    1817             :                 .name                   = "online",
    1818             :                 .startup.single         = NULL,
    1819             :                 .teardown.single        = NULL,
    1820             :         },
    1821             : };
    1822             : 
    1823             : /* Sanity check for callbacks */
    1824             : static int cpuhp_cb_check(enum cpuhp_state state)
    1825             : {
    1826          18 :         if (state <= CPUHP_OFFLINE || state >= CPUHP_ONLINE)
    1827             :                 return -EINVAL;
    1828             :         return 0;
    1829             : }
    1830             : 
    1831             : /*
    1832             :  * Returns a free for dynamic slot assignment of the Online state. The states
    1833             :  * are protected by the cpuhp_slot_states mutex and an empty slot is identified
    1834             :  * by having no name assigned.
    1835             :  */
    1836           5 : static int cpuhp_reserve_state(enum cpuhp_state state)
    1837             : {
    1838             :         enum cpuhp_state i, end;
    1839             :         struct cpuhp_step *step;
    1840             : 
    1841           5 :         switch (state) {
    1842             :         case CPUHP_AP_ONLINE_DYN:
    1843             :                 step = cpuhp_hp_states + CPUHP_AP_ONLINE_DYN;
    1844             :                 end = CPUHP_AP_ONLINE_DYN_END;
    1845             :                 break;
    1846             :         case CPUHP_BP_PREPARE_DYN:
    1847           1 :                 step = cpuhp_hp_states + CPUHP_BP_PREPARE_DYN;
    1848           1 :                 end = CPUHP_BP_PREPARE_DYN_END;
    1849           1 :                 break;
    1850             :         default:
    1851             :                 return -EINVAL;
    1852             :         }
    1853             : 
    1854          11 :         for (i = state; i <= end; i++, step++) {
    1855          11 :                 if (!step->name)
    1856             :                         return i;
    1857             :         }
    1858           0 :         WARN(1, "No more dynamic states available for CPU hotplug\n");
    1859           0 :         return -ENOSPC;
    1860             : }
    1861             : 
    1862          18 : static int cpuhp_store_callbacks(enum cpuhp_state state, const char *name,
    1863             :                                  int (*startup)(unsigned int cpu),
    1864             :                                  int (*teardown)(unsigned int cpu),
    1865             :                                  bool multi_instance)
    1866             : {
    1867             :         /* (Un)Install the callbacks for further cpu hotplug operations */
    1868             :         struct cpuhp_step *sp;
    1869          19 :         int ret = 0;
    1870             : 
    1871             :         /*
    1872             :          * If name is NULL, then the state gets removed.
    1873             :          *
    1874             :          * CPUHP_AP_ONLINE_DYN and CPUHP_BP_PREPARE_DYN are handed out on
    1875             :          * the first allocation from these dynamic ranges, so the removal
    1876             :          * would trigger a new allocation and clear the wrong (already
    1877             :          * empty) state, leaving the callbacks of the to be cleared state
    1878             :          * dangling, which causes wreckage on the next hotplug operation.
    1879             :          */
    1880          36 :         if (name && (state == CPUHP_AP_ONLINE_DYN ||
    1881          18 :                      state == CPUHP_BP_PREPARE_DYN)) {
    1882           5 :                 ret = cpuhp_reserve_state(state);
    1883           5 :                 if (ret < 0)
    1884             :                         return ret;
    1885             :                 state = ret;
    1886             :         }
    1887          19 :         sp = cpuhp_get_step(state);
    1888          18 :         if (name && sp->name)
    1889             :                 return -EBUSY;
    1890             : 
    1891          19 :         sp->startup.single = startup;
    1892          19 :         sp->teardown.single = teardown;
    1893          19 :         sp->name = name;
    1894          19 :         sp->multi_instance = multi_instance;
    1895          19 :         INIT_HLIST_HEAD(&sp->list);
    1896          18 :         return ret;
    1897             : }
    1898             : 
    1899             : static void *cpuhp_get_teardown_cb(enum cpuhp_state state)
    1900             : {
    1901           0 :         return cpuhp_get_step(state)->teardown.single;
    1902             : }
    1903             : 
    1904             : /*
    1905             :  * Call the startup/teardown function for a step either on the AP or
    1906             :  * on the current CPU.
    1907             :  */
    1908           3 : static int cpuhp_issue_call(int cpu, enum cpuhp_state state, bool bringup,
    1909             :                             struct hlist_node *node)
    1910             : {
    1911           3 :         struct cpuhp_step *sp = cpuhp_get_step(state);
    1912             :         int ret;
    1913             : 
    1914             :         /*
    1915             :          * If there's nothing to do, we done.
    1916             :          * Relies on the union for multi_instance.
    1917             :          */
    1918           6 :         if (cpuhp_step_empty(bringup, sp))
    1919             :                 return 0;
    1920             :         /*
    1921             :          * The non AP bound callbacks can fail on bringup. On teardown
    1922             :          * e.g. module removal we crash for now.
    1923             :          */
    1924             : #ifdef CONFIG_SMP
    1925             :         if (cpuhp_is_ap_state(state))
    1926             :                 ret = cpuhp_invoke_ap_callback(cpu, state, bringup, node);
    1927             :         else
    1928             :                 ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
    1929             : #else
    1930           3 :         ret = cpuhp_invoke_callback(cpu, state, bringup, node, NULL);
    1931             : #endif
    1932           3 :         BUG_ON(ret && !bringup);
    1933             :         return ret;
    1934             : }
    1935             : 
    1936             : /*
    1937             :  * Called from __cpuhp_setup_state on a recoverable failure.
    1938             :  *
    1939             :  * Note: The teardown callbacks for rollback are not allowed to fail!
    1940             :  */
    1941           1 : static void cpuhp_rollback_install(int failedcpu, enum cpuhp_state state,
    1942             :                                    struct hlist_node *node)
    1943             : {
    1944             :         int cpu;
    1945             : 
    1946             :         /* Roll back the already executed steps on the other cpus */
    1947           1 :         for_each_present_cpu(cpu) {
    1948           1 :                 struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    1949           1 :                 int cpustate = st->state;
    1950             : 
    1951           1 :                 if (cpu >= failedcpu)
    1952             :                         break;
    1953             : 
    1954             :                 /* Did we invoke the startup call on that cpu ? */
    1955           0 :                 if (cpustate >= state)
    1956           0 :                         cpuhp_issue_call(cpu, state, false, node);
    1957             :         }
    1958           1 : }
    1959             : 
    1960           1 : int __cpuhp_state_add_instance_cpuslocked(enum cpuhp_state state,
    1961             :                                           struct hlist_node *node,
    1962             :                                           bool invoke)
    1963             : {
    1964             :         struct cpuhp_step *sp;
    1965             :         int cpu;
    1966             :         int ret;
    1967             : 
    1968           1 :         lockdep_assert_cpus_held();
    1969             : 
    1970           1 :         sp = cpuhp_get_step(state);
    1971           1 :         if (sp->multi_instance == false)
    1972             :                 return -EINVAL;
    1973             : 
    1974           1 :         mutex_lock(&cpuhp_state_mutex);
    1975             : 
    1976           1 :         if (!invoke || !sp->startup.multi)
    1977             :                 goto add_node;
    1978             : 
    1979             :         /*
    1980             :          * Try to call the startup callback for each present cpu
    1981             :          * depending on the hotplug state of the cpu.
    1982             :          */
    1983           0 :         for_each_present_cpu(cpu) {
    1984           0 :                 struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    1985           0 :                 int cpustate = st->state;
    1986             : 
    1987           0 :                 if (cpustate < state)
    1988           0 :                         continue;
    1989             : 
    1990           0 :                 ret = cpuhp_issue_call(cpu, state, true, node);
    1991           0 :                 if (ret) {
    1992           0 :                         if (sp->teardown.multi)
    1993           0 :                                 cpuhp_rollback_install(cpu, state, node);
    1994             :                         goto unlock;
    1995             :                 }
    1996             :         }
    1997             : add_node:
    1998           1 :         ret = 0;
    1999           1 :         hlist_add_head(node, &sp->list);
    2000             : unlock:
    2001           1 :         mutex_unlock(&cpuhp_state_mutex);
    2002           1 :         return ret;
    2003             : }
    2004             : 
    2005           1 : int __cpuhp_state_add_instance(enum cpuhp_state state, struct hlist_node *node,
    2006             :                                bool invoke)
    2007             : {
    2008             :         int ret;
    2009             : 
    2010             :         cpus_read_lock();
    2011           1 :         ret = __cpuhp_state_add_instance_cpuslocked(state, node, invoke);
    2012             :         cpus_read_unlock();
    2013           1 :         return ret;
    2014             : }
    2015             : EXPORT_SYMBOL_GPL(__cpuhp_state_add_instance);
    2016             : 
    2017             : /**
    2018             :  * __cpuhp_setup_state_cpuslocked - Setup the callbacks for an hotplug machine state
    2019             :  * @state:              The state to setup
    2020             :  * @name:               Name of the step
    2021             :  * @invoke:             If true, the startup function is invoked for cpus where
    2022             :  *                      cpu state >= @state
    2023             :  * @startup:            startup callback function
    2024             :  * @teardown:           teardown callback function
    2025             :  * @multi_instance:     State is set up for multiple instances which get
    2026             :  *                      added afterwards.
    2027             :  *
    2028             :  * The caller needs to hold cpus read locked while calling this function.
    2029             :  * Return:
    2030             :  *   On success:
    2031             :  *      Positive state number if @state is CPUHP_AP_ONLINE_DYN;
    2032             :  *      0 for all other states
    2033             :  *   On failure: proper (negative) error code
    2034             :  */
    2035          18 : int __cpuhp_setup_state_cpuslocked(enum cpuhp_state state,
    2036             :                                    const char *name, bool invoke,
    2037             :                                    int (*startup)(unsigned int cpu),
    2038             :                                    int (*teardown)(unsigned int cpu),
    2039             :                                    bool multi_instance)
    2040             : {
    2041          18 :         int cpu, ret = 0;
    2042             :         bool dynstate;
    2043             : 
    2044          18 :         lockdep_assert_cpus_held();
    2045             : 
    2046          18 :         if (cpuhp_cb_check(state) || !name)
    2047             :                 return -EINVAL;
    2048             : 
    2049          18 :         mutex_lock(&cpuhp_state_mutex);
    2050             : 
    2051          18 :         ret = cpuhp_store_callbacks(state, name, startup, teardown,
    2052             :                                     multi_instance);
    2053             : 
    2054          18 :         dynstate = state == CPUHP_AP_ONLINE_DYN;
    2055          18 :         if (ret > 0 && dynstate) {
    2056           4 :                 state = ret;
    2057           4 :                 ret = 0;
    2058             :         }
    2059             : 
    2060          18 :         if (ret || !invoke || !startup)
    2061             :                 goto out;
    2062             : 
    2063             :         /*
    2064             :          * Try to call the startup callback for each present cpu
    2065             :          * depending on the hotplug state of the cpu.
    2066             :          */
    2067           2 :         for_each_present_cpu(cpu) {
    2068           3 :                 struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    2069           3 :                 int cpustate = st->state;
    2070             : 
    2071           3 :                 if (cpustate < state)
    2072           0 :                         continue;
    2073             : 
    2074           3 :                 ret = cpuhp_issue_call(cpu, state, true, NULL);
    2075           3 :                 if (ret) {
    2076           1 :                         if (teardown)
    2077           1 :                                 cpuhp_rollback_install(cpu, state, NULL);
    2078             :                         cpuhp_store_callbacks(state, NULL, NULL, NULL, false);
    2079             :                         goto out;
    2080             :                 }
    2081             :         }
    2082             : out:
    2083          18 :         mutex_unlock(&cpuhp_state_mutex);
    2084             :         /*
    2085             :          * If the requested state is CPUHP_AP_ONLINE_DYN, return the
    2086             :          * dynamically allocated state in case of success.
    2087             :          */
    2088          18 :         if (!ret && dynstate)
    2089             :                 return state;
    2090          14 :         return ret;
    2091             : }
    2092             : EXPORT_SYMBOL(__cpuhp_setup_state_cpuslocked);
    2093             : 
    2094          18 : int __cpuhp_setup_state(enum cpuhp_state state,
    2095             :                         const char *name, bool invoke,
    2096             :                         int (*startup)(unsigned int cpu),
    2097             :                         int (*teardown)(unsigned int cpu),
    2098             :                         bool multi_instance)
    2099             : {
    2100             :         int ret;
    2101             : 
    2102             :         cpus_read_lock();
    2103          18 :         ret = __cpuhp_setup_state_cpuslocked(state, name, invoke, startup,
    2104             :                                              teardown, multi_instance);
    2105             :         cpus_read_unlock();
    2106          18 :         return ret;
    2107             : }
    2108             : EXPORT_SYMBOL(__cpuhp_setup_state);
    2109             : 
    2110           0 : int __cpuhp_state_remove_instance(enum cpuhp_state state,
    2111             :                                   struct hlist_node *node, bool invoke)
    2112             : {
    2113           0 :         struct cpuhp_step *sp = cpuhp_get_step(state);
    2114             :         int cpu;
    2115             : 
    2116           0 :         BUG_ON(cpuhp_cb_check(state));
    2117             : 
    2118           0 :         if (!sp->multi_instance)
    2119             :                 return -EINVAL;
    2120             : 
    2121             :         cpus_read_lock();
    2122           0 :         mutex_lock(&cpuhp_state_mutex);
    2123             : 
    2124           0 :         if (!invoke || !cpuhp_get_teardown_cb(state))
    2125             :                 goto remove;
    2126             :         /*
    2127             :          * Call the teardown callback for each present cpu depending
    2128             :          * on the hotplug state of the cpu. This function is not
    2129             :          * allowed to fail currently!
    2130             :          */
    2131           0 :         for_each_present_cpu(cpu) {
    2132           0 :                 struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    2133           0 :                 int cpustate = st->state;
    2134             : 
    2135           0 :                 if (cpustate >= state)
    2136           0 :                         cpuhp_issue_call(cpu, state, false, node);
    2137             :         }
    2138             : 
    2139             : remove:
    2140           0 :         hlist_del(node);
    2141           0 :         mutex_unlock(&cpuhp_state_mutex);
    2142             :         cpus_read_unlock();
    2143             : 
    2144           0 :         return 0;
    2145             : }
    2146             : EXPORT_SYMBOL_GPL(__cpuhp_state_remove_instance);
    2147             : 
    2148             : /**
    2149             :  * __cpuhp_remove_state_cpuslocked - Remove the callbacks for an hotplug machine state
    2150             :  * @state:      The state to remove
    2151             :  * @invoke:     If true, the teardown function is invoked for cpus where
    2152             :  *              cpu state >= @state
    2153             :  *
    2154             :  * The caller needs to hold cpus read locked while calling this function.
    2155             :  * The teardown callback is currently not allowed to fail. Think
    2156             :  * about module removal!
    2157             :  */
    2158           0 : void __cpuhp_remove_state_cpuslocked(enum cpuhp_state state, bool invoke)
    2159             : {
    2160           0 :         struct cpuhp_step *sp = cpuhp_get_step(state);
    2161             :         int cpu;
    2162             : 
    2163           0 :         BUG_ON(cpuhp_cb_check(state));
    2164             : 
    2165             :         lockdep_assert_cpus_held();
    2166             : 
    2167           0 :         mutex_lock(&cpuhp_state_mutex);
    2168           0 :         if (sp->multi_instance) {
    2169           0 :                 WARN(!hlist_empty(&sp->list),
    2170             :                      "Error: Removing state %d which has instances left.\n",
    2171             :                      state);
    2172             :                 goto remove;
    2173             :         }
    2174             : 
    2175           0 :         if (!invoke || !cpuhp_get_teardown_cb(state))
    2176             :                 goto remove;
    2177             : 
    2178             :         /*
    2179             :          * Call the teardown callback for each present cpu depending
    2180             :          * on the hotplug state of the cpu. This function is not
    2181             :          * allowed to fail currently!
    2182             :          */
    2183           0 :         for_each_present_cpu(cpu) {
    2184           0 :                 struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
    2185           0 :                 int cpustate = st->state;
    2186             : 
    2187           0 :                 if (cpustate >= state)
    2188           0 :                         cpuhp_issue_call(cpu, state, false, NULL);
    2189             :         }
    2190             : remove:
    2191           0 :         cpuhp_store_callbacks(state, NULL, NULL, NULL, false);
    2192           0 :         mutex_unlock(&cpuhp_state_mutex);
    2193           0 : }
    2194             : EXPORT_SYMBOL(__cpuhp_remove_state_cpuslocked);
    2195             : 
    2196           0 : void __cpuhp_remove_state(enum cpuhp_state state, bool invoke)
    2197             : {
    2198             :         cpus_read_lock();
    2199           0 :         __cpuhp_remove_state_cpuslocked(state, invoke);
    2200             :         cpus_read_unlock();
    2201           0 : }
    2202             : EXPORT_SYMBOL(__cpuhp_remove_state);
    2203             : 
    2204             : #ifdef CONFIG_HOTPLUG_SMT
    2205             : static void cpuhp_offline_cpu_device(unsigned int cpu)
    2206             : {
    2207             :         struct device *dev = get_cpu_device(cpu);
    2208             : 
    2209             :         dev->offline = true;
    2210             :         /* Tell user space about the state change */
    2211             :         kobject_uevent(&dev->kobj, KOBJ_OFFLINE);
    2212             : }
    2213             : 
    2214             : static void cpuhp_online_cpu_device(unsigned int cpu)
    2215             : {
    2216             :         struct device *dev = get_cpu_device(cpu);
    2217             : 
    2218             :         dev->offline = false;
    2219             :         /* Tell user space about the state change */
    2220             :         kobject_uevent(&dev->kobj, KOBJ_ONLINE);
    2221             : }
    2222             : 
    2223             : int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
    2224             : {
    2225             :         int cpu, ret = 0;
    2226             : 
    2227             :         cpu_maps_update_begin();
    2228             :         for_each_online_cpu(cpu) {
    2229             :                 if (topology_is_primary_thread(cpu))
    2230             :                         continue;
    2231             :                 ret = cpu_down_maps_locked(cpu, CPUHP_OFFLINE);
    2232             :                 if (ret)
    2233             :                         break;
    2234             :                 /*
    2235             :                  * As this needs to hold the cpu maps lock it's impossible
    2236             :                  * to call device_offline() because that ends up calling
    2237             :                  * cpu_down() which takes cpu maps lock. cpu maps lock
    2238             :                  * needs to be held as this might race against in kernel
    2239             :                  * abusers of the hotplug machinery (thermal management).
    2240             :                  *
    2241             :                  * So nothing would update device:offline state. That would
    2242             :                  * leave the sysfs entry stale and prevent onlining after
    2243             :                  * smt control has been changed to 'off' again. This is
    2244             :                  * called under the sysfs hotplug lock, so it is properly
    2245             :                  * serialized against the regular offline usage.
    2246             :                  */
    2247             :                 cpuhp_offline_cpu_device(cpu);
    2248             :         }
    2249             :         if (!ret)
    2250             :                 cpu_smt_control = ctrlval;
    2251             :         cpu_maps_update_done();
    2252             :         return ret;
    2253             : }
    2254             : 
    2255             : int cpuhp_smt_enable(void)
    2256             : {
    2257             :         int cpu, ret = 0;
    2258             : 
    2259             :         cpu_maps_update_begin();
    2260             :         cpu_smt_control = CPU_SMT_ENABLED;
    2261             :         for_each_present_cpu(cpu) {
    2262             :                 /* Skip online CPUs and CPUs on offline nodes */
    2263             :                 if (cpu_online(cpu) || !node_online(cpu_to_node(cpu)))
    2264             :                         continue;
    2265             :                 ret = _cpu_up(cpu, 0, CPUHP_ONLINE);
    2266             :                 if (ret)
    2267             :                         break;
    2268             :                 /* See comment in cpuhp_smt_disable() */
    2269             :                 cpuhp_online_cpu_device(cpu);
    2270             :         }
    2271             :         cpu_maps_update_done();
    2272             :         return ret;
    2273             : }
    2274             : #endif
    2275             : 
    2276             : #if defined(CONFIG_SYSFS) && defined(CONFIG_HOTPLUG_CPU)
    2277             : static ssize_t state_show(struct device *dev,
    2278             :                           struct device_attribute *attr, char *buf)
    2279             : {
    2280             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
    2281             : 
    2282             :         return sprintf(buf, "%d\n", st->state);
    2283             : }
    2284             : static DEVICE_ATTR_RO(state);
    2285             : 
    2286             : static ssize_t target_store(struct device *dev, struct device_attribute *attr,
    2287             :                             const char *buf, size_t count)
    2288             : {
    2289             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
    2290             :         struct cpuhp_step *sp;
    2291             :         int target, ret;
    2292             : 
    2293             :         ret = kstrtoint(buf, 10, &target);
    2294             :         if (ret)
    2295             :                 return ret;
    2296             : 
    2297             : #ifdef CONFIG_CPU_HOTPLUG_STATE_CONTROL
    2298             :         if (target < CPUHP_OFFLINE || target > CPUHP_ONLINE)
    2299             :                 return -EINVAL;
    2300             : #else
    2301             :         if (target != CPUHP_OFFLINE && target != CPUHP_ONLINE)
    2302             :                 return -EINVAL;
    2303             : #endif
    2304             : 
    2305             :         ret = lock_device_hotplug_sysfs();
    2306             :         if (ret)
    2307             :                 return ret;
    2308             : 
    2309             :         mutex_lock(&cpuhp_state_mutex);
    2310             :         sp = cpuhp_get_step(target);
    2311             :         ret = !sp->name || sp->cant_stop ? -EINVAL : 0;
    2312             :         mutex_unlock(&cpuhp_state_mutex);
    2313             :         if (ret)
    2314             :                 goto out;
    2315             : 
    2316             :         if (st->state < target)
    2317             :                 ret = cpu_up(dev->id, target);
    2318             :         else
    2319             :                 ret = cpu_down(dev->id, target);
    2320             : out:
    2321             :         unlock_device_hotplug();
    2322             :         return ret ? ret : count;
    2323             : }
    2324             : 
    2325             : static ssize_t target_show(struct device *dev,
    2326             :                            struct device_attribute *attr, char *buf)
    2327             : {
    2328             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
    2329             : 
    2330             :         return sprintf(buf, "%d\n", st->target);
    2331             : }
    2332             : static DEVICE_ATTR_RW(target);
    2333             : 
    2334             : static ssize_t fail_store(struct device *dev, struct device_attribute *attr,
    2335             :                           const char *buf, size_t count)
    2336             : {
    2337             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
    2338             :         struct cpuhp_step *sp;
    2339             :         int fail, ret;
    2340             : 
    2341             :         ret = kstrtoint(buf, 10, &fail);
    2342             :         if (ret)
    2343             :                 return ret;
    2344             : 
    2345             :         if (fail == CPUHP_INVALID) {
    2346             :                 st->fail = fail;
    2347             :                 return count;
    2348             :         }
    2349             : 
    2350             :         if (fail < CPUHP_OFFLINE || fail > CPUHP_ONLINE)
    2351             :                 return -EINVAL;
    2352             : 
    2353             :         /*
    2354             :          * Cannot fail STARTING/DYING callbacks.
    2355             :          */
    2356             :         if (cpuhp_is_atomic_state(fail))
    2357             :                 return -EINVAL;
    2358             : 
    2359             :         /*
    2360             :          * DEAD callbacks cannot fail...
    2361             :          * ... neither can CPUHP_BRINGUP_CPU during hotunplug. The latter
    2362             :          * triggering STARTING callbacks, a failure in this state would
    2363             :          * hinder rollback.
    2364             :          */
    2365             :         if (fail <= CPUHP_BRINGUP_CPU && st->state > CPUHP_BRINGUP_CPU)
    2366             :                 return -EINVAL;
    2367             : 
    2368             :         /*
    2369             :          * Cannot fail anything that doesn't have callbacks.
    2370             :          */
    2371             :         mutex_lock(&cpuhp_state_mutex);
    2372             :         sp = cpuhp_get_step(fail);
    2373             :         if (!sp->startup.single && !sp->teardown.single)
    2374             :                 ret = -EINVAL;
    2375             :         mutex_unlock(&cpuhp_state_mutex);
    2376             :         if (ret)
    2377             :                 return ret;
    2378             : 
    2379             :         st->fail = fail;
    2380             : 
    2381             :         return count;
    2382             : }
    2383             : 
    2384             : static ssize_t fail_show(struct device *dev,
    2385             :                          struct device_attribute *attr, char *buf)
    2386             : {
    2387             :         struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, dev->id);
    2388             : 
    2389             :         return sprintf(buf, "%d\n", st->fail);
    2390             : }
    2391             : 
    2392             : static DEVICE_ATTR_RW(fail);
    2393             : 
    2394             : static struct attribute *cpuhp_cpu_attrs[] = {
    2395             :         &dev_attr_state.attr,
    2396             :         &dev_attr_target.attr,
    2397             :         &dev_attr_fail.attr,
    2398             :         NULL
    2399             : };
    2400             : 
    2401             : static const struct attribute_group cpuhp_cpu_attr_group = {
    2402             :         .attrs = cpuhp_cpu_attrs,
    2403             :         .name = "hotplug",
    2404             :         NULL
    2405             : };
    2406             : 
    2407             : static ssize_t states_show(struct device *dev,
    2408             :                                  struct device_attribute *attr, char *buf)
    2409             : {
    2410             :         ssize_t cur, res = 0;
    2411             :         int i;
    2412             : 
    2413             :         mutex_lock(&cpuhp_state_mutex);
    2414             :         for (i = CPUHP_OFFLINE; i <= CPUHP_ONLINE; i++) {
    2415             :                 struct cpuhp_step *sp = cpuhp_get_step(i);
    2416             : 
    2417             :                 if (sp->name) {
    2418             :                         cur = sprintf(buf, "%3d: %s\n", i, sp->name);
    2419             :                         buf += cur;
    2420             :                         res += cur;
    2421             :                 }
    2422             :         }
    2423             :         mutex_unlock(&cpuhp_state_mutex);
    2424             :         return res;
    2425             : }
    2426             : static DEVICE_ATTR_RO(states);
    2427             : 
    2428             : static struct attribute *cpuhp_cpu_root_attrs[] = {
    2429             :         &dev_attr_states.attr,
    2430             :         NULL
    2431             : };
    2432             : 
    2433             : static const struct attribute_group cpuhp_cpu_root_attr_group = {
    2434             :         .attrs = cpuhp_cpu_root_attrs,
    2435             :         .name = "hotplug",
    2436             :         NULL
    2437             : };
    2438             : 
    2439             : #ifdef CONFIG_HOTPLUG_SMT
    2440             : 
    2441             : static ssize_t
    2442             : __store_smt_control(struct device *dev, struct device_attribute *attr,
    2443             :                     const char *buf, size_t count)
    2444             : {
    2445             :         int ctrlval, ret;
    2446             : 
    2447             :         if (sysfs_streq(buf, "on"))
    2448             :                 ctrlval = CPU_SMT_ENABLED;
    2449             :         else if (sysfs_streq(buf, "off"))
    2450             :                 ctrlval = CPU_SMT_DISABLED;
    2451             :         else if (sysfs_streq(buf, "forceoff"))
    2452             :                 ctrlval = CPU_SMT_FORCE_DISABLED;
    2453             :         else
    2454             :                 return -EINVAL;
    2455             : 
    2456             :         if (cpu_smt_control == CPU_SMT_FORCE_DISABLED)
    2457             :                 return -EPERM;
    2458             : 
    2459             :         if (cpu_smt_control == CPU_SMT_NOT_SUPPORTED)
    2460             :                 return -ENODEV;
    2461             : 
    2462             :         ret = lock_device_hotplug_sysfs();
    2463             :         if (ret)
    2464             :                 return ret;
    2465             : 
    2466             :         if (ctrlval != cpu_smt_control) {
    2467             :                 switch (ctrlval) {
    2468             :                 case CPU_SMT_ENABLED:
    2469             :                         ret = cpuhp_smt_enable();
    2470             :                         break;
    2471             :                 case CPU_SMT_DISABLED:
    2472             :                 case CPU_SMT_FORCE_DISABLED:
    2473             :                         ret = cpuhp_smt_disable(ctrlval);
    2474             :                         break;
    2475             :                 }
    2476             :         }
    2477             : 
    2478             :         unlock_device_hotplug();
    2479             :         return ret ? ret : count;
    2480             : }
    2481             : 
    2482             : #else /* !CONFIG_HOTPLUG_SMT */
    2483             : static ssize_t
    2484             : __store_smt_control(struct device *dev, struct device_attribute *attr,
    2485             :                     const char *buf, size_t count)
    2486             : {
    2487             :         return -ENODEV;
    2488             : }
    2489             : #endif /* CONFIG_HOTPLUG_SMT */
    2490             : 
    2491             : static const char *smt_states[] = {
    2492             :         [CPU_SMT_ENABLED]               = "on",
    2493             :         [CPU_SMT_DISABLED]              = "off",
    2494             :         [CPU_SMT_FORCE_DISABLED]        = "forceoff",
    2495             :         [CPU_SMT_NOT_SUPPORTED]         = "notsupported",
    2496             :         [CPU_SMT_NOT_IMPLEMENTED]       = "notimplemented",
    2497             : };
    2498             : 
    2499             : static ssize_t control_show(struct device *dev,
    2500             :                             struct device_attribute *attr, char *buf)
    2501             : {
    2502             :         const char *state = smt_states[cpu_smt_control];
    2503             : 
    2504             :         return snprintf(buf, PAGE_SIZE - 2, "%s\n", state);
    2505             : }
    2506             : 
    2507             : static ssize_t control_store(struct device *dev, struct device_attribute *attr,
    2508             :                              const char *buf, size_t count)
    2509             : {
    2510             :         return __store_smt_control(dev, attr, buf, count);
    2511             : }
    2512             : static DEVICE_ATTR_RW(control);
    2513             : 
    2514             : static ssize_t active_show(struct device *dev,
    2515             :                            struct device_attribute *attr, char *buf)
    2516             : {
    2517             :         return snprintf(buf, PAGE_SIZE - 2, "%d\n", sched_smt_active());
    2518             : }
    2519             : static DEVICE_ATTR_RO(active);
    2520             : 
    2521             : static struct attribute *cpuhp_smt_attrs[] = {
    2522             :         &dev_attr_control.attr,
    2523             :         &dev_attr_active.attr,
    2524             :         NULL
    2525             : };
    2526             : 
    2527             : static const struct attribute_group cpuhp_smt_attr_group = {
    2528             :         .attrs = cpuhp_smt_attrs,
    2529             :         .name = "smt",
    2530             :         NULL
    2531             : };
    2532             : 
    2533             : static int __init cpu_smt_sysfs_init(void)
    2534             : {
    2535             :         return sysfs_create_group(&cpu_subsys.dev_root->kobj,
    2536             :                                   &cpuhp_smt_attr_group);
    2537             : }
    2538             : 
    2539             : static int __init cpuhp_sysfs_init(void)
    2540             : {
    2541             :         int cpu, ret;
    2542             : 
    2543             :         ret = cpu_smt_sysfs_init();
    2544             :         if (ret)
    2545             :                 return ret;
    2546             : 
    2547             :         ret = sysfs_create_group(&cpu_subsys.dev_root->kobj,
    2548             :                                  &cpuhp_cpu_root_attr_group);
    2549             :         if (ret)
    2550             :                 return ret;
    2551             : 
    2552             :         for_each_possible_cpu(cpu) {
    2553             :                 struct device *dev = get_cpu_device(cpu);
    2554             : 
    2555             :                 if (!dev)
    2556             :                         continue;
    2557             :                 ret = sysfs_create_group(&dev->kobj, &cpuhp_cpu_attr_group);
    2558             :                 if (ret)
    2559             :                         return ret;
    2560             :         }
    2561             :         return 0;
    2562             : }
    2563             : device_initcall(cpuhp_sysfs_init);
    2564             : #endif /* CONFIG_SYSFS && CONFIG_HOTPLUG_CPU */
    2565             : 
    2566             : /*
    2567             :  * cpu_bit_bitmap[] is a special, "compressed" data structure that
    2568             :  * represents all NR_CPUS bits binary values of 1<<nr.
    2569             :  *
    2570             :  * It is used by cpumask_of() to get a constant address to a CPU
    2571             :  * mask value that has a single bit set only.
    2572             :  */
    2573             : 
    2574             : /* cpu_bit_bitmap[0] is empty - so we can back into it */
    2575             : #define MASK_DECLARE_1(x)       [x+1][0] = (1UL << (x))
    2576             : #define MASK_DECLARE_2(x)       MASK_DECLARE_1(x), MASK_DECLARE_1(x+1)
    2577             : #define MASK_DECLARE_4(x)       MASK_DECLARE_2(x), MASK_DECLARE_2(x+2)
    2578             : #define MASK_DECLARE_8(x)       MASK_DECLARE_4(x), MASK_DECLARE_4(x+4)
    2579             : 
    2580             : const unsigned long cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)] = {
    2581             : 
    2582             :         MASK_DECLARE_8(0),      MASK_DECLARE_8(8),
    2583             :         MASK_DECLARE_8(16),     MASK_DECLARE_8(24),
    2584             : #if BITS_PER_LONG > 32
    2585             :         MASK_DECLARE_8(32),     MASK_DECLARE_8(40),
    2586             :         MASK_DECLARE_8(48),     MASK_DECLARE_8(56),
    2587             : #endif
    2588             : };
    2589             : EXPORT_SYMBOL_GPL(cpu_bit_bitmap);
    2590             : 
    2591             : const DECLARE_BITMAP(cpu_all_bits, NR_CPUS) = CPU_BITS_ALL;
    2592             : EXPORT_SYMBOL(cpu_all_bits);
    2593             : 
    2594             : #ifdef CONFIG_INIT_ALL_POSSIBLE
    2595             : struct cpumask __cpu_possible_mask __read_mostly
    2596             :         = {CPU_BITS_ALL};
    2597             : #else
    2598             : struct cpumask __cpu_possible_mask __read_mostly;
    2599             : #endif
    2600             : EXPORT_SYMBOL(__cpu_possible_mask);
    2601             : 
    2602             : struct cpumask __cpu_online_mask __read_mostly;
    2603             : EXPORT_SYMBOL(__cpu_online_mask);
    2604             : 
    2605             : struct cpumask __cpu_present_mask __read_mostly;
    2606             : EXPORT_SYMBOL(__cpu_present_mask);
    2607             : 
    2608             : struct cpumask __cpu_active_mask __read_mostly;
    2609             : EXPORT_SYMBOL(__cpu_active_mask);
    2610             : 
    2611             : struct cpumask __cpu_dying_mask __read_mostly;
    2612             : EXPORT_SYMBOL(__cpu_dying_mask);
    2613             : 
    2614             : atomic_t __num_online_cpus __read_mostly;
    2615             : EXPORT_SYMBOL(__num_online_cpus);
    2616             : 
    2617           0 : void init_cpu_present(const struct cpumask *src)
    2618             : {
    2619           0 :         cpumask_copy(&__cpu_present_mask, src);
    2620           0 : }
    2621             : 
    2622           0 : void init_cpu_possible(const struct cpumask *src)
    2623             : {
    2624           0 :         cpumask_copy(&__cpu_possible_mask, src);
    2625           0 : }
    2626             : 
    2627           0 : void init_cpu_online(const struct cpumask *src)
    2628             : {
    2629           0 :         cpumask_copy(&__cpu_online_mask, src);
    2630           0 : }
    2631             : 
    2632           0 : void set_cpu_online(unsigned int cpu, bool online)
    2633             : {
    2634             :         /*
    2635             :          * atomic_inc/dec() is required to handle the horrid abuse of this
    2636             :          * function by the reboot and kexec code which invoke it from
    2637             :          * IPI/NMI broadcasts when shutting down CPUs. Invocation from
    2638             :          * regular CPU hotplug is properly serialized.
    2639             :          *
    2640             :          * Note, that the fact that __num_online_cpus is of type atomic_t
    2641             :          * does not protect readers which are not serialized against
    2642             :          * concurrent hotplug operations.
    2643             :          */
    2644           0 :         if (online) {
    2645           2 :                 if (!cpumask_test_and_set_cpu(cpu, &__cpu_online_mask))
    2646             :                         atomic_inc(&__num_online_cpus);
    2647             :         } else {
    2648           0 :                 if (cpumask_test_and_clear_cpu(cpu, &__cpu_online_mask))
    2649             :                         atomic_dec(&__num_online_cpus);
    2650             :         }
    2651           0 : }
    2652             : 
    2653             : /*
    2654             :  * Activate the first processor.
    2655             :  */
    2656           1 : void __init boot_cpu_init(void)
    2657             : {
    2658           1 :         int cpu = smp_processor_id();
    2659             : 
    2660             :         /* Mark the boot cpu "present", "online" etc for SMP and UP case */
    2661           2 :         set_cpu_online(cpu, true);
    2662           2 :         set_cpu_active(cpu, true);
    2663           2 :         set_cpu_present(cpu, true);
    2664           2 :         set_cpu_possible(cpu, true);
    2665             : 
    2666             : #ifdef CONFIG_SMP
    2667             :         __boot_cpu_id = cpu;
    2668             : #endif
    2669           1 : }
    2670             : 
    2671             : /*
    2672             :  * Must be called _AFTER_ setting up the per_cpu areas
    2673             :  */
    2674           1 : void __init boot_cpu_hotplug_init(void)
    2675             : {
    2676             : #ifdef CONFIG_SMP
    2677             :         cpumask_set_cpu(smp_processor_id(), &cpus_booted_once_mask);
    2678             : #endif
    2679           3 :         this_cpu_write(cpuhp_state.state, CPUHP_ONLINE);
    2680           1 : }
    2681             : 
    2682             : /*
    2683             :  * These are used for a global "mitigations=" cmdline option for toggling
    2684             :  * optional CPU mitigations.
    2685             :  */
    2686             : enum cpu_mitigations {
    2687             :         CPU_MITIGATIONS_OFF,
    2688             :         CPU_MITIGATIONS_AUTO,
    2689             :         CPU_MITIGATIONS_AUTO_NOSMT,
    2690             : };
    2691             : 
    2692             : static enum cpu_mitigations cpu_mitigations __ro_after_init =
    2693             :         CPU_MITIGATIONS_AUTO;
    2694             : 
    2695           0 : static int __init mitigations_parse_cmdline(char *arg)
    2696             : {
    2697           0 :         if (!strcmp(arg, "off"))
    2698           0 :                 cpu_mitigations = CPU_MITIGATIONS_OFF;
    2699           0 :         else if (!strcmp(arg, "auto"))
    2700           0 :                 cpu_mitigations = CPU_MITIGATIONS_AUTO;
    2701           0 :         else if (!strcmp(arg, "auto,nosmt"))
    2702           0 :                 cpu_mitigations = CPU_MITIGATIONS_AUTO_NOSMT;
    2703             :         else
    2704           0 :                 pr_crit("Unsupported mitigations=%s, system may still be vulnerable\n",
    2705             :                         arg);
    2706             : 
    2707           0 :         return 0;
    2708             : }
    2709             : early_param("mitigations", mitigations_parse_cmdline);
    2710             : 
    2711             : /* mitigations=off */
    2712           0 : bool cpu_mitigations_off(void)
    2713             : {
    2714           0 :         return cpu_mitigations == CPU_MITIGATIONS_OFF;
    2715             : }
    2716             : EXPORT_SYMBOL_GPL(cpu_mitigations_off);
    2717             : 
    2718             : /* mitigations=auto,nosmt */
    2719           0 : bool cpu_mitigations_auto_nosmt(void)
    2720             : {
    2721           0 :         return cpu_mitigations == CPU_MITIGATIONS_AUTO_NOSMT;
    2722             : }
    2723             : EXPORT_SYMBOL_GPL(cpu_mitigations_auto_nosmt);

Generated by: LCOV version 1.14