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