1
2
3
4
5
6
7
8
9
10
11#include <linux/completion.h>
12#include <linux/cpu.h>
13#include <linux/init.h>
14#include <linux/kthread.h>
15#include <linux/export.h>
16#include <linux/percpu.h>
17#include <linux/sched.h>
18#include <linux/stop_machine.h>
19#include <linux/interrupt.h>
20#include <linux/kallsyms.h>
21
22#include <linux/atomic.h>
23
24
25
26
27
28struct cpu_stop_done {
29 atomic_t nr_todo;
30 bool executed;
31 int ret;
32 struct completion completion;
33};
34
35
36struct cpu_stopper {
37 spinlock_t lock;
38 bool enabled;
39 struct list_head works;
40 struct task_struct *thread;
41};
42
43static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper);
44static bool stop_machine_initialized = false;
45
46static void cpu_stop_init_done(struct cpu_stop_done *done, unsigned int nr_todo)
47{
48 memset(done, 0, sizeof(*done));
49 atomic_set(&done->nr_todo, nr_todo);
50 init_completion(&done->completion);
51}
52
53
54static void cpu_stop_signal_done(struct cpu_stop_done *done, bool executed)
55{
56 if (done) {
57 if (executed)
58 done->executed = true;
59 if (atomic_dec_and_test(&done->nr_todo))
60 complete(&done->completion);
61 }
62}
63
64
65static void cpu_stop_queue_work(struct cpu_stopper *stopper,
66 struct cpu_stop_work *work)
67{
68 unsigned long flags;
69
70 spin_lock_irqsave(&stopper->lock, flags);
71
72 if (stopper->enabled) {
73 list_add_tail(&work->list, &stopper->works);
74 wake_up_process(stopper->thread);
75 } else
76 cpu_stop_signal_done(work->done, false);
77
78 spin_unlock_irqrestore(&stopper->lock, flags);
79}
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg)
106{
107 struct cpu_stop_done done;
108 struct cpu_stop_work work = { .fn = fn, .arg = arg, .done = &done };
109
110 cpu_stop_init_done(&done, 1);
111 cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu), &work);
112 wait_for_completion(&done.completion);
113 return done.executed ? done.ret : -ENOENT;
114}
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg,
130 struct cpu_stop_work *work_buf)
131{
132 *work_buf = (struct cpu_stop_work){ .fn = fn, .arg = arg, };
133 cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu), work_buf);
134}
135
136
137static DEFINE_MUTEX(stop_cpus_mutex);
138static DEFINE_PER_CPU(struct cpu_stop_work, stop_cpus_work);
139
140static void queue_stop_cpus_work(const struct cpumask *cpumask,
141 cpu_stop_fn_t fn, void *arg,
142 struct cpu_stop_done *done)
143{
144 struct cpu_stop_work *work;
145 unsigned int cpu;
146
147
148 for_each_cpu(cpu, cpumask) {
149 work = &per_cpu(stop_cpus_work, cpu);
150 work->fn = fn;
151 work->arg = arg;
152 work->done = done;
153 }
154
155
156
157
158
159
160 preempt_disable();
161 for_each_cpu(cpu, cpumask)
162 cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu),
163 &per_cpu(stop_cpus_work, cpu));
164 preempt_enable();
165}
166
167static int __stop_cpus(const struct cpumask *cpumask,
168 cpu_stop_fn_t fn, void *arg)
169{
170 struct cpu_stop_done done;
171
172 cpu_stop_init_done(&done, cpumask_weight(cpumask));
173 queue_stop_cpus_work(cpumask, fn, arg, &done);
174 wait_for_completion(&done.completion);
175 return done.executed ? done.ret : -ENOENT;
176}
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206int stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
207{
208 int ret;
209
210
211 mutex_lock(&stop_cpus_mutex);
212 ret = __stop_cpus(cpumask, fn, arg);
213 mutex_unlock(&stop_cpus_mutex);
214 return ret;
215}
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
236{
237 int ret;
238
239
240 if (!mutex_trylock(&stop_cpus_mutex))
241 return -EAGAIN;
242 ret = __stop_cpus(cpumask, fn, arg);
243 mutex_unlock(&stop_cpus_mutex);
244 return ret;
245}
246
247static int cpu_stopper_thread(void *data)
248{
249 struct cpu_stopper *stopper = data;
250 struct cpu_stop_work *work;
251 int ret;
252
253repeat:
254 set_current_state(TASK_INTERRUPTIBLE);
255
256 if (kthread_should_stop()) {
257 __set_current_state(TASK_RUNNING);
258 return 0;
259 }
260
261 work = NULL;
262 spin_lock_irq(&stopper->lock);
263 if (!list_empty(&stopper->works)) {
264 work = list_first_entry(&stopper->works,
265 struct cpu_stop_work, list);
266 list_del_init(&work->list);
267 }
268 spin_unlock_irq(&stopper->lock);
269
270 if (work) {
271 cpu_stop_fn_t fn = work->fn;
272 void *arg = work->arg;
273 struct cpu_stop_done *done = work->done;
274 char ksym_buf[KSYM_NAME_LEN] __maybe_unused;
275
276 __set_current_state(TASK_RUNNING);
277
278
279 preempt_disable();
280
281 ret = fn(arg);
282 if (ret)
283 done->ret = ret;
284
285
286 preempt_enable();
287 WARN_ONCE(preempt_count(),
288 "cpu_stop: %s(%p) leaked preempt count\n",
289 kallsyms_lookup((unsigned long)fn, NULL, NULL, NULL,
290 ksym_buf), arg);
291
292 cpu_stop_signal_done(done, true);
293 } else
294 schedule();
295
296 goto repeat;
297}
298
299extern void sched_set_stop_task(int cpu, struct task_struct *stop);
300
301
302static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb,
303 unsigned long action, void *hcpu)
304{
305 unsigned int cpu = (unsigned long)hcpu;
306 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
307 struct task_struct *p;
308
309 switch (action & ~CPU_TASKS_FROZEN) {
310 case CPU_UP_PREPARE:
311 BUG_ON(stopper->thread || stopper->enabled ||
312 !list_empty(&stopper->works));
313 p = kthread_create_on_node(cpu_stopper_thread,
314 stopper,
315 cpu_to_node(cpu),
316 "migration/%d", cpu);
317 if (IS_ERR(p))
318 return notifier_from_errno(PTR_ERR(p));
319 get_task_struct(p);
320 kthread_bind(p, cpu);
321 sched_set_stop_task(cpu, p);
322 stopper->thread = p;
323 break;
324
325 case CPU_ONLINE:
326
327 wake_up_process(stopper->thread);
328
329 spin_lock_irq(&stopper->lock);
330 stopper->enabled = true;
331 spin_unlock_irq(&stopper->lock);
332 break;
333
334#ifdef CONFIG_HOTPLUG_CPU
335 case CPU_UP_CANCELED:
336 case CPU_POST_DEAD:
337 {
338 struct cpu_stop_work *work;
339
340 sched_set_stop_task(cpu, NULL);
341
342 kthread_stop(stopper->thread);
343
344 spin_lock_irq(&stopper->lock);
345 list_for_each_entry(work, &stopper->works, list)
346 cpu_stop_signal_done(work->done, false);
347 stopper->enabled = false;
348 spin_unlock_irq(&stopper->lock);
349
350 put_task_struct(stopper->thread);
351 stopper->thread = NULL;
352 break;
353 }
354#endif
355 }
356
357 return NOTIFY_OK;
358}
359
360
361
362
363
364
365static struct notifier_block __cpuinitdata cpu_stop_cpu_notifier = {
366 .notifier_call = cpu_stop_cpu_callback,
367 .priority = 10,
368};
369
370static int __init cpu_stop_init(void)
371{
372 void *bcpu = (void *)(long)smp_processor_id();
373 unsigned int cpu;
374 int err;
375
376 for_each_possible_cpu(cpu) {
377 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
378
379 spin_lock_init(&stopper->lock);
380 INIT_LIST_HEAD(&stopper->works);
381 }
382
383
384 err = cpu_stop_cpu_callback(&cpu_stop_cpu_notifier, CPU_UP_PREPARE,
385 bcpu);
386 BUG_ON(err != NOTIFY_OK);
387 cpu_stop_cpu_callback(&cpu_stop_cpu_notifier, CPU_ONLINE, bcpu);
388 register_cpu_notifier(&cpu_stop_cpu_notifier);
389
390 stop_machine_initialized = true;
391
392 return 0;
393}
394early_initcall(cpu_stop_init);
395
396#ifdef CONFIG_STOP_MACHINE
397
398
399enum stopmachine_state {
400
401 STOPMACHINE_NONE,
402
403 STOPMACHINE_PREPARE,
404
405 STOPMACHINE_DISABLE_IRQ,
406
407 STOPMACHINE_RUN,
408
409 STOPMACHINE_EXIT,
410};
411
412struct stop_machine_data {
413 int (*fn)(void *);
414 void *data;
415
416 unsigned int num_threads;
417 const struct cpumask *active_cpus;
418
419 enum stopmachine_state state;
420 atomic_t thread_ack;
421};
422
423static void set_state(struct stop_machine_data *smdata,
424 enum stopmachine_state newstate)
425{
426
427 atomic_set(&smdata->thread_ack, smdata->num_threads);
428 smp_wmb();
429 smdata->state = newstate;
430}
431
432
433static void ack_state(struct stop_machine_data *smdata)
434{
435 if (atomic_dec_and_test(&smdata->thread_ack))
436 set_state(smdata, smdata->state + 1);
437}
438
439
440static int stop_machine_cpu_stop(void *data)
441{
442 struct stop_machine_data *smdata = data;
443 enum stopmachine_state curstate = STOPMACHINE_NONE;
444 int cpu = smp_processor_id(), err = 0;
445 unsigned long flags;
446 bool is_active;
447
448
449
450
451
452 local_save_flags(flags);
453
454 if (!smdata->active_cpus)
455 is_active = cpu == cpumask_first(cpu_online_mask);
456 else
457 is_active = cpumask_test_cpu(cpu, smdata->active_cpus);
458
459
460 do {
461
462 cpu_relax();
463 if (smdata->state != curstate) {
464 curstate = smdata->state;
465 switch (curstate) {
466 case STOPMACHINE_DISABLE_IRQ:
467 local_irq_disable();
468 hard_irq_disable();
469 break;
470 case STOPMACHINE_RUN:
471 if (is_active)
472 err = smdata->fn(smdata->data);
473 break;
474 default:
475 break;
476 }
477 ack_state(smdata);
478 }
479 } while (curstate != STOPMACHINE_EXIT);
480
481 local_irq_restore(flags);
482 return err;
483}
484
485int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
486{
487 struct stop_machine_data smdata = { .fn = fn, .data = data,
488 .num_threads = num_online_cpus(),
489 .active_cpus = cpus };
490
491 if (!stop_machine_initialized) {
492
493
494
495
496
497 unsigned long flags;
498 int ret;
499
500 WARN_ON_ONCE(smdata.num_threads != 1);
501
502 local_irq_save(flags);
503 hard_irq_disable();
504 ret = (*fn)(data);
505 local_irq_restore(flags);
506
507 return ret;
508 }
509
510
511 set_state(&smdata, STOPMACHINE_PREPARE);
512 return stop_cpus(cpu_online_mask, stop_machine_cpu_stop, &smdata);
513}
514
515int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
516{
517 int ret;
518
519
520 get_online_cpus();
521 ret = __stop_machine(fn, data, cpus);
522 put_online_cpus();
523 return ret;
524}
525EXPORT_SYMBOL_GPL(stop_machine);
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549int stop_machine_from_inactive_cpu(int (*fn)(void *), void *data,
550 const struct cpumask *cpus)
551{
552 struct stop_machine_data smdata = { .fn = fn, .data = data,
553 .active_cpus = cpus };
554 struct cpu_stop_done done;
555 int ret;
556
557
558 BUG_ON(cpu_active(raw_smp_processor_id()));
559 smdata.num_threads = num_active_cpus() + 1;
560
561
562 while (!mutex_trylock(&stop_cpus_mutex))
563 cpu_relax();
564
565
566 set_state(&smdata, STOPMACHINE_PREPARE);
567 cpu_stop_init_done(&done, num_active_cpus());
568 queue_stop_cpus_work(cpu_active_mask, stop_machine_cpu_stop, &smdata,
569 &done);
570 ret = stop_machine_cpu_stop(&smdata);
571
572
573 while (!completion_done(&done.completion))
574 cpu_relax();
575
576 mutex_unlock(&stop_cpus_mutex);
577 return ret ?: done.ret;
578}
579
580#endif
581