1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include <linux/types.h>
31#include <linux/kernel.h>
32#include <linux/init.h>
33#include <linux/spinlock.h>
34#include <linux/smp.h>
35#include <linux/rcupdate.h>
36#include <linux/interrupt.h>
37#include <linux/sched.h>
38#include <linux/nmi.h>
39#include <linux/atomic.h>
40#include <linux/bitops.h>
41#include <linux/export.h>
42#include <linux/completion.h>
43#include <linux/moduleparam.h>
44#include <linux/percpu.h>
45#include <linux/notifier.h>
46#include <linux/cpu.h>
47#include <linux/mutex.h>
48#include <linux/time.h>
49#include <linux/kernel_stat.h>
50#include <linux/wait.h>
51#include <linux/kthread.h>
52#include <linux/prefetch.h>
53#include <linux/delay.h>
54#include <linux/stop_machine.h>
55#include <linux/random.h>
56
57#include "rcutree.h"
58#include <trace/events/rcu.h>
59
60#include "rcu.h"
61
62
63
64static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
65static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
66
67#define RCU_STATE_INITIALIZER(sname, cr) { \
68 .level = { &sname##_state.node[0] }, \
69 .call = cr, \
70 .fqs_state = RCU_GP_IDLE, \
71 .gpnum = 0UL - 300UL, \
72 .completed = 0UL - 300UL, \
73 .orphan_lock = __RAW_SPIN_LOCK_UNLOCKED(&sname##_state.orphan_lock), \
74 .orphan_nxttail = &sname##_state.orphan_nxtlist, \
75 .orphan_donetail = &sname##_state.orphan_donelist, \
76 .barrier_mutex = __MUTEX_INITIALIZER(sname##_state.barrier_mutex), \
77 .onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \
78 .name = #sname, \
79}
80
81struct rcu_state rcu_sched_state =
82 RCU_STATE_INITIALIZER(rcu_sched, call_rcu_sched);
83DEFINE_PER_CPU(struct rcu_data, rcu_sched_data);
84
85struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, call_rcu_bh);
86DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
87
88static struct rcu_state *rcu_state;
89LIST_HEAD(rcu_struct_flavors);
90
91
92static int rcu_fanout_leaf = CONFIG_RCU_FANOUT_LEAF;
93module_param(rcu_fanout_leaf, int, 0444);
94int rcu_num_lvls __read_mostly = RCU_NUM_LVLS;
95static int num_rcu_lvl[] = {
96 NUM_RCU_LVL_0,
97 NUM_RCU_LVL_1,
98 NUM_RCU_LVL_2,
99 NUM_RCU_LVL_3,
100 NUM_RCU_LVL_4,
101};
102int rcu_num_nodes __read_mostly = NUM_RCU_NODES;
103
104
105
106
107
108
109
110
111
112
113int rcu_scheduler_active __read_mostly;
114EXPORT_SYMBOL_GPL(rcu_scheduler_active);
115
116
117
118
119
120
121
122
123
124
125
126
127
128static int rcu_scheduler_fully_active __read_mostly;
129
130#ifdef CONFIG_RCU_BOOST
131
132
133
134
135
136static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task);
137DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status);
138DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);
139DEFINE_PER_CPU(char, rcu_cpu_has_work);
140
141#endif
142
143static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu);
144static void invoke_rcu_core(void);
145static void invoke_rcu_callbacks(struct rcu_state *rsp, struct rcu_data *rdp);
146
147
148
149
150
151
152
153
154
155
156unsigned long rcutorture_testseq;
157unsigned long rcutorture_vernum;
158
159
160
161
162
163
164static int rcu_gp_in_progress(struct rcu_state *rsp)
165{
166 return ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum);
167}
168
169
170
171
172
173
174
175void rcu_sched_qs(int cpu)
176{
177 struct rcu_data *rdp = &per_cpu(rcu_sched_data, cpu);
178
179 if (rdp->passed_quiesce == 0)
180 trace_rcu_grace_period("rcu_sched", rdp->gpnum, "cpuqs");
181 rdp->passed_quiesce = 1;
182}
183
184void rcu_bh_qs(int cpu)
185{
186 struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu);
187
188 if (rdp->passed_quiesce == 0)
189 trace_rcu_grace_period("rcu_bh", rdp->gpnum, "cpuqs");
190 rdp->passed_quiesce = 1;
191}
192
193
194
195
196
197
198void rcu_note_context_switch(int cpu)
199{
200 trace_rcu_utilization("Start context switch");
201 rcu_sched_qs(cpu);
202 rcu_preempt_note_context_switch(cpu);
203 trace_rcu_utilization("End context switch");
204}
205EXPORT_SYMBOL_GPL(rcu_note_context_switch);
206
207DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = {
208 .dynticks_nesting = DYNTICK_TASK_EXIT_IDLE,
209 .dynticks = ATOMIC_INIT(1),
210};
211
212static long blimit = 10;
213static long qhimark = 10000;
214static long qlowmark = 100;
215
216module_param(blimit, long, 0444);
217module_param(qhimark, long, 0444);
218module_param(qlowmark, long, 0444);
219
220int rcu_cpu_stall_suppress __read_mostly;
221int rcu_cpu_stall_timeout __read_mostly = CONFIG_RCU_CPU_STALL_TIMEOUT;
222
223module_param(rcu_cpu_stall_suppress, int, 0644);
224module_param(rcu_cpu_stall_timeout, int, 0644);
225
226static ulong jiffies_till_first_fqs = RCU_JIFFIES_TILL_FORCE_QS;
227static ulong jiffies_till_next_fqs = RCU_JIFFIES_TILL_FORCE_QS;
228
229module_param(jiffies_till_first_fqs, ulong, 0644);
230module_param(jiffies_till_next_fqs, ulong, 0644);
231
232static void force_qs_rnp(struct rcu_state *rsp, int (*f)(struct rcu_data *));
233static void force_quiescent_state(struct rcu_state *rsp);
234static int rcu_pending(int cpu);
235
236
237
238
239long rcu_batches_completed_sched(void)
240{
241 return rcu_sched_state.completed;
242}
243EXPORT_SYMBOL_GPL(rcu_batches_completed_sched);
244
245
246
247
248long rcu_batches_completed_bh(void)
249{
250 return rcu_bh_state.completed;
251}
252EXPORT_SYMBOL_GPL(rcu_batches_completed_bh);
253
254
255
256
257void rcu_bh_force_quiescent_state(void)
258{
259 force_quiescent_state(&rcu_bh_state);
260}
261EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state);
262
263
264
265
266
267
268
269
270void rcutorture_record_test_transition(void)
271{
272 rcutorture_testseq++;
273 rcutorture_vernum = 0;
274}
275EXPORT_SYMBOL_GPL(rcutorture_record_test_transition);
276
277
278
279
280
281
282void rcutorture_record_progress(unsigned long vernum)
283{
284 rcutorture_vernum++;
285}
286EXPORT_SYMBOL_GPL(rcutorture_record_progress);
287
288
289
290
291void rcu_sched_force_quiescent_state(void)
292{
293 force_quiescent_state(&rcu_sched_state);
294}
295EXPORT_SYMBOL_GPL(rcu_sched_force_quiescent_state);
296
297
298
299
300static int
301cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp)
302{
303 return &rdp->nxtlist != rdp->nxttail[RCU_DONE_TAIL] &&
304 rdp->nxttail[RCU_DONE_TAIL] != NULL;
305}
306
307
308
309
310static int
311cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp)
312{
313 struct rcu_head **ntp;
314
315 ntp = rdp->nxttail[RCU_DONE_TAIL +
316 (ACCESS_ONCE(rsp->completed) != rdp->completed)];
317 return rdp->nxttail[RCU_DONE_TAIL] && ntp && *ntp &&
318 !rcu_gp_in_progress(rsp);
319}
320
321
322
323
324static struct rcu_node *rcu_get_root(struct rcu_state *rsp)
325{
326 return &rsp->node[0];
327}
328
329
330
331
332
333
334
335
336static void rcu_eqs_enter_common(struct rcu_dynticks *rdtp, long long oldval,
337 bool user)
338{
339 trace_rcu_dyntick("Start", oldval, 0);
340 if (!user && !is_idle_task(current)) {
341 struct task_struct *idle = idle_task(smp_processor_id());
342
343 trace_rcu_dyntick("Error on entry: not idle task", oldval, 0);
344 ftrace_dump(DUMP_ORIG);
345 WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
346 current->pid, current->comm,
347 idle->pid, idle->comm);
348 }
349 rcu_prepare_for_idle(smp_processor_id());
350
351 smp_mb__before_atomic_inc();
352 atomic_inc(&rdtp->dynticks);
353 smp_mb__after_atomic_inc();
354 WARN_ON_ONCE(atomic_read(&rdtp->dynticks) & 0x1);
355
356
357
358
359
360 rcu_lockdep_assert(!lock_is_held(&rcu_lock_map),
361 "Illegal idle entry in RCU read-side critical section.");
362 rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map),
363 "Illegal idle entry in RCU-bh read-side critical section.");
364 rcu_lockdep_assert(!lock_is_held(&rcu_sched_lock_map),
365 "Illegal idle entry in RCU-sched read-side critical section.");
366}
367
368
369
370
371
372static void rcu_eqs_enter(bool user)
373{
374 long long oldval;
375 struct rcu_dynticks *rdtp;
376
377 rdtp = &__get_cpu_var(rcu_dynticks);
378 oldval = rdtp->dynticks_nesting;
379 WARN_ON_ONCE((oldval & DYNTICK_TASK_NEST_MASK) == 0);
380 if ((oldval & DYNTICK_TASK_NEST_MASK) == DYNTICK_TASK_NEST_VALUE)
381 rdtp->dynticks_nesting = 0;
382 else
383 rdtp->dynticks_nesting -= DYNTICK_TASK_NEST_VALUE;
384 rcu_eqs_enter_common(rdtp, oldval, user);
385}
386
387
388
389
390
391
392
393
394
395
396
397
398
399void rcu_idle_enter(void)
400{
401 unsigned long flags;
402
403 local_irq_save(flags);
404 rcu_eqs_enter(false);
405 local_irq_restore(flags);
406}
407EXPORT_SYMBOL_GPL(rcu_idle_enter);
408
409#ifdef CONFIG_RCU_USER_QS
410
411
412
413
414
415
416
417
418void rcu_user_enter(void)
419{
420 rcu_eqs_enter(1);
421}
422
423
424
425
426
427
428
429
430
431void rcu_user_enter_after_irq(void)
432{
433 unsigned long flags;
434 struct rcu_dynticks *rdtp;
435
436 local_irq_save(flags);
437 rdtp = &__get_cpu_var(rcu_dynticks);
438
439 WARN_ON_ONCE(!(rdtp->dynticks_nesting & DYNTICK_TASK_MASK));
440 rdtp->dynticks_nesting = 1;
441 local_irq_restore(flags);
442}
443#endif
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461void rcu_irq_exit(void)
462{
463 unsigned long flags;
464 long long oldval;
465 struct rcu_dynticks *rdtp;
466
467 local_irq_save(flags);
468 rdtp = &__get_cpu_var(rcu_dynticks);
469 oldval = rdtp->dynticks_nesting;
470 rdtp->dynticks_nesting--;
471 WARN_ON_ONCE(rdtp->dynticks_nesting < 0);
472 if (rdtp->dynticks_nesting)
473 trace_rcu_dyntick("--=", oldval, rdtp->dynticks_nesting);
474 else
475 rcu_eqs_enter_common(rdtp, oldval, true);
476 local_irq_restore(flags);
477}
478
479
480
481
482
483
484
485
486static void rcu_eqs_exit_common(struct rcu_dynticks *rdtp, long long oldval,
487 int user)
488{
489 smp_mb__before_atomic_inc();
490 atomic_inc(&rdtp->dynticks);
491
492 smp_mb__after_atomic_inc();
493 WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1));
494 rcu_cleanup_after_idle(smp_processor_id());
495 trace_rcu_dyntick("End", oldval, rdtp->dynticks_nesting);
496 if (!user && !is_idle_task(current)) {
497 struct task_struct *idle = idle_task(smp_processor_id());
498
499 trace_rcu_dyntick("Error on exit: not idle task",
500 oldval, rdtp->dynticks_nesting);
501 ftrace_dump(DUMP_ORIG);
502 WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
503 current->pid, current->comm,
504 idle->pid, idle->comm);
505 }
506}
507
508
509
510
511
512static void rcu_eqs_exit(bool user)
513{
514 struct rcu_dynticks *rdtp;
515 long long oldval;
516
517 rdtp = &__get_cpu_var(rcu_dynticks);
518 oldval = rdtp->dynticks_nesting;
519 WARN_ON_ONCE(oldval < 0);
520 if (oldval & DYNTICK_TASK_NEST_MASK)
521 rdtp->dynticks_nesting += DYNTICK_TASK_NEST_VALUE;
522 else
523 rdtp->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE;
524 rcu_eqs_exit_common(rdtp, oldval, user);
525}
526
527
528
529
530
531
532
533
534
535
536
537
538void rcu_idle_exit(void)
539{
540 unsigned long flags;
541
542 local_irq_save(flags);
543 rcu_eqs_exit(false);
544 local_irq_restore(flags);
545}
546EXPORT_SYMBOL_GPL(rcu_idle_exit);
547
548#ifdef CONFIG_RCU_USER_QS
549
550
551
552
553
554
555void rcu_user_exit(void)
556{
557 rcu_eqs_exit(1);
558}
559
560
561
562
563
564
565
566
567
568
569void rcu_user_exit_after_irq(void)
570{
571 unsigned long flags;
572 struct rcu_dynticks *rdtp;
573
574 local_irq_save(flags);
575 rdtp = &__get_cpu_var(rcu_dynticks);
576
577 WARN_ON_ONCE(rdtp->dynticks_nesting & DYNTICK_TASK_NEST_MASK);
578 rdtp->dynticks_nesting += DYNTICK_TASK_EXIT_IDLE;
579 local_irq_restore(flags);
580}
581#endif
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602void rcu_irq_enter(void)
603{
604 unsigned long flags;
605 struct rcu_dynticks *rdtp;
606 long long oldval;
607
608 local_irq_save(flags);
609 rdtp = &__get_cpu_var(rcu_dynticks);
610 oldval = rdtp->dynticks_nesting;
611 rdtp->dynticks_nesting++;
612 WARN_ON_ONCE(rdtp->dynticks_nesting == 0);
613 if (oldval)
614 trace_rcu_dyntick("++=", oldval, rdtp->dynticks_nesting);
615 else
616 rcu_eqs_exit_common(rdtp, oldval, true);
617 local_irq_restore(flags);
618}
619
620
621
622
623
624
625
626
627void rcu_nmi_enter(void)
628{
629 struct rcu_dynticks *rdtp = &__get_cpu_var(rcu_dynticks);
630
631 if (rdtp->dynticks_nmi_nesting == 0 &&
632 (atomic_read(&rdtp->dynticks) & 0x1))
633 return;
634 rdtp->dynticks_nmi_nesting++;
635 smp_mb__before_atomic_inc();
636 atomic_inc(&rdtp->dynticks);
637
638 smp_mb__after_atomic_inc();
639 WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1));
640}
641
642
643
644
645
646
647
648
649void rcu_nmi_exit(void)
650{
651 struct rcu_dynticks *rdtp = &__get_cpu_var(rcu_dynticks);
652
653 if (rdtp->dynticks_nmi_nesting == 0 ||
654 --rdtp->dynticks_nmi_nesting != 0)
655 return;
656
657 smp_mb__before_atomic_inc();
658 atomic_inc(&rdtp->dynticks);
659 smp_mb__after_atomic_inc();
660 WARN_ON_ONCE(atomic_read(&rdtp->dynticks) & 0x1);
661}
662
663
664
665
666
667
668
669int rcu_is_cpu_idle(void)
670{
671 int ret;
672
673 preempt_disable();
674 ret = (atomic_read(&__get_cpu_var(rcu_dynticks).dynticks) & 0x1) == 0;
675 preempt_enable();
676 return ret;
677}
678EXPORT_SYMBOL(rcu_is_cpu_idle);
679
680#if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU)
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703bool rcu_lockdep_current_cpu_online(void)
704{
705 struct rcu_data *rdp;
706 struct rcu_node *rnp;
707 bool ret;
708
709 if (in_nmi())
710 return 1;
711 preempt_disable();
712 rdp = &__get_cpu_var(rcu_sched_data);
713 rnp = rdp->mynode;
714 ret = (rdp->grpmask & rnp->qsmaskinit) ||
715 !rcu_scheduler_fully_active;
716 preempt_enable();
717 return ret;
718}
719EXPORT_SYMBOL_GPL(rcu_lockdep_current_cpu_online);
720
721#endif
722
723
724
725
726
727
728
729
730int rcu_is_cpu_rrupt_from_idle(void)
731{
732 return __get_cpu_var(rcu_dynticks).dynticks_nesting <= 1;
733}
734
735
736
737
738
739
740static int dyntick_save_progress_counter(struct rcu_data *rdp)
741{
742 rdp->dynticks_snap = atomic_add_return(0, &rdp->dynticks->dynticks);
743 return (rdp->dynticks_snap & 0x1) == 0;
744}
745
746
747
748
749
750
751
752static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
753{
754 unsigned int curr;
755 unsigned int snap;
756
757 curr = (unsigned int)atomic_add_return(0, &rdp->dynticks->dynticks);
758 snap = (unsigned int)rdp->dynticks_snap;
759
760
761
762
763
764
765
766
767
768 if ((curr & 0x1) == 0 || UINT_CMP_GE(curr, snap + 2)) {
769 trace_rcu_fqs(rdp->rsp->name, rdp->gpnum, rdp->cpu, "dti");
770 rdp->dynticks_fqs++;
771 return 1;
772 }
773
774
775
776
777
778
779
780
781
782
783
784
785 if (ULONG_CMP_GE(rdp->rsp->gp_start + 2, jiffies))
786 return 0;
787 barrier();
788 if (cpu_is_offline(rdp->cpu)) {
789 trace_rcu_fqs(rdp->rsp->name, rdp->gpnum, rdp->cpu, "ofl");
790 rdp->offline_fqs++;
791 return 1;
792 }
793 return 0;
794}
795
796static int jiffies_till_stall_check(void)
797{
798 int till_stall_check = ACCESS_ONCE(rcu_cpu_stall_timeout);
799
800
801
802
803
804 if (till_stall_check < 3) {
805 ACCESS_ONCE(rcu_cpu_stall_timeout) = 3;
806 till_stall_check = 3;
807 } else if (till_stall_check > 300) {
808 ACCESS_ONCE(rcu_cpu_stall_timeout) = 300;
809 till_stall_check = 300;
810 }
811 return till_stall_check * HZ + RCU_STALL_DELAY_DELTA;
812}
813
814static void record_gp_stall_check_time(struct rcu_state *rsp)
815{
816 rsp->gp_start = jiffies;
817 rsp->jiffies_stall = jiffies + jiffies_till_stall_check();
818}
819
820
821
822
823
824
825
826static void rcu_dump_cpu_stacks(struct rcu_state *rsp)
827{
828 int cpu;
829 unsigned long flags;
830 struct rcu_node *rnp;
831
832 rcu_for_each_leaf_node(rsp, rnp) {
833 raw_spin_lock_irqsave(&rnp->lock, flags);
834 if (rnp->qsmask != 0) {
835 for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++)
836 if (rnp->qsmask & (1UL << cpu))
837 dump_cpu_task(rnp->grplo + cpu);
838 }
839 raw_spin_unlock_irqrestore(&rnp->lock, flags);
840 }
841}
842
843static void print_other_cpu_stall(struct rcu_state *rsp)
844{
845 int cpu;
846 long delta;
847 unsigned long flags;
848 int ndetected = 0;
849 struct rcu_node *rnp = rcu_get_root(rsp);
850 long totqlen = 0;
851
852
853
854 raw_spin_lock_irqsave(&rnp->lock, flags);
855 delta = jiffies - rsp->jiffies_stall;
856 if (delta < RCU_STALL_RAT_DELAY || !rcu_gp_in_progress(rsp)) {
857 raw_spin_unlock_irqrestore(&rnp->lock, flags);
858 return;
859 }
860 rsp->jiffies_stall = jiffies + 3 * jiffies_till_stall_check() + 3;
861 raw_spin_unlock_irqrestore(&rnp->lock, flags);
862
863
864
865
866
867
868 printk(KERN_ERR "INFO: %s detected stalls on CPUs/tasks:",
869 rsp->name);
870 print_cpu_stall_info_begin();
871 rcu_for_each_leaf_node(rsp, rnp) {
872 raw_spin_lock_irqsave(&rnp->lock, flags);
873 ndetected += rcu_print_task_stall(rnp);
874 if (rnp->qsmask != 0) {
875 for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++)
876 if (rnp->qsmask & (1UL << cpu)) {
877 print_cpu_stall_info(rsp,
878 rnp->grplo + cpu);
879 ndetected++;
880 }
881 }
882 raw_spin_unlock_irqrestore(&rnp->lock, flags);
883 }
884
885
886
887
888
889 rnp = rcu_get_root(rsp);
890 raw_spin_lock_irqsave(&rnp->lock, flags);
891 ndetected += rcu_print_task_stall(rnp);
892 raw_spin_unlock_irqrestore(&rnp->lock, flags);
893
894 print_cpu_stall_info_end();
895 for_each_possible_cpu(cpu)
896 totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen;
897 pr_cont("(detected by %d, t=%ld jiffies, g=%lu, c=%lu, q=%lu)\n",
898 smp_processor_id(), (long)(jiffies - rsp->gp_start),
899 rsp->gpnum, rsp->completed, totqlen);
900 if (ndetected == 0)
901 printk(KERN_ERR "INFO: Stall ended before state dump start\n");
902 else if (!trigger_all_cpu_backtrace())
903 rcu_dump_cpu_stacks(rsp);
904
905
906
907 rcu_print_detail_task_stall(rsp);
908
909 force_quiescent_state(rsp);
910}
911
912static void print_cpu_stall(struct rcu_state *rsp)
913{
914 int cpu;
915 unsigned long flags;
916 struct rcu_node *rnp = rcu_get_root(rsp);
917 long totqlen = 0;
918
919
920
921
922
923
924 printk(KERN_ERR "INFO: %s self-detected stall on CPU", rsp->name);
925 print_cpu_stall_info_begin();
926 print_cpu_stall_info(rsp, smp_processor_id());
927 print_cpu_stall_info_end();
928 for_each_possible_cpu(cpu)
929 totqlen += per_cpu_ptr(rsp->rda, cpu)->qlen;
930 pr_cont(" (t=%lu jiffies g=%lu c=%lu q=%lu)\n",
931 jiffies - rsp->gp_start, rsp->gpnum, rsp->completed, totqlen);
932 if (!trigger_all_cpu_backtrace())
933 dump_stack();
934
935 raw_spin_lock_irqsave(&rnp->lock, flags);
936 if (ULONG_CMP_GE(jiffies, rsp->jiffies_stall))
937 rsp->jiffies_stall = jiffies +
938 3 * jiffies_till_stall_check() + 3;
939 raw_spin_unlock_irqrestore(&rnp->lock, flags);
940
941 set_need_resched();
942}
943
944static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp)
945{
946 unsigned long j;
947 unsigned long js;
948 struct rcu_node *rnp;
949
950 if (rcu_cpu_stall_suppress)
951 return;
952 j = ACCESS_ONCE(jiffies);
953 js = ACCESS_ONCE(rsp->jiffies_stall);
954 rnp = rdp->mynode;
955 if (rcu_gp_in_progress(rsp) &&
956 (ACCESS_ONCE(rnp->qsmask) & rdp->grpmask) && ULONG_CMP_GE(j, js)) {
957
958
959 print_cpu_stall(rsp);
960
961 } else if (rcu_gp_in_progress(rsp) &&
962 ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY)) {
963
964
965 print_other_cpu_stall(rsp);
966 }
967}
968
969static int rcu_panic(struct notifier_block *this, unsigned long ev, void *ptr)
970{
971 rcu_cpu_stall_suppress = 1;
972 return NOTIFY_DONE;
973}
974
975
976
977
978
979
980
981
982
983
984void rcu_cpu_stall_reset(void)
985{
986 struct rcu_state *rsp;
987
988 for_each_rcu_flavor(rsp)
989 rsp->jiffies_stall = jiffies + ULONG_MAX / 2;
990}
991
992static struct notifier_block rcu_panic_block = {
993 .notifier_call = rcu_panic,
994};
995
996static void __init check_cpu_stall_init(void)
997{
998 atomic_notifier_chain_register(&panic_notifier_list, &rcu_panic_block);
999}
1000
1001
1002
1003
1004
1005
1006
1007
1008static void __note_new_gpnum(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
1009{
1010 if (rdp->gpnum != rnp->gpnum) {
1011
1012
1013
1014
1015
1016 rdp->gpnum = rnp->gpnum;
1017 trace_rcu_grace_period(rsp->name, rdp->gpnum, "cpustart");
1018 rdp->passed_quiesce = 0;
1019 rdp->qs_pending = !!(rnp->qsmask & rdp->grpmask);
1020 zero_cpu_stall_ticks(rdp);
1021 }
1022}
1023
1024static void note_new_gpnum(struct rcu_state *rsp, struct rcu_data *rdp)
1025{
1026 unsigned long flags;
1027 struct rcu_node *rnp;
1028
1029 local_irq_save(flags);
1030 rnp = rdp->mynode;
1031 if (rdp->gpnum == ACCESS_ONCE(rnp->gpnum) ||
1032 !raw_spin_trylock(&rnp->lock)) {
1033 local_irq_restore(flags);
1034 return;
1035 }
1036 __note_new_gpnum(rsp, rnp, rdp);
1037 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1038}
1039
1040
1041
1042
1043
1044
1045static int
1046check_for_new_grace_period(struct rcu_state *rsp, struct rcu_data *rdp)
1047{
1048 unsigned long flags;
1049 int ret = 0;
1050
1051 local_irq_save(flags);
1052 if (rdp->gpnum != rsp->gpnum) {
1053 note_new_gpnum(rsp, rdp);
1054 ret = 1;
1055 }
1056 local_irq_restore(flags);
1057 return ret;
1058}
1059
1060
1061
1062
1063static void init_callback_list(struct rcu_data *rdp)
1064{
1065 int i;
1066
1067 rdp->nxtlist = NULL;
1068 for (i = 0; i < RCU_NEXT_SIZE; i++)
1069 rdp->nxttail[i] = &rdp->nxtlist;
1070 init_nocb_callback_list(rdp);
1071}
1072
1073
1074
1075
1076
1077
1078
1079static void
1080__rcu_process_gp_end(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
1081{
1082
1083 if (rdp->completed != rnp->completed) {
1084
1085
1086 rdp->nxttail[RCU_DONE_TAIL] = rdp->nxttail[RCU_WAIT_TAIL];
1087 rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_READY_TAIL];
1088 rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL];
1089
1090
1091 rdp->completed = rnp->completed;
1092 trace_rcu_grace_period(rsp->name, rdp->gpnum, "cpuend");
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103 if (ULONG_CMP_LT(rdp->gpnum, rdp->completed)) {
1104 rdp->gpnum = rdp->completed;
1105 rdp->passed_quiesce = 0;
1106 }
1107
1108
1109
1110
1111
1112 if ((rnp->qsmask & rdp->grpmask) == 0)
1113 rdp->qs_pending = 0;
1114 }
1115}
1116
1117
1118
1119
1120
1121
1122static void
1123rcu_process_gp_end(struct rcu_state *rsp, struct rcu_data *rdp)
1124{
1125 unsigned long flags;
1126 struct rcu_node *rnp;
1127
1128 local_irq_save(flags);
1129 rnp = rdp->mynode;
1130 if (rdp->completed == ACCESS_ONCE(rnp->completed) ||
1131 !raw_spin_trylock(&rnp->lock)) {
1132 local_irq_restore(flags);
1133 return;
1134 }
1135 __rcu_process_gp_end(rsp, rnp, rdp);
1136 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1137}
1138
1139
1140
1141
1142
1143
1144static void
1145rcu_start_gp_per_cpu(struct rcu_state *rsp, struct rcu_node *rnp, struct rcu_data *rdp)
1146{
1147
1148 __rcu_process_gp_end(rsp, rnp, rdp);
1149
1150
1151 __note_new_gpnum(rsp, rnp, rdp);
1152}
1153
1154
1155
1156
1157static int rcu_gp_init(struct rcu_state *rsp)
1158{
1159 struct rcu_data *rdp;
1160 struct rcu_node *rnp = rcu_get_root(rsp);
1161
1162 raw_spin_lock_irq(&rnp->lock);
1163 rsp->gp_flags = 0;
1164
1165 if (rcu_gp_in_progress(rsp)) {
1166
1167 raw_spin_unlock_irq(&rnp->lock);
1168 return 0;
1169 }
1170
1171
1172 rsp->gpnum++;
1173 trace_rcu_grace_period(rsp->name, rsp->gpnum, "start");
1174 record_gp_stall_check_time(rsp);
1175 raw_spin_unlock_irq(&rnp->lock);
1176
1177
1178 mutex_lock(&rsp->onoff_mutex);
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193 rcu_for_each_node_breadth_first(rsp, rnp) {
1194 raw_spin_lock_irq(&rnp->lock);
1195 rdp = this_cpu_ptr(rsp->rda);
1196 rcu_preempt_check_blocked_tasks(rnp);
1197 rnp->qsmask = rnp->qsmaskinit;
1198 rnp->gpnum = rsp->gpnum;
1199 WARN_ON_ONCE(rnp->completed != rsp->completed);
1200 rnp->completed = rsp->completed;
1201 if (rnp == rdp->mynode)
1202 rcu_start_gp_per_cpu(rsp, rnp, rdp);
1203 rcu_preempt_boost_start_gp(rnp);
1204 trace_rcu_grace_period_init(rsp->name, rnp->gpnum,
1205 rnp->level, rnp->grplo,
1206 rnp->grphi, rnp->qsmask);
1207 raw_spin_unlock_irq(&rnp->lock);
1208#ifdef CONFIG_PROVE_RCU_DELAY
1209 if ((random32() % (rcu_num_nodes * 8)) == 0)
1210 schedule_timeout_uninterruptible(2);
1211#endif
1212 cond_resched();
1213 }
1214
1215 mutex_unlock(&rsp->onoff_mutex);
1216 return 1;
1217}
1218
1219
1220
1221
1222int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in)
1223{
1224 int fqs_state = fqs_state_in;
1225 struct rcu_node *rnp = rcu_get_root(rsp);
1226
1227 rsp->n_force_qs++;
1228 if (fqs_state == RCU_SAVE_DYNTICK) {
1229
1230 force_qs_rnp(rsp, dyntick_save_progress_counter);
1231 fqs_state = RCU_FORCE_QS;
1232 } else {
1233
1234 force_qs_rnp(rsp, rcu_implicit_dynticks_qs);
1235 }
1236
1237 if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
1238 raw_spin_lock_irq(&rnp->lock);
1239 rsp->gp_flags &= ~RCU_GP_FLAG_FQS;
1240 raw_spin_unlock_irq(&rnp->lock);
1241 }
1242 return fqs_state;
1243}
1244
1245
1246
1247
1248static void rcu_gp_cleanup(struct rcu_state *rsp)
1249{
1250 unsigned long gp_duration;
1251 struct rcu_data *rdp;
1252 struct rcu_node *rnp = rcu_get_root(rsp);
1253
1254 raw_spin_lock_irq(&rnp->lock);
1255 gp_duration = jiffies - rsp->gp_start;
1256 if (gp_duration > rsp->gp_max)
1257 rsp->gp_max = gp_duration;
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267 raw_spin_unlock_irq(&rnp->lock);
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278 rcu_for_each_node_breadth_first(rsp, rnp) {
1279 raw_spin_lock_irq(&rnp->lock);
1280 rnp->completed = rsp->gpnum;
1281 raw_spin_unlock_irq(&rnp->lock);
1282 cond_resched();
1283 }
1284 rnp = rcu_get_root(rsp);
1285 raw_spin_lock_irq(&rnp->lock);
1286
1287 rsp->completed = rsp->gpnum;
1288 trace_rcu_grace_period(rsp->name, rsp->completed, "end");
1289 rsp->fqs_state = RCU_GP_IDLE;
1290 rdp = this_cpu_ptr(rsp->rda);
1291 if (cpu_needs_another_gp(rsp, rdp))
1292 rsp->gp_flags = 1;
1293 raw_spin_unlock_irq(&rnp->lock);
1294}
1295
1296
1297
1298
1299static int __noreturn rcu_gp_kthread(void *arg)
1300{
1301 int fqs_state;
1302 unsigned long j;
1303 int ret;
1304 struct rcu_state *rsp = arg;
1305 struct rcu_node *rnp = rcu_get_root(rsp);
1306
1307 for (;;) {
1308
1309
1310 for (;;) {
1311 wait_event_interruptible(rsp->gp_wq,
1312 rsp->gp_flags &
1313 RCU_GP_FLAG_INIT);
1314 if ((rsp->gp_flags & RCU_GP_FLAG_INIT) &&
1315 rcu_gp_init(rsp))
1316 break;
1317 cond_resched();
1318 flush_signals(current);
1319 }
1320
1321
1322 fqs_state = RCU_SAVE_DYNTICK;
1323 j = jiffies_till_first_fqs;
1324 if (j > HZ) {
1325 j = HZ;
1326 jiffies_till_first_fqs = HZ;
1327 }
1328 for (;;) {
1329 rsp->jiffies_force_qs = jiffies + j;
1330 ret = wait_event_interruptible_timeout(rsp->gp_wq,
1331 (rsp->gp_flags & RCU_GP_FLAG_FQS) ||
1332 (!ACCESS_ONCE(rnp->qsmask) &&
1333 !rcu_preempt_blocked_readers_cgp(rnp)),
1334 j);
1335
1336 if (!ACCESS_ONCE(rnp->qsmask) &&
1337 !rcu_preempt_blocked_readers_cgp(rnp))
1338 break;
1339
1340 if (ret == 0 || (rsp->gp_flags & RCU_GP_FLAG_FQS)) {
1341 fqs_state = rcu_gp_fqs(rsp, fqs_state);
1342 cond_resched();
1343 } else {
1344
1345 cond_resched();
1346 flush_signals(current);
1347 }
1348 j = jiffies_till_next_fqs;
1349 if (j > HZ) {
1350 j = HZ;
1351 jiffies_till_next_fqs = HZ;
1352 } else if (j < 1) {
1353 j = 1;
1354 jiffies_till_next_fqs = 1;
1355 }
1356 }
1357
1358
1359 rcu_gp_cleanup(rsp);
1360 }
1361}
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373static void
1374rcu_start_gp(struct rcu_state *rsp, unsigned long flags)
1375 __releases(rcu_get_root(rsp)->lock)
1376{
1377 struct rcu_data *rdp = this_cpu_ptr(rsp->rda);
1378 struct rcu_node *rnp = rcu_get_root(rsp);
1379
1380 if (!rsp->gp_kthread ||
1381 !cpu_needs_another_gp(rsp, rdp)) {
1382
1383
1384
1385
1386
1387
1388 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1389 return;
1390 }
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403 rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL];
1404 if (rdp->completed == rsp->completed)
1405 rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_TAIL];
1406
1407 rsp->gp_flags = RCU_GP_FLAG_INIT;
1408 raw_spin_unlock(&rnp->lock);
1409
1410
1411 rcu_process_gp_end(rsp, rdp);
1412 local_irq_restore(flags);
1413
1414
1415 wake_up(&rsp->gp_wq);
1416}
1417
1418
1419
1420
1421
1422
1423
1424
1425static void rcu_report_qs_rsp(struct rcu_state *rsp, unsigned long flags)
1426 __releases(rcu_get_root(rsp)->lock)
1427{
1428 WARN_ON_ONCE(!rcu_gp_in_progress(rsp));
1429 raw_spin_unlock_irqrestore(&rcu_get_root(rsp)->lock, flags);
1430 wake_up(&rsp->gp_wq);
1431}
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441static void
1442rcu_report_qs_rnp(unsigned long mask, struct rcu_state *rsp,
1443 struct rcu_node *rnp, unsigned long flags)
1444 __releases(rnp->lock)
1445{
1446 struct rcu_node *rnp_c;
1447
1448
1449 for (;;) {
1450 if (!(rnp->qsmask & mask)) {
1451
1452
1453 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1454 return;
1455 }
1456 rnp->qsmask &= ~mask;
1457 trace_rcu_quiescent_state_report(rsp->name, rnp->gpnum,
1458 mask, rnp->qsmask, rnp->level,
1459 rnp->grplo, rnp->grphi,
1460 !!rnp->gp_tasks);
1461 if (rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) {
1462
1463
1464 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1465 return;
1466 }
1467 mask = rnp->grpmask;
1468 if (rnp->parent == NULL) {
1469
1470
1471
1472 break;
1473 }
1474 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1475 rnp_c = rnp;
1476 rnp = rnp->parent;
1477 raw_spin_lock_irqsave(&rnp->lock, flags);
1478 WARN_ON_ONCE(rnp_c->qsmask);
1479 }
1480
1481
1482
1483
1484
1485
1486 rcu_report_qs_rsp(rsp, flags);
1487}
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498static void
1499rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp)
1500{
1501 unsigned long flags;
1502 unsigned long mask;
1503 struct rcu_node *rnp;
1504
1505 rnp = rdp->mynode;
1506 raw_spin_lock_irqsave(&rnp->lock, flags);
1507 if (rdp->passed_quiesce == 0 || rdp->gpnum != rnp->gpnum ||
1508 rnp->completed == rnp->gpnum) {
1509
1510
1511
1512
1513
1514
1515
1516 rdp->passed_quiesce = 0;
1517 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1518 return;
1519 }
1520 mask = rdp->grpmask;
1521 if ((rnp->qsmask & mask) == 0) {
1522 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1523 } else {
1524 rdp->qs_pending = 0;
1525
1526
1527
1528
1529
1530 rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL];
1531
1532 rcu_report_qs_rnp(mask, rsp, rnp, flags);
1533 }
1534}
1535
1536
1537
1538
1539
1540
1541
1542static void
1543rcu_check_quiescent_state(struct rcu_state *rsp, struct rcu_data *rdp)
1544{
1545
1546 if (check_for_new_grace_period(rsp, rdp))
1547 return;
1548
1549
1550
1551
1552
1553 if (!rdp->qs_pending)
1554 return;
1555
1556
1557
1558
1559
1560 if (!rdp->passed_quiesce)
1561 return;
1562
1563
1564
1565
1566
1567 rcu_report_qs_rdp(rdp->cpu, rsp, rdp);
1568}
1569
1570#ifdef CONFIG_HOTPLUG_CPU
1571
1572
1573
1574
1575
1576
1577static void
1578rcu_send_cbs_to_orphanage(int cpu, struct rcu_state *rsp,
1579 struct rcu_node *rnp, struct rcu_data *rdp)
1580{
1581
1582 if (is_nocb_cpu(rdp->cpu))
1583 return;
1584
1585
1586
1587
1588
1589
1590 if (rdp->nxtlist != NULL) {
1591 rsp->qlen_lazy += rdp->qlen_lazy;
1592 rsp->qlen += rdp->qlen;
1593 rdp->n_cbs_orphaned += rdp->qlen;
1594 rdp->qlen_lazy = 0;
1595 ACCESS_ONCE(rdp->qlen) = 0;
1596 }
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607 if (*rdp->nxttail[RCU_DONE_TAIL] != NULL) {
1608 *rsp->orphan_nxttail = *rdp->nxttail[RCU_DONE_TAIL];
1609 rsp->orphan_nxttail = rdp->nxttail[RCU_NEXT_TAIL];
1610 *rdp->nxttail[RCU_DONE_TAIL] = NULL;
1611 }
1612
1613
1614
1615
1616
1617
1618 if (rdp->nxtlist != NULL) {
1619 *rsp->orphan_donetail = rdp->nxtlist;
1620 rsp->orphan_donetail = rdp->nxttail[RCU_DONE_TAIL];
1621 }
1622
1623
1624 init_callback_list(rdp);
1625}
1626
1627
1628
1629
1630
1631static void rcu_adopt_orphan_cbs(struct rcu_state *rsp)
1632{
1633 int i;
1634 struct rcu_data *rdp = __this_cpu_ptr(rsp->rda);
1635
1636
1637 if (rcu_nocb_adopt_orphan_cbs(rsp, rdp))
1638 return;
1639
1640
1641 rdp->qlen_lazy += rsp->qlen_lazy;
1642 rdp->qlen += rsp->qlen;
1643 rdp->n_cbs_adopted += rsp->qlen;
1644 if (rsp->qlen_lazy != rsp->qlen)
1645 rcu_idle_count_callbacks_posted();
1646 rsp->qlen_lazy = 0;
1647 rsp->qlen = 0;
1648
1649
1650
1651
1652
1653
1654
1655
1656 if (rsp->orphan_donelist != NULL) {
1657 *rsp->orphan_donetail = *rdp->nxttail[RCU_DONE_TAIL];
1658 *rdp->nxttail[RCU_DONE_TAIL] = rsp->orphan_donelist;
1659 for (i = RCU_NEXT_SIZE - 1; i >= RCU_DONE_TAIL; i--)
1660 if (rdp->nxttail[i] == rdp->nxttail[RCU_DONE_TAIL])
1661 rdp->nxttail[i] = rsp->orphan_donetail;
1662 rsp->orphan_donelist = NULL;
1663 rsp->orphan_donetail = &rsp->orphan_donelist;
1664 }
1665
1666
1667 if (rsp->orphan_nxtlist != NULL) {
1668 *rdp->nxttail[RCU_NEXT_TAIL] = rsp->orphan_nxtlist;
1669 rdp->nxttail[RCU_NEXT_TAIL] = rsp->orphan_nxttail;
1670 rsp->orphan_nxtlist = NULL;
1671 rsp->orphan_nxttail = &rsp->orphan_nxtlist;
1672 }
1673}
1674
1675
1676
1677
1678static void rcu_cleanup_dying_cpu(struct rcu_state *rsp)
1679{
1680 RCU_TRACE(unsigned long mask);
1681 RCU_TRACE(struct rcu_data *rdp = this_cpu_ptr(rsp->rda));
1682 RCU_TRACE(struct rcu_node *rnp = rdp->mynode);
1683
1684 RCU_TRACE(mask = rdp->grpmask);
1685 trace_rcu_grace_period(rsp->name,
1686 rnp->gpnum + 1 - !!(rnp->qsmask & mask),
1687 "cpuofl");
1688}
1689
1690
1691
1692
1693
1694
1695
1696
1697static void rcu_cleanup_dead_cpu(int cpu, struct rcu_state *rsp)
1698{
1699 unsigned long flags;
1700 unsigned long mask;
1701 int need_report = 0;
1702 struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
1703 struct rcu_node *rnp = rdp->mynode;
1704
1705
1706 rcu_boost_kthread_setaffinity(rnp, -1);
1707
1708
1709
1710
1711 mutex_lock(&rsp->onoff_mutex);
1712 raw_spin_lock_irqsave(&rsp->orphan_lock, flags);
1713
1714
1715 rcu_send_cbs_to_orphanage(cpu, rsp, rnp, rdp);
1716 rcu_adopt_orphan_cbs(rsp);
1717
1718
1719 mask = rdp->grpmask;
1720 do {
1721 raw_spin_lock(&rnp->lock);
1722 rnp->qsmaskinit &= ~mask;
1723 if (rnp->qsmaskinit != 0) {
1724 if (rnp != rdp->mynode)
1725 raw_spin_unlock(&rnp->lock);
1726 break;
1727 }
1728 if (rnp == rdp->mynode)
1729 need_report = rcu_preempt_offline_tasks(rsp, rnp, rdp);
1730 else
1731 raw_spin_unlock(&rnp->lock);
1732 mask = rnp->grpmask;
1733 rnp = rnp->parent;
1734 } while (rnp != NULL);
1735
1736
1737
1738
1739
1740
1741
1742 raw_spin_unlock(&rsp->orphan_lock);
1743 rnp = rdp->mynode;
1744 if (need_report & RCU_OFL_TASKS_NORM_GP)
1745 rcu_report_unblock_qs_rnp(rnp, flags);
1746 else
1747 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1748 if (need_report & RCU_OFL_TASKS_EXP_GP)
1749 rcu_report_exp_rnp(rsp, rnp, true);
1750 WARN_ONCE(rdp->qlen != 0 || rdp->nxtlist != NULL,
1751 "rcu_cleanup_dead_cpu: Callbacks on offline CPU %d: qlen=%lu, nxtlist=%p\n",
1752 cpu, rdp->qlen, rdp->nxtlist);
1753 init_callback_list(rdp);
1754
1755 rdp->nxttail[RCU_NEXT_TAIL] = NULL;
1756 mutex_unlock(&rsp->onoff_mutex);
1757}
1758
1759#else
1760
1761static void rcu_cleanup_dying_cpu(struct rcu_state *rsp)
1762{
1763}
1764
1765static void rcu_cleanup_dead_cpu(int cpu, struct rcu_state *rsp)
1766{
1767}
1768
1769#endif
1770
1771
1772
1773
1774
1775static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)
1776{
1777 unsigned long flags;
1778 struct rcu_head *next, *list, **tail;
1779 long bl, count, count_lazy;
1780 int i;
1781
1782
1783 if (!cpu_has_callbacks_ready_to_invoke(rdp)) {
1784 trace_rcu_batch_start(rsp->name, rdp->qlen_lazy, rdp->qlen, 0);
1785 trace_rcu_batch_end(rsp->name, 0, !!ACCESS_ONCE(rdp->nxtlist),
1786 need_resched(), is_idle_task(current),
1787 rcu_is_callbacks_kthread());
1788 return;
1789 }
1790
1791
1792
1793
1794
1795 local_irq_save(flags);
1796 WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
1797 bl = rdp->blimit;
1798 trace_rcu_batch_start(rsp->name, rdp->qlen_lazy, rdp->qlen, bl);
1799 list = rdp->nxtlist;
1800 rdp->nxtlist = *rdp->nxttail[RCU_DONE_TAIL];
1801 *rdp->nxttail[RCU_DONE_TAIL] = NULL;
1802 tail = rdp->nxttail[RCU_DONE_TAIL];
1803 for (i = RCU_NEXT_SIZE - 1; i >= 0; i--)
1804 if (rdp->nxttail[i] == rdp->nxttail[RCU_DONE_TAIL])
1805 rdp->nxttail[i] = &rdp->nxtlist;
1806 local_irq_restore(flags);
1807
1808
1809 count = count_lazy = 0;
1810 while (list) {
1811 next = list->next;
1812 prefetch(next);
1813 debug_rcu_head_unqueue(list);
1814 if (__rcu_reclaim(rsp->name, list))
1815 count_lazy++;
1816 list = next;
1817
1818 if (++count >= bl &&
1819 (need_resched() ||
1820 (!is_idle_task(current) && !rcu_is_callbacks_kthread())))
1821 break;
1822 }
1823
1824 local_irq_save(flags);
1825 trace_rcu_batch_end(rsp->name, count, !!list, need_resched(),
1826 is_idle_task(current),
1827 rcu_is_callbacks_kthread());
1828
1829
1830 if (list != NULL) {
1831 *tail = rdp->nxtlist;
1832 rdp->nxtlist = list;
1833 for (i = 0; i < RCU_NEXT_SIZE; i++)
1834 if (&rdp->nxtlist == rdp->nxttail[i])
1835 rdp->nxttail[i] = tail;
1836 else
1837 break;
1838 }
1839 smp_mb();
1840 rdp->qlen_lazy -= count_lazy;
1841 ACCESS_ONCE(rdp->qlen) -= count;
1842 rdp->n_cbs_invoked += count;
1843
1844
1845 if (rdp->blimit == LONG_MAX && rdp->qlen <= qlowmark)
1846 rdp->blimit = blimit;
1847
1848
1849 if (rdp->qlen == 0 && rdp->qlen_last_fqs_check != 0) {
1850 rdp->qlen_last_fqs_check = 0;
1851 rdp->n_force_qs_snap = rsp->n_force_qs;
1852 } else if (rdp->qlen < rdp->qlen_last_fqs_check - qhimark)
1853 rdp->qlen_last_fqs_check = rdp->qlen;
1854 WARN_ON_ONCE((rdp->nxtlist == NULL) != (rdp->qlen == 0));
1855
1856 local_irq_restore(flags);
1857
1858
1859 if (cpu_has_callbacks_ready_to_invoke(rdp))
1860 invoke_rcu_core();
1861}
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872void rcu_check_callbacks(int cpu, int user)
1873{
1874 trace_rcu_utilization("Start scheduler-tick");
1875 increment_cpu_stall_ticks();
1876 if (user || rcu_is_cpu_rrupt_from_idle()) {
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890 rcu_sched_qs(cpu);
1891 rcu_bh_qs(cpu);
1892
1893 } else if (!in_softirq()) {
1894
1895
1896
1897
1898
1899
1900
1901
1902 rcu_bh_qs(cpu);
1903 }
1904 rcu_preempt_check_callbacks(cpu);
1905 if (rcu_pending(cpu))
1906 invoke_rcu_core();
1907 trace_rcu_utilization("End scheduler-tick");
1908}
1909
1910
1911
1912
1913
1914
1915
1916
1917static void force_qs_rnp(struct rcu_state *rsp, int (*f)(struct rcu_data *))
1918{
1919 unsigned long bit;
1920 int cpu;
1921 unsigned long flags;
1922 unsigned long mask;
1923 struct rcu_node *rnp;
1924
1925 rcu_for_each_leaf_node(rsp, rnp) {
1926 cond_resched();
1927 mask = 0;
1928 raw_spin_lock_irqsave(&rnp->lock, flags);
1929 if (!rcu_gp_in_progress(rsp)) {
1930 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1931 return;
1932 }
1933 if (rnp->qsmask == 0) {
1934 rcu_initiate_boost(rnp, flags);
1935 continue;
1936 }
1937 cpu = rnp->grplo;
1938 bit = 1;
1939 for (; cpu <= rnp->grphi; cpu++, bit <<= 1) {
1940 if ((rnp->qsmask & bit) != 0 &&
1941 f(per_cpu_ptr(rsp->rda, cpu)))
1942 mask |= bit;
1943 }
1944 if (mask != 0) {
1945
1946
1947 rcu_report_qs_rnp(mask, rsp, rnp, flags);
1948 continue;
1949 }
1950 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1951 }
1952 rnp = rcu_get_root(rsp);
1953 if (rnp->qsmask == 0) {
1954 raw_spin_lock_irqsave(&rnp->lock, flags);
1955 rcu_initiate_boost(rnp, flags);
1956 }
1957}
1958
1959
1960
1961
1962
1963static void force_quiescent_state(struct rcu_state *rsp)
1964{
1965 unsigned long flags;
1966 bool ret;
1967 struct rcu_node *rnp;
1968 struct rcu_node *rnp_old = NULL;
1969
1970
1971 rnp = per_cpu_ptr(rsp->rda, raw_smp_processor_id())->mynode;
1972 for (; rnp != NULL; rnp = rnp->parent) {
1973 ret = (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) ||
1974 !raw_spin_trylock(&rnp->fqslock);
1975 if (rnp_old != NULL)
1976 raw_spin_unlock(&rnp_old->fqslock);
1977 if (ret) {
1978 rsp->n_force_qs_lh++;
1979 return;
1980 }
1981 rnp_old = rnp;
1982 }
1983
1984
1985
1986 raw_spin_lock_irqsave(&rnp_old->lock, flags);
1987 raw_spin_unlock(&rnp_old->fqslock);
1988 if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
1989 rsp->n_force_qs_lh++;
1990 raw_spin_unlock_irqrestore(&rnp_old->lock, flags);
1991 return;
1992 }
1993 rsp->gp_flags |= RCU_GP_FLAG_FQS;
1994 raw_spin_unlock_irqrestore(&rnp_old->lock, flags);
1995 wake_up(&rsp->gp_wq);
1996}
1997
1998
1999
2000
2001
2002
2003static void
2004__rcu_process_callbacks(struct rcu_state *rsp)
2005{
2006 unsigned long flags;
2007 struct rcu_data *rdp = __this_cpu_ptr(rsp->rda);
2008
2009 WARN_ON_ONCE(rdp->beenonline == 0);
2010
2011
2012
2013
2014
2015 rcu_process_gp_end(rsp, rdp);
2016
2017
2018 rcu_check_quiescent_state(rsp, rdp);
2019
2020
2021 if (cpu_needs_another_gp(rsp, rdp)) {
2022 raw_spin_lock_irqsave(&rcu_get_root(rsp)->lock, flags);
2023 rcu_start_gp(rsp, flags);
2024 }
2025
2026
2027 if (cpu_has_callbacks_ready_to_invoke(rdp))
2028 invoke_rcu_callbacks(rsp, rdp);
2029}
2030
2031
2032
2033
2034static void rcu_process_callbacks(struct softirq_action *unused)
2035{
2036 struct rcu_state *rsp;
2037
2038 if (cpu_is_offline(smp_processor_id()))
2039 return;
2040 trace_rcu_utilization("Start RCU core");
2041 for_each_rcu_flavor(rsp)
2042 __rcu_process_callbacks(rsp);
2043 trace_rcu_utilization("End RCU core");
2044}
2045
2046
2047
2048
2049
2050
2051
2052
2053static void invoke_rcu_callbacks(struct rcu_state *rsp, struct rcu_data *rdp)
2054{
2055 if (unlikely(!ACCESS_ONCE(rcu_scheduler_fully_active)))
2056 return;
2057 if (likely(!rsp->boost)) {
2058 rcu_do_batch(rsp, rdp);
2059 return;
2060 }
2061 invoke_rcu_callbacks_kthread();
2062}
2063
2064static void invoke_rcu_core(void)
2065{
2066 raise_softirq(RCU_SOFTIRQ);
2067}
2068
2069
2070
2071
2072static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp,
2073 struct rcu_head *head, unsigned long flags)
2074{
2075
2076
2077
2078
2079 if (rcu_is_cpu_idle() && cpu_online(smp_processor_id()))
2080 invoke_rcu_core();
2081
2082
2083 if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
2084 return;
2085
2086
2087
2088
2089
2090
2091
2092
2093 if (unlikely(rdp->qlen > rdp->qlen_last_fqs_check + qhimark)) {
2094
2095
2096 rcu_process_gp_end(rsp, rdp);
2097 check_for_new_grace_period(rsp, rdp);
2098
2099
2100 if (!rcu_gp_in_progress(rsp)) {
2101 unsigned long nestflag;
2102 struct rcu_node *rnp_root = rcu_get_root(rsp);
2103
2104 raw_spin_lock_irqsave(&rnp_root->lock, nestflag);
2105 rcu_start_gp(rsp, nestflag);
2106 } else {
2107
2108 rdp->blimit = LONG_MAX;
2109 if (rsp->n_force_qs == rdp->n_force_qs_snap &&
2110 *rdp->nxttail[RCU_DONE_TAIL] != head)
2111 force_quiescent_state(rsp);
2112 rdp->n_force_qs_snap = rsp->n_force_qs;
2113 rdp->qlen_last_fqs_check = rdp->qlen;
2114 }
2115 }
2116}
2117
2118
2119
2120
2121
2122
2123
2124static void
2125__call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
2126 struct rcu_state *rsp, int cpu, bool lazy)
2127{
2128 unsigned long flags;
2129 struct rcu_data *rdp;
2130
2131 WARN_ON_ONCE((unsigned long)head & 0x3);
2132 debug_rcu_head_queue(head);
2133 head->func = func;
2134 head->next = NULL;
2135
2136
2137
2138
2139
2140
2141
2142 local_irq_save(flags);
2143 rdp = this_cpu_ptr(rsp->rda);
2144
2145
2146 if (unlikely(rdp->nxttail[RCU_NEXT_TAIL] == NULL) || cpu != -1) {
2147 int offline;
2148
2149 if (cpu != -1)
2150 rdp = per_cpu_ptr(rsp->rda, cpu);
2151 offline = !__call_rcu_nocb(rdp, head, lazy);
2152 WARN_ON_ONCE(offline);
2153
2154 local_irq_restore(flags);
2155 return;
2156 }
2157 ACCESS_ONCE(rdp->qlen)++;
2158 if (lazy)
2159 rdp->qlen_lazy++;
2160 else
2161 rcu_idle_count_callbacks_posted();
2162 smp_mb();
2163 *rdp->nxttail[RCU_NEXT_TAIL] = head;
2164 rdp->nxttail[RCU_NEXT_TAIL] = &head->next;
2165
2166 if (__is_kfree_rcu_offset((unsigned long)func))
2167 trace_rcu_kfree_callback(rsp->name, head, (unsigned long)func,
2168 rdp->qlen_lazy, rdp->qlen);
2169 else
2170 trace_rcu_callback(rsp->name, head, rdp->qlen_lazy, rdp->qlen);
2171
2172
2173 __call_rcu_core(rsp, rdp, head, flags);
2174 local_irq_restore(flags);
2175}
2176
2177
2178
2179
2180void call_rcu_sched(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
2181{
2182 __call_rcu(head, func, &rcu_sched_state, -1, 0);
2183}
2184EXPORT_SYMBOL_GPL(call_rcu_sched);
2185
2186
2187
2188
2189void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
2190{
2191 __call_rcu(head, func, &rcu_bh_state, -1, 0);
2192}
2193EXPORT_SYMBOL_GPL(call_rcu_bh);
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204static inline int rcu_blocking_is_gp(void)
2205{
2206 int ret;
2207
2208 might_sleep();
2209 preempt_disable();
2210 ret = num_online_cpus() <= 1;
2211 preempt_enable();
2212 return ret;
2213}
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256void synchronize_sched(void)
2257{
2258 rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map) &&
2259 !lock_is_held(&rcu_lock_map) &&
2260 !lock_is_held(&rcu_sched_lock_map),
2261 "Illegal synchronize_sched() in RCU-sched read-side critical section");
2262 if (rcu_blocking_is_gp())
2263 return;
2264 if (rcu_expedited)
2265 synchronize_sched_expedited();
2266 else
2267 wait_rcu_gp(call_rcu_sched);
2268}
2269EXPORT_SYMBOL_GPL(synchronize_sched);
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283void synchronize_rcu_bh(void)
2284{
2285 rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map) &&
2286 !lock_is_held(&rcu_lock_map) &&
2287 !lock_is_held(&rcu_sched_lock_map),
2288 "Illegal synchronize_rcu_bh() in RCU-bh read-side critical section");
2289 if (rcu_blocking_is_gp())
2290 return;
2291 if (rcu_expedited)
2292 synchronize_rcu_bh_expedited();
2293 else
2294 wait_rcu_gp(call_rcu_bh);
2295}
2296EXPORT_SYMBOL_GPL(synchronize_rcu_bh);
2297
2298static int synchronize_sched_expedited_cpu_stop(void *data)
2299{
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311 smp_mb();
2312 return 0;
2313}
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352void synchronize_sched_expedited(void)
2353{
2354 long firstsnap, s, snap;
2355 int trycount = 0;
2356 struct rcu_state *rsp = &rcu_sched_state;
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366 if (ULONG_CMP_GE((ulong)atomic_long_read(&rsp->expedited_start),
2367 (ulong)atomic_long_read(&rsp->expedited_done) +
2368 ULONG_MAX / 8)) {
2369 synchronize_sched();
2370 atomic_long_inc(&rsp->expedited_wrap);
2371 return;
2372 }
2373
2374
2375
2376
2377
2378 snap = atomic_long_inc_return(&rsp->expedited_start);
2379 firstsnap = snap;
2380 get_online_cpus();
2381 WARN_ON_ONCE(cpu_is_offline(raw_smp_processor_id()));
2382
2383
2384
2385
2386
2387 while (try_stop_cpus(cpu_online_mask,
2388 synchronize_sched_expedited_cpu_stop,
2389 NULL) == -EAGAIN) {
2390 put_online_cpus();
2391 atomic_long_inc(&rsp->expedited_tryfail);
2392
2393
2394 s = atomic_long_read(&rsp->expedited_done);
2395 if (ULONG_CMP_GE((ulong)s, (ulong)firstsnap)) {
2396
2397 smp_mb__before_atomic_inc();
2398 atomic_long_inc(&rsp->expedited_workdone1);
2399 return;
2400 }
2401
2402
2403 if (trycount++ < 10) {
2404 udelay(trycount * num_online_cpus());
2405 } else {
2406 wait_rcu_gp(call_rcu_sched);
2407 atomic_long_inc(&rsp->expedited_normal);
2408 return;
2409 }
2410
2411
2412 s = atomic_long_read(&rsp->expedited_done);
2413 if (ULONG_CMP_GE((ulong)s, (ulong)firstsnap)) {
2414
2415 smp_mb__before_atomic_inc();
2416 atomic_long_inc(&rsp->expedited_workdone2);
2417 return;
2418 }
2419
2420
2421
2422
2423
2424
2425
2426
2427 get_online_cpus();
2428 snap = atomic_long_read(&rsp->expedited_start);
2429 smp_mb();
2430 }
2431 atomic_long_inc(&rsp->expedited_stoppedcpus);
2432
2433
2434
2435
2436
2437
2438
2439 do {
2440 atomic_long_inc(&rsp->expedited_done_tries);
2441 s = atomic_long_read(&rsp->expedited_done);
2442 if (ULONG_CMP_GE((ulong)s, (ulong)snap)) {
2443
2444 smp_mb__before_atomic_inc();
2445 atomic_long_inc(&rsp->expedited_done_lost);
2446 break;
2447 }
2448 } while (atomic_long_cmpxchg(&rsp->expedited_done, s, snap) != s);
2449 atomic_long_inc(&rsp->expedited_done_exit);
2450
2451 put_online_cpus();
2452}
2453EXPORT_SYMBOL_GPL(synchronize_sched_expedited);
2454
2455
2456
2457
2458
2459
2460
2461
2462static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp)
2463{
2464 struct rcu_node *rnp = rdp->mynode;
2465
2466 rdp->n_rcu_pending++;
2467
2468
2469 check_cpu_stall(rsp, rdp);
2470
2471
2472 if (rcu_scheduler_fully_active &&
2473 rdp->qs_pending && !rdp->passed_quiesce) {
2474 rdp->n_rp_qs_pending++;
2475 } else if (rdp->qs_pending && rdp->passed_quiesce) {
2476 rdp->n_rp_report_qs++;
2477 return 1;
2478 }
2479
2480
2481 if (cpu_has_callbacks_ready_to_invoke(rdp)) {
2482 rdp->n_rp_cb_ready++;
2483 return 1;
2484 }
2485
2486
2487 if (cpu_needs_another_gp(rsp, rdp)) {
2488 rdp->n_rp_cpu_needs_gp++;
2489 return 1;
2490 }
2491
2492
2493 if (ACCESS_ONCE(rnp->completed) != rdp->completed) {
2494 rdp->n_rp_gp_completed++;
2495 return 1;
2496 }
2497
2498
2499 if (ACCESS_ONCE(rnp->gpnum) != rdp->gpnum) {
2500 rdp->n_rp_gp_started++;
2501 return 1;
2502 }
2503
2504
2505 rdp->n_rp_need_nothing++;
2506 return 0;
2507}
2508
2509
2510
2511
2512
2513
2514static int rcu_pending(int cpu)
2515{
2516 struct rcu_state *rsp;
2517
2518 for_each_rcu_flavor(rsp)
2519 if (__rcu_pending(rsp, per_cpu_ptr(rsp->rda, cpu)))
2520 return 1;
2521 return 0;
2522}
2523
2524
2525
2526
2527
2528
2529static int rcu_cpu_has_callbacks(int cpu)
2530{
2531 struct rcu_state *rsp;
2532
2533
2534 for_each_rcu_flavor(rsp)
2535 if (per_cpu_ptr(rsp->rda, cpu)->nxtlist)
2536 return 1;
2537 return 0;
2538}
2539
2540
2541
2542
2543
2544static void _rcu_barrier_trace(struct rcu_state *rsp, char *s,
2545 int cpu, unsigned long done)
2546{
2547 trace_rcu_barrier(rsp->name, s, cpu,
2548 atomic_read(&rsp->barrier_cpu_count), done);
2549}
2550
2551
2552
2553
2554
2555static void rcu_barrier_callback(struct rcu_head *rhp)
2556{
2557 struct rcu_data *rdp = container_of(rhp, struct rcu_data, barrier_head);
2558 struct rcu_state *rsp = rdp->rsp;
2559
2560 if (atomic_dec_and_test(&rsp->barrier_cpu_count)) {
2561 _rcu_barrier_trace(rsp, "LastCB", -1, rsp->n_barrier_done);
2562 complete(&rsp->barrier_completion);
2563 } else {
2564 _rcu_barrier_trace(rsp, "CB", -1, rsp->n_barrier_done);
2565 }
2566}
2567
2568
2569
2570
2571static void rcu_barrier_func(void *type)
2572{
2573 struct rcu_state *rsp = type;
2574 struct rcu_data *rdp = __this_cpu_ptr(rsp->rda);
2575
2576 _rcu_barrier_trace(rsp, "IRQ", -1, rsp->n_barrier_done);
2577 atomic_inc(&rsp->barrier_cpu_count);
2578 rsp->call(&rdp->barrier_head, rcu_barrier_callback);
2579}
2580
2581
2582
2583
2584
2585static void _rcu_barrier(struct rcu_state *rsp)
2586{
2587 int cpu;
2588 struct rcu_data *rdp;
2589 unsigned long snap = ACCESS_ONCE(rsp->n_barrier_done);
2590 unsigned long snap_done;
2591
2592 _rcu_barrier_trace(rsp, "Begin", -1, snap);
2593
2594
2595 mutex_lock(&rsp->barrier_mutex);
2596
2597
2598
2599
2600
2601 smp_mb();
2602
2603
2604
2605
2606
2607
2608
2609 snap_done = ACCESS_ONCE(rsp->n_barrier_done);
2610 _rcu_barrier_trace(rsp, "Check", -1, snap_done);
2611 if (ULONG_CMP_GE(snap_done, ((snap + 1) & ~0x1) + 2)) {
2612 _rcu_barrier_trace(rsp, "EarlyExit", -1, snap_done);
2613 smp_mb();
2614 mutex_unlock(&rsp->barrier_mutex);
2615 return;
2616 }
2617
2618
2619
2620
2621
2622
2623 ACCESS_ONCE(rsp->n_barrier_done)++;
2624 WARN_ON_ONCE((rsp->n_barrier_done & 0x1) != 1);
2625 _rcu_barrier_trace(rsp, "Inc1", -1, rsp->n_barrier_done);
2626 smp_mb();
2627
2628
2629
2630
2631
2632
2633
2634 init_completion(&rsp->barrier_completion);
2635 atomic_set(&rsp->barrier_cpu_count, 1);
2636 get_online_cpus();
2637
2638
2639
2640
2641
2642
2643 for_each_possible_cpu(cpu) {
2644 if (!cpu_online(cpu) && !is_nocb_cpu(cpu))
2645 continue;
2646 rdp = per_cpu_ptr(rsp->rda, cpu);
2647 if (is_nocb_cpu(cpu)) {
2648 _rcu_barrier_trace(rsp, "OnlineNoCB", cpu,
2649 rsp->n_barrier_done);
2650 atomic_inc(&rsp->barrier_cpu_count);
2651 __call_rcu(&rdp->barrier_head, rcu_barrier_callback,
2652 rsp, cpu, 0);
2653 } else if (ACCESS_ONCE(rdp->qlen)) {
2654 _rcu_barrier_trace(rsp, "OnlineQ", cpu,
2655 rsp->n_barrier_done);
2656 smp_call_function_single(cpu, rcu_barrier_func, rsp, 1);
2657 } else {
2658 _rcu_barrier_trace(rsp, "OnlineNQ", cpu,
2659 rsp->n_barrier_done);
2660 }
2661 }
2662 put_online_cpus();
2663
2664
2665
2666
2667
2668 if (atomic_dec_and_test(&rsp->barrier_cpu_count))
2669 complete(&rsp->barrier_completion);
2670
2671
2672 smp_mb();
2673 ACCESS_ONCE(rsp->n_barrier_done)++;
2674 WARN_ON_ONCE((rsp->n_barrier_done & 0x1) != 0);
2675 _rcu_barrier_trace(rsp, "Inc2", -1, rsp->n_barrier_done);
2676 smp_mb();
2677
2678
2679 wait_for_completion(&rsp->barrier_completion);
2680
2681
2682 mutex_unlock(&rsp->barrier_mutex);
2683}
2684
2685
2686
2687
2688void rcu_barrier_bh(void)
2689{
2690 _rcu_barrier(&rcu_bh_state);
2691}
2692EXPORT_SYMBOL_GPL(rcu_barrier_bh);
2693
2694
2695
2696
2697void rcu_barrier_sched(void)
2698{
2699 _rcu_barrier(&rcu_sched_state);
2700}
2701EXPORT_SYMBOL_GPL(rcu_barrier_sched);
2702
2703
2704
2705
2706static void __init
2707rcu_boot_init_percpu_data(int cpu, struct rcu_state *rsp)
2708{
2709 unsigned long flags;
2710 struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
2711 struct rcu_node *rnp = rcu_get_root(rsp);
2712
2713
2714 raw_spin_lock_irqsave(&rnp->lock, flags);
2715 rdp->grpmask = 1UL << (cpu - rdp->mynode->grplo);
2716 init_callback_list(rdp);
2717 rdp->qlen_lazy = 0;
2718 ACCESS_ONCE(rdp->qlen) = 0;
2719 rdp->dynticks = &per_cpu(rcu_dynticks, cpu);
2720 WARN_ON_ONCE(rdp->dynticks->dynticks_nesting != DYNTICK_TASK_EXIT_IDLE);
2721 WARN_ON_ONCE(atomic_read(&rdp->dynticks->dynticks) != 1);
2722#ifdef CONFIG_RCU_USER_QS
2723 WARN_ON_ONCE(rdp->dynticks->in_user);
2724#endif
2725 rdp->cpu = cpu;
2726 rdp->rsp = rsp;
2727 rcu_boot_init_nocb_percpu_data(rdp);
2728 raw_spin_unlock_irqrestore(&rnp->lock, flags);
2729}
2730
2731
2732
2733
2734
2735
2736
2737static void __cpuinit
2738rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible)
2739{
2740 unsigned long flags;
2741 unsigned long mask;
2742 struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
2743 struct rcu_node *rnp = rcu_get_root(rsp);
2744
2745
2746 mutex_lock(&rsp->onoff_mutex);
2747
2748
2749 raw_spin_lock_irqsave(&rnp->lock, flags);
2750 rdp->beenonline = 1;
2751 rdp->preemptible = preemptible;
2752 rdp->qlen_last_fqs_check = 0;
2753 rdp->n_force_qs_snap = rsp->n_force_qs;
2754 rdp->blimit = blimit;
2755 init_callback_list(rdp);
2756 rdp->dynticks->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE;
2757 atomic_set(&rdp->dynticks->dynticks,
2758 (atomic_read(&rdp->dynticks->dynticks) & ~0x1) + 1);
2759 rcu_prepare_for_idle_init(cpu);
2760 raw_spin_unlock(&rnp->lock);
2761
2762
2763 rnp = rdp->mynode;
2764 mask = rdp->grpmask;
2765 do {
2766
2767 raw_spin_lock(&rnp->lock);
2768 rnp->qsmaskinit |= mask;
2769 mask = rnp->grpmask;
2770 if (rnp == rdp->mynode) {
2771
2772
2773
2774
2775
2776 rdp->gpnum = rnp->completed;
2777 rdp->completed = rnp->completed;
2778 rdp->passed_quiesce = 0;
2779 rdp->qs_pending = 0;
2780 trace_rcu_grace_period(rsp->name, rdp->gpnum, "cpuonl");
2781 }
2782 raw_spin_unlock(&rnp->lock);
2783 rnp = rnp->parent;
2784 } while (rnp != NULL && !(rnp->qsmaskinit & mask));
2785 local_irq_restore(flags);
2786
2787 mutex_unlock(&rsp->onoff_mutex);
2788}
2789
2790static void __cpuinit rcu_prepare_cpu(int cpu)
2791{
2792 struct rcu_state *rsp;
2793
2794 for_each_rcu_flavor(rsp)
2795 rcu_init_percpu_data(cpu, rsp,
2796 strcmp(rsp->name, "rcu_preempt") == 0);
2797}
2798
2799
2800
2801
2802static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
2803 unsigned long action, void *hcpu)
2804{
2805 long cpu = (long)hcpu;
2806 struct rcu_data *rdp = per_cpu_ptr(rcu_state->rda, cpu);
2807 struct rcu_node *rnp = rdp->mynode;
2808 struct rcu_state *rsp;
2809 int ret = NOTIFY_OK;
2810
2811 trace_rcu_utilization("Start CPU hotplug");
2812 switch (action) {
2813 case CPU_UP_PREPARE:
2814 case CPU_UP_PREPARE_FROZEN:
2815 rcu_prepare_cpu(cpu);
2816 rcu_prepare_kthreads(cpu);
2817 break;
2818 case CPU_ONLINE:
2819 case CPU_DOWN_FAILED:
2820 rcu_boost_kthread_setaffinity(rnp, -1);
2821 break;
2822 case CPU_DOWN_PREPARE:
2823 if (nocb_cpu_expendable(cpu))
2824 rcu_boost_kthread_setaffinity(rnp, cpu);
2825 else
2826 ret = NOTIFY_BAD;
2827 break;
2828 case CPU_DYING:
2829 case CPU_DYING_FROZEN:
2830
2831
2832
2833
2834
2835 for_each_rcu_flavor(rsp)
2836 rcu_cleanup_dying_cpu(rsp);
2837 rcu_cleanup_after_idle(cpu);
2838 break;
2839 case CPU_DEAD:
2840 case CPU_DEAD_FROZEN:
2841 case CPU_UP_CANCELED:
2842 case CPU_UP_CANCELED_FROZEN:
2843 for_each_rcu_flavor(rsp)
2844 rcu_cleanup_dead_cpu(cpu, rsp);
2845 break;
2846 default:
2847 break;
2848 }
2849 trace_rcu_utilization("End CPU hotplug");
2850 return ret;
2851}
2852
2853
2854
2855
2856static int __init rcu_spawn_gp_kthread(void)
2857{
2858 unsigned long flags;
2859 struct rcu_node *rnp;
2860 struct rcu_state *rsp;
2861 struct task_struct *t;
2862
2863 for_each_rcu_flavor(rsp) {
2864 t = kthread_run(rcu_gp_kthread, rsp, rsp->name);
2865 BUG_ON(IS_ERR(t));
2866 rnp = rcu_get_root(rsp);
2867 raw_spin_lock_irqsave(&rnp->lock, flags);
2868 rsp->gp_kthread = t;
2869 raw_spin_unlock_irqrestore(&rnp->lock, flags);
2870 rcu_spawn_nocb_kthreads(rsp);
2871 }
2872 return 0;
2873}
2874early_initcall(rcu_spawn_gp_kthread);
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884void rcu_scheduler_starting(void)
2885{
2886 WARN_ON(num_online_cpus() != 1);
2887 WARN_ON(nr_context_switches() > 0);
2888 rcu_scheduler_active = 1;
2889}
2890
2891
2892
2893
2894
2895#ifdef CONFIG_RCU_FANOUT_EXACT
2896static void __init rcu_init_levelspread(struct rcu_state *rsp)
2897{
2898 int i;
2899
2900 for (i = rcu_num_lvls - 1; i > 0; i--)
2901 rsp->levelspread[i] = CONFIG_RCU_FANOUT;
2902 rsp->levelspread[0] = rcu_fanout_leaf;
2903}
2904#else
2905static void __init rcu_init_levelspread(struct rcu_state *rsp)
2906{
2907 int ccur;
2908 int cprv;
2909 int i;
2910
2911 cprv = nr_cpu_ids;
2912 for (i = rcu_num_lvls - 1; i >= 0; i--) {
2913 ccur = rsp->levelcnt[i];
2914 rsp->levelspread[i] = (cprv + ccur - 1) / ccur;
2915 cprv = ccur;
2916 }
2917}
2918#endif
2919
2920
2921
2922
2923static void __init rcu_init_one(struct rcu_state *rsp,
2924 struct rcu_data __percpu *rda)
2925{
2926 static char *buf[] = { "rcu_node_0",
2927 "rcu_node_1",
2928 "rcu_node_2",
2929 "rcu_node_3" };
2930 static char *fqs[] = { "rcu_node_fqs_0",
2931 "rcu_node_fqs_1",
2932 "rcu_node_fqs_2",
2933 "rcu_node_fqs_3" };
2934 int cpustride = 1;
2935 int i;
2936 int j;
2937 struct rcu_node *rnp;
2938
2939 BUILD_BUG_ON(MAX_RCU_LVLS > ARRAY_SIZE(buf));
2940
2941
2942
2943 for (i = 0; i < rcu_num_lvls; i++)
2944 rsp->levelcnt[i] = num_rcu_lvl[i];
2945 for (i = 1; i < rcu_num_lvls; i++)
2946 rsp->level[i] = rsp->level[i - 1] + rsp->levelcnt[i - 1];
2947 rcu_init_levelspread(rsp);
2948
2949
2950
2951 for (i = rcu_num_lvls - 1; i >= 0; i--) {
2952 cpustride *= rsp->levelspread[i];
2953 rnp = rsp->level[i];
2954 for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) {
2955 raw_spin_lock_init(&rnp->lock);
2956 lockdep_set_class_and_name(&rnp->lock,
2957 &rcu_node_class[i], buf[i]);
2958 raw_spin_lock_init(&rnp->fqslock);
2959 lockdep_set_class_and_name(&rnp->fqslock,
2960 &rcu_fqs_class[i], fqs[i]);
2961 rnp->gpnum = rsp->gpnum;
2962 rnp->completed = rsp->completed;
2963 rnp->qsmask = 0;
2964 rnp->qsmaskinit = 0;
2965 rnp->grplo = j * cpustride;
2966 rnp->grphi = (j + 1) * cpustride - 1;
2967 if (rnp->grphi >= NR_CPUS)
2968 rnp->grphi = NR_CPUS - 1;
2969 if (i == 0) {
2970 rnp->grpnum = 0;
2971 rnp->grpmask = 0;
2972 rnp->parent = NULL;
2973 } else {
2974 rnp->grpnum = j % rsp->levelspread[i - 1];
2975 rnp->grpmask = 1UL << rnp->grpnum;
2976 rnp->parent = rsp->level[i - 1] +
2977 j / rsp->levelspread[i - 1];
2978 }
2979 rnp->level = i;
2980 INIT_LIST_HEAD(&rnp->blkd_tasks);
2981 }
2982 }
2983
2984 rsp->rda = rda;
2985 init_waitqueue_head(&rsp->gp_wq);
2986 rnp = rsp->level[rcu_num_lvls - 1];
2987 for_each_possible_cpu(i) {
2988 while (i > rnp->grphi)
2989 rnp++;
2990 per_cpu_ptr(rsp->rda, i)->mynode = rnp;
2991 rcu_boot_init_percpu_data(i, rsp);
2992 }
2993 list_add(&rsp->flavors, &rcu_struct_flavors);
2994}
2995
2996
2997
2998
2999
3000
3001static void __init rcu_init_geometry(void)
3002{
3003 int i;
3004 int j;
3005 int n = nr_cpu_ids;
3006 int rcu_capacity[MAX_RCU_LVLS + 1];
3007
3008
3009 if (rcu_fanout_leaf == CONFIG_RCU_FANOUT_LEAF &&
3010 nr_cpu_ids == NR_CPUS)
3011 return;
3012
3013
3014
3015
3016
3017
3018 rcu_capacity[0] = 1;
3019 rcu_capacity[1] = rcu_fanout_leaf;
3020 for (i = 2; i <= MAX_RCU_LVLS; i++)
3021 rcu_capacity[i] = rcu_capacity[i - 1] * CONFIG_RCU_FANOUT;
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031 if (rcu_fanout_leaf < CONFIG_RCU_FANOUT_LEAF ||
3032 rcu_fanout_leaf > sizeof(unsigned long) * 8 ||
3033 n > rcu_capacity[MAX_RCU_LVLS]) {
3034 WARN_ON(1);
3035 return;
3036 }
3037
3038
3039 for (i = 1; i <= MAX_RCU_LVLS; i++)
3040 if (n <= rcu_capacity[i]) {
3041 for (j = 0; j <= i; j++)
3042 num_rcu_lvl[j] =
3043 DIV_ROUND_UP(n, rcu_capacity[i - j]);
3044 rcu_num_lvls = i;
3045 for (j = i + 1; j <= MAX_RCU_LVLS; j++)
3046 num_rcu_lvl[j] = 0;
3047 break;
3048 }
3049
3050
3051 rcu_num_nodes = 0;
3052 for (i = 0; i <= MAX_RCU_LVLS; i++)
3053 rcu_num_nodes += num_rcu_lvl[i];
3054 rcu_num_nodes -= n;
3055}
3056
3057void __init rcu_init(void)
3058{
3059 int cpu;
3060
3061 rcu_bootup_announce();
3062 rcu_init_geometry();
3063 rcu_init_one(&rcu_sched_state, &rcu_sched_data);
3064 rcu_init_one(&rcu_bh_state, &rcu_bh_data);
3065 __rcu_init_preempt();
3066 rcu_init_nocb();
3067 open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
3068
3069
3070
3071
3072
3073
3074 cpu_notifier(rcu_cpu_notify, 0);
3075 for_each_online_cpu(cpu)
3076 rcu_cpu_notify(NULL, CPU_UP_PREPARE, (void *)(long)cpu);
3077 check_cpu_stall_init();
3078}
3079
3080#include "rcutree_plugin.h"
3081