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