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#include <linux/smpboot.h>
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};
41
42static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper);
43static DEFINE_PER_CPU(struct task_struct *, cpu_stopper_task);
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(unsigned int cpu, struct cpu_stop_work *work)
66{
67 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
68 struct task_struct *p = per_cpu(cpu_stopper_task, cpu);
69
70 unsigned long flags;
71
72 spin_lock_irqsave(&stopper->lock, flags);
73
74 if (stopper->enabled) {
75 list_add_tail(&work->list, &stopper->works);
76 wake_up_process(p);
77 } else
78 cpu_stop_signal_done(work->done, false);
79
80 spin_unlock_irqrestore(&stopper->lock, flags);
81}
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg)
108{
109 struct cpu_stop_done done;
110 struct cpu_stop_work work = { .fn = fn, .arg = arg, .done = &done };
111
112 cpu_stop_init_done(&done, 1);
113 cpu_stop_queue_work(cpu, &work);
114 wait_for_completion(&done.completion);
115 return done.executed ? done.ret : -ENOENT;
116}
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg,
132 struct cpu_stop_work *work_buf)
133{
134 *work_buf = (struct cpu_stop_work){ .fn = fn, .arg = arg, };
135 cpu_stop_queue_work(cpu, work_buf);
136}
137
138
139static DEFINE_MUTEX(stop_cpus_mutex);
140static DEFINE_PER_CPU(struct cpu_stop_work, stop_cpus_work);
141
142static void queue_stop_cpus_work(const struct cpumask *cpumask,
143 cpu_stop_fn_t fn, void *arg,
144 struct cpu_stop_done *done)
145{
146 struct cpu_stop_work *work;
147 unsigned int cpu;
148
149
150 for_each_cpu(cpu, cpumask) {
151 work = &per_cpu(stop_cpus_work, cpu);
152 work->fn = fn;
153 work->arg = arg;
154 work->done = done;
155 }
156
157
158
159
160
161
162 preempt_disable();
163 for_each_cpu(cpu, cpumask)
164 cpu_stop_queue_work(cpu, &per_cpu(stop_cpus_work, cpu));
165 preempt_enable();
166}
167
168static int __stop_cpus(const struct cpumask *cpumask,
169 cpu_stop_fn_t fn, void *arg)
170{
171 struct cpu_stop_done done;
172
173 cpu_stop_init_done(&done, cpumask_weight(cpumask));
174 queue_stop_cpus_work(cpumask, fn, arg, &done);
175 wait_for_completion(&done.completion);
176 return done.executed ? done.ret : -ENOENT;
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
206
207int stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
208{
209 int ret;
210
211
212 mutex_lock(&stop_cpus_mutex);
213 ret = __stop_cpus(cpumask, fn, arg);
214 mutex_unlock(&stop_cpus_mutex);
215 return ret;
216}
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg)
237{
238 int ret;
239
240
241 if (!mutex_trylock(&stop_cpus_mutex))
242 return -EAGAIN;
243 ret = __stop_cpus(cpumask, fn, arg);
244 mutex_unlock(&stop_cpus_mutex);
245 return ret;
246}
247
248static int cpu_stop_should_run(unsigned int cpu)
249{
250 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
251 unsigned long flags;
252 int run;
253
254 spin_lock_irqsave(&stopper->lock, flags);
255 run = !list_empty(&stopper->works);
256 spin_unlock_irqrestore(&stopper->lock, flags);
257 return run;
258}
259
260static void cpu_stopper_thread(unsigned int cpu)
261{
262 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
263 struct cpu_stop_work *work;
264 int ret;
265
266repeat:
267 work = NULL;
268 spin_lock_irq(&stopper->lock);
269 if (!list_empty(&stopper->works)) {
270 work = list_first_entry(&stopper->works,
271 struct cpu_stop_work, list);
272 list_del_init(&work->list);
273 }
274 spin_unlock_irq(&stopper->lock);
275
276 if (work) {
277 cpu_stop_fn_t fn = work->fn;
278 void *arg = work->arg;
279 struct cpu_stop_done *done = work->done;
280 char ksym_buf[KSYM_NAME_LEN] __maybe_unused;
281
282
283 preempt_disable();
284
285 ret = fn(arg);
286 if (ret)
287 done->ret = ret;
288
289
290 preempt_enable();
291 WARN_ONCE(preempt_count(),
292 "cpu_stop: %s(%p) leaked preempt count\n",
293 kallsyms_lookup((unsigned long)fn, NULL, NULL, NULL,
294 ksym_buf), arg);
295
296 cpu_stop_signal_done(done, true);
297 goto repeat;
298 }
299}
300
301extern void sched_set_stop_task(int cpu, struct task_struct *stop);
302
303static void cpu_stop_create(unsigned int cpu)
304{
305 sched_set_stop_task(cpu, per_cpu(cpu_stopper_task, cpu));
306}
307
308static void cpu_stop_park(unsigned int cpu)
309{
310 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
311 struct cpu_stop_work *work;
312 unsigned long flags;
313
314
315 spin_lock_irqsave(&stopper->lock, flags);
316 list_for_each_entry(work, &stopper->works, list)
317 cpu_stop_signal_done(work->done, false);
318 stopper->enabled = false;
319 spin_unlock_irqrestore(&stopper->lock, flags);
320}
321
322static void cpu_stop_unpark(unsigned int cpu)
323{
324 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
325
326 spin_lock_irq(&stopper->lock);
327 stopper->enabled = true;
328 spin_unlock_irq(&stopper->lock);
329}
330
331static struct smp_hotplug_thread cpu_stop_threads = {
332 .store = &cpu_stopper_task,
333 .thread_should_run = cpu_stop_should_run,
334 .thread_fn = cpu_stopper_thread,
335 .thread_comm = "migration/%u",
336 .create = cpu_stop_create,
337 .setup = cpu_stop_unpark,
338 .park = cpu_stop_park,
339 .pre_unpark = cpu_stop_unpark,
340 .selfparking = true,
341};
342
343static int __init cpu_stop_init(void)
344{
345 unsigned int cpu;
346
347 for_each_possible_cpu(cpu) {
348 struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
349
350 spin_lock_init(&stopper->lock);
351 INIT_LIST_HEAD(&stopper->works);
352 }
353
354 BUG_ON(smpboot_register_percpu_thread(&cpu_stop_threads));
355 stop_machine_initialized = true;
356 return 0;
357}
358early_initcall(cpu_stop_init);
359
360#ifdef CONFIG_STOP_MACHINE
361
362
363enum stopmachine_state {
364
365 STOPMACHINE_NONE,
366
367 STOPMACHINE_PREPARE,
368
369 STOPMACHINE_DISABLE_IRQ,
370
371 STOPMACHINE_RUN,
372
373 STOPMACHINE_EXIT,
374};
375
376struct stop_machine_data {
377 int (*fn)(void *);
378 void *data;
379
380 unsigned int num_threads;
381 const struct cpumask *active_cpus;
382
383 enum stopmachine_state state;
384 atomic_t thread_ack;
385};
386
387static void set_state(struct stop_machine_data *smdata,
388 enum stopmachine_state newstate)
389{
390
391 atomic_set(&smdata->thread_ack, smdata->num_threads);
392 smp_wmb();
393 smdata->state = newstate;
394}
395
396
397static void ack_state(struct stop_machine_data *smdata)
398{
399 if (atomic_dec_and_test(&smdata->thread_ack))
400 set_state(smdata, smdata->state + 1);
401}
402
403
404static int stop_machine_cpu_stop(void *data)
405{
406 struct stop_machine_data *smdata = data;
407 enum stopmachine_state curstate = STOPMACHINE_NONE;
408 int cpu = smp_processor_id(), err = 0;
409 unsigned long flags;
410 bool is_active;
411
412
413
414
415
416 local_save_flags(flags);
417
418 if (!smdata->active_cpus)
419 is_active = cpu == cpumask_first(cpu_online_mask);
420 else
421 is_active = cpumask_test_cpu(cpu, smdata->active_cpus);
422
423
424 do {
425
426 cpu_relax();
427 if (smdata->state != curstate) {
428 curstate = smdata->state;
429 switch (curstate) {
430 case STOPMACHINE_DISABLE_IRQ:
431 local_irq_disable();
432 hard_irq_disable();
433 break;
434 case STOPMACHINE_RUN:
435 if (is_active)
436 err = smdata->fn(smdata->data);
437 break;
438 default:
439 break;
440 }
441 ack_state(smdata);
442 }
443 } while (curstate != STOPMACHINE_EXIT);
444
445 local_irq_restore(flags);
446 return err;
447}
448
449int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
450{
451 struct stop_machine_data smdata = { .fn = fn, .data = data,
452 .num_threads = num_online_cpus(),
453 .active_cpus = cpus };
454
455 if (!stop_machine_initialized) {
456
457
458
459
460
461 unsigned long flags;
462 int ret;
463
464 WARN_ON_ONCE(smdata.num_threads != 1);
465
466 local_irq_save(flags);
467 hard_irq_disable();
468 ret = (*fn)(data);
469 local_irq_restore(flags);
470
471 return ret;
472 }
473
474
475 set_state(&smdata, STOPMACHINE_PREPARE);
476 return stop_cpus(cpu_online_mask, stop_machine_cpu_stop, &smdata);
477}
478
479int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
480{
481 int ret;
482
483
484 get_online_cpus();
485 ret = __stop_machine(fn, data, cpus);
486 put_online_cpus();
487 return ret;
488}
489EXPORT_SYMBOL_GPL(stop_machine);
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513int stop_machine_from_inactive_cpu(int (*fn)(void *), void *data,
514 const struct cpumask *cpus)
515{
516 struct stop_machine_data smdata = { .fn = fn, .data = data,
517 .active_cpus = cpus };
518 struct cpu_stop_done done;
519 int ret;
520
521
522 BUG_ON(cpu_active(raw_smp_processor_id()));
523 smdata.num_threads = num_active_cpus() + 1;
524
525
526 while (!mutex_trylock(&stop_cpus_mutex))
527 cpu_relax();
528
529
530 set_state(&smdata, STOPMACHINE_PREPARE);
531 cpu_stop_init_done(&done, num_active_cpus());
532 queue_stop_cpus_work(cpu_active_mask, stop_machine_cpu_stop, &smdata,
533 &done);
534 ret = stop_machine_cpu_stop(&smdata);
535
536
537 while (!completion_done(&done.completion))
538 cpu_relax();
539
540 mutex_unlock(&stop_cpus_mutex);
541 return ret ?: done.ret;
542}
543
544#endif
545