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 long blimit = 10;
216static long qhimark = 10000;
217static long qlowmark = 100;
218
219module_param(blimit, long, 0444);
220module_param(qhimark, long, 0444);
221module_param(qlowmark, long, 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 long bl, count, count_lazy;
1773 int i;
1774
1775
1776 if (!cpu_has_callbacks_ready_to_invoke(rdp)) {
1777 trace_rcu_batch_start(rsp->name, rdp->qlen_lazy, rdp->qlen, 0);
1778 trace_rcu_batch_end(rsp->name, 0, !!ACCESS_ONCE(rdp->nxtlist),
1779 need_resched(), is_idle_task(current),
1780 rcu_is_callbacks_kthread());
1781 return;
1782 }
1783
1784
1785
1786
1787
1788 local_irq_save(flags);
1789 WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
1790 bl = rdp->blimit;
1791 trace_rcu_batch_start(rsp->name, rdp->qlen_lazy, rdp->qlen, bl);
1792 list = rdp->nxtlist;
1793 rdp->nxtlist = *rdp->nxttail[RCU_DONE_TAIL];
1794 *rdp->nxttail[RCU_DONE_TAIL] = NULL;
1795 tail = rdp->nxttail[RCU_DONE_TAIL];
1796 for (i = RCU_NEXT_SIZE - 1; i >= 0; i--)
1797 if (rdp->nxttail[i] == rdp->nxttail[RCU_DONE_TAIL])
1798 rdp->nxttail[i] = &rdp->nxtlist;
1799 local_irq_restore(flags);
1800
1801
1802 count = count_lazy = 0;
1803 while (list) {
1804 next = list->next;
1805 prefetch(next);
1806 debug_rcu_head_unqueue(list);
1807 if (__rcu_reclaim(rsp->name, list))
1808 count_lazy++;
1809 list = next;
1810
1811 if (++count >= bl &&
1812 (need_resched() ||
1813 (!is_idle_task(current) && !rcu_is_callbacks_kthread())))
1814 break;
1815 }
1816
1817 local_irq_save(flags);
1818 trace_rcu_batch_end(rsp->name, count, !!list, need_resched(),
1819 is_idle_task(current),
1820 rcu_is_callbacks_kthread());
1821
1822
1823 if (list != NULL) {
1824 *tail = rdp->nxtlist;
1825 rdp->nxtlist = list;
1826 for (i = 0; i < RCU_NEXT_SIZE; i++)
1827 if (&rdp->nxtlist == rdp->nxttail[i])
1828 rdp->nxttail[i] = tail;
1829 else
1830 break;
1831 }
1832 smp_mb();
1833 rdp->qlen_lazy -= count_lazy;
1834 ACCESS_ONCE(rdp->qlen) -= count;
1835 rdp->n_cbs_invoked += count;
1836
1837
1838 if (rdp->blimit == LONG_MAX && rdp->qlen <= qlowmark)
1839 rdp->blimit = blimit;
1840
1841
1842 if (rdp->qlen == 0 && rdp->qlen_last_fqs_check != 0) {
1843 rdp->qlen_last_fqs_check = 0;
1844 rdp->n_force_qs_snap = rsp->n_force_qs;
1845 } else if (rdp->qlen < rdp->qlen_last_fqs_check - qhimark)
1846 rdp->qlen_last_fqs_check = rdp->qlen;
1847 WARN_ON_ONCE((rdp->nxtlist == NULL) != (rdp->qlen == 0));
1848
1849 local_irq_restore(flags);
1850
1851
1852 if (cpu_has_callbacks_ready_to_invoke(rdp))
1853 invoke_rcu_core();
1854}
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865void rcu_check_callbacks(int cpu, int user)
1866{
1867 trace_rcu_utilization("Start scheduler-tick");
1868 increment_cpu_stall_ticks();
1869 if (user || rcu_is_cpu_rrupt_from_idle()) {
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883 rcu_sched_qs(cpu);
1884 rcu_bh_qs(cpu);
1885
1886 } else if (!in_softirq()) {
1887
1888
1889
1890
1891
1892
1893
1894
1895 rcu_bh_qs(cpu);
1896 }
1897 rcu_preempt_check_callbacks(cpu);
1898 if (rcu_pending(cpu))
1899 invoke_rcu_core();
1900 trace_rcu_utilization("End scheduler-tick");
1901}
1902
1903
1904
1905
1906
1907
1908
1909
1910static void force_qs_rnp(struct rcu_state *rsp, int (*f)(struct rcu_data *))
1911{
1912 unsigned long bit;
1913 int cpu;
1914 unsigned long flags;
1915 unsigned long mask;
1916 struct rcu_node *rnp;
1917
1918 rcu_for_each_leaf_node(rsp, rnp) {
1919 cond_resched();
1920 mask = 0;
1921 raw_spin_lock_irqsave(&rnp->lock, flags);
1922 if (!rcu_gp_in_progress(rsp)) {
1923 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1924 return;
1925 }
1926 if (rnp->qsmask == 0) {
1927 rcu_initiate_boost(rnp, flags);
1928 continue;
1929 }
1930 cpu = rnp->grplo;
1931 bit = 1;
1932 for (; cpu <= rnp->grphi; cpu++, bit <<= 1) {
1933 if ((rnp->qsmask & bit) != 0 &&
1934 f(per_cpu_ptr(rsp->rda, cpu)))
1935 mask |= bit;
1936 }
1937 if (mask != 0) {
1938
1939
1940 rcu_report_qs_rnp(mask, rsp, rnp, flags);
1941 continue;
1942 }
1943 raw_spin_unlock_irqrestore(&rnp->lock, flags);
1944 }
1945 rnp = rcu_get_root(rsp);
1946 if (rnp->qsmask == 0) {
1947 raw_spin_lock_irqsave(&rnp->lock, flags);
1948 rcu_initiate_boost(rnp, flags);
1949 }
1950}
1951
1952
1953
1954
1955
1956static void force_quiescent_state(struct rcu_state *rsp)
1957{
1958 unsigned long flags;
1959 bool ret;
1960 struct rcu_node *rnp;
1961 struct rcu_node *rnp_old = NULL;
1962
1963
1964 rnp = per_cpu_ptr(rsp->rda, raw_smp_processor_id())->mynode;
1965 for (; rnp != NULL; rnp = rnp->parent) {
1966 ret = (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) ||
1967 !raw_spin_trylock(&rnp->fqslock);
1968 if (rnp_old != NULL)
1969 raw_spin_unlock(&rnp_old->fqslock);
1970 if (ret) {
1971 rsp->n_force_qs_lh++;
1972 return;
1973 }
1974 rnp_old = rnp;
1975 }
1976
1977
1978
1979 raw_spin_lock_irqsave(&rnp_old->lock, flags);
1980 raw_spin_unlock(&rnp_old->fqslock);
1981 if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
1982 rsp->n_force_qs_lh++;
1983 raw_spin_unlock_irqrestore(&rnp_old->lock, flags);
1984 return;
1985 }
1986 rsp->gp_flags |= RCU_GP_FLAG_FQS;
1987 raw_spin_unlock_irqrestore(&rnp_old->lock, flags);
1988 wake_up(&rsp->gp_wq);
1989}
1990
1991
1992
1993
1994
1995
1996static void
1997__rcu_process_callbacks(struct rcu_state *rsp)
1998{
1999 unsigned long flags;
2000 struct rcu_data *rdp = __this_cpu_ptr(rsp->rda);
2001
2002 WARN_ON_ONCE(rdp->beenonline == 0);
2003
2004
2005
2006
2007
2008 rcu_process_gp_end(rsp, rdp);
2009
2010
2011 rcu_check_quiescent_state(rsp, rdp);
2012
2013
2014 if (cpu_needs_another_gp(rsp, rdp)) {
2015 raw_spin_lock_irqsave(&rcu_get_root(rsp)->lock, flags);
2016 rcu_start_gp(rsp, flags);
2017 }
2018
2019
2020 if (cpu_has_callbacks_ready_to_invoke(rdp))
2021 invoke_rcu_callbacks(rsp, rdp);
2022}
2023
2024
2025
2026
2027static void rcu_process_callbacks(struct softirq_action *unused)
2028{
2029 struct rcu_state *rsp;
2030
2031 if (cpu_is_offline(smp_processor_id()))
2032 return;
2033 trace_rcu_utilization("Start RCU core");
2034 for_each_rcu_flavor(rsp)
2035 __rcu_process_callbacks(rsp);
2036 trace_rcu_utilization("End RCU core");
2037}
2038
2039
2040
2041
2042
2043
2044
2045
2046static void invoke_rcu_callbacks(struct rcu_state *rsp, struct rcu_data *rdp)
2047{
2048 if (unlikely(!ACCESS_ONCE(rcu_scheduler_fully_active)))
2049 return;
2050 if (likely(!rsp->boost)) {
2051 rcu_do_batch(rsp, rdp);
2052 return;
2053 }
2054 invoke_rcu_callbacks_kthread();
2055}
2056
2057static void invoke_rcu_core(void)
2058{
2059 raise_softirq(RCU_SOFTIRQ);
2060}
2061
2062
2063
2064
2065static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp,
2066 struct rcu_head *head, unsigned long flags)
2067{
2068
2069
2070
2071
2072 if (rcu_is_cpu_idle() && cpu_online(smp_processor_id()))
2073 invoke_rcu_core();
2074
2075
2076 if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
2077 return;
2078
2079
2080
2081
2082
2083
2084
2085
2086 if (unlikely(rdp->qlen > rdp->qlen_last_fqs_check + qhimark)) {
2087
2088
2089 rcu_process_gp_end(rsp, rdp);
2090 check_for_new_grace_period(rsp, rdp);
2091
2092
2093 if (!rcu_gp_in_progress(rsp)) {
2094 unsigned long nestflag;
2095 struct rcu_node *rnp_root = rcu_get_root(rsp);
2096
2097 raw_spin_lock_irqsave(&rnp_root->lock, nestflag);
2098 rcu_start_gp(rsp, nestflag);
2099 } else {
2100
2101 rdp->blimit = LONG_MAX;
2102 if (rsp->n_force_qs == rdp->n_force_qs_snap &&
2103 *rdp->nxttail[RCU_DONE_TAIL] != head)
2104 force_quiescent_state(rsp);
2105 rdp->n_force_qs_snap = rsp->n_force_qs;
2106 rdp->qlen_last_fqs_check = rdp->qlen;
2107 }
2108 }
2109}
2110
2111static void
2112__call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
2113 struct rcu_state *rsp, bool lazy)
2114{
2115 unsigned long flags;
2116 struct rcu_data *rdp;
2117
2118 WARN_ON_ONCE((unsigned long)head & 0x3);
2119 debug_rcu_head_queue(head);
2120 head->func = func;
2121 head->next = NULL;
2122
2123
2124
2125
2126
2127
2128
2129 local_irq_save(flags);
2130 rdp = this_cpu_ptr(rsp->rda);
2131
2132
2133 if (unlikely(rdp->nxttail[RCU_NEXT_TAIL] == NULL)) {
2134
2135 WARN_ON_ONCE(1);
2136 local_irq_restore(flags);
2137 return;
2138 }
2139 ACCESS_ONCE(rdp->qlen)++;
2140 if (lazy)
2141 rdp->qlen_lazy++;
2142 else
2143 rcu_idle_count_callbacks_posted();
2144 smp_mb();
2145 *rdp->nxttail[RCU_NEXT_TAIL] = head;
2146 rdp->nxttail[RCU_NEXT_TAIL] = &head->next;
2147
2148 if (__is_kfree_rcu_offset((unsigned long)func))
2149 trace_rcu_kfree_callback(rsp->name, head, (unsigned long)func,
2150 rdp->qlen_lazy, rdp->qlen);
2151 else
2152 trace_rcu_callback(rsp->name, head, rdp->qlen_lazy, rdp->qlen);
2153
2154
2155 __call_rcu_core(rsp, rdp, head, flags);
2156 local_irq_restore(flags);
2157}
2158
2159
2160
2161
2162void call_rcu_sched(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
2163{
2164 __call_rcu(head, func, &rcu_sched_state, 0);
2165}
2166EXPORT_SYMBOL_GPL(call_rcu_sched);
2167
2168
2169
2170
2171void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
2172{
2173 __call_rcu(head, func, &rcu_bh_state, 0);
2174}
2175EXPORT_SYMBOL_GPL(call_rcu_bh);
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186static inline int rcu_blocking_is_gp(void)
2187{
2188 int ret;
2189
2190 might_sleep();
2191 preempt_disable();
2192 ret = num_online_cpus() <= 1;
2193 preempt_enable();
2194 return ret;
2195}
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220void synchronize_sched(void)
2221{
2222 rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map) &&
2223 !lock_is_held(&rcu_lock_map) &&
2224 !lock_is_held(&rcu_sched_lock_map),
2225 "Illegal synchronize_sched() in RCU-sched read-side critical section");
2226 if (rcu_blocking_is_gp())
2227 return;
2228 wait_rcu_gp(call_rcu_sched);
2229}
2230EXPORT_SYMBOL_GPL(synchronize_sched);
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241void synchronize_rcu_bh(void)
2242{
2243 rcu_lockdep_assert(!lock_is_held(&rcu_bh_lock_map) &&
2244 !lock_is_held(&rcu_lock_map) &&
2245 !lock_is_held(&rcu_sched_lock_map),
2246 "Illegal synchronize_rcu_bh() in RCU-bh read-side critical section");
2247 if (rcu_blocking_is_gp())
2248 return;
2249 wait_rcu_gp(call_rcu_bh);
2250}
2251EXPORT_SYMBOL_GPL(synchronize_rcu_bh);
2252
2253static atomic_t sync_sched_expedited_started = ATOMIC_INIT(0);
2254static atomic_t sync_sched_expedited_done = ATOMIC_INIT(0);
2255
2256static int synchronize_sched_expedited_cpu_stop(void *data)
2257{
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269 smp_mb();
2270 return 0;
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
2309
2310void synchronize_sched_expedited(void)
2311{
2312 int firstsnap, s, snap, trycount = 0;
2313
2314
2315 firstsnap = snap = atomic_inc_return(&sync_sched_expedited_started);
2316 get_online_cpus();
2317 WARN_ON_ONCE(cpu_is_offline(raw_smp_processor_id()));
2318
2319
2320
2321
2322
2323 while (try_stop_cpus(cpu_online_mask,
2324 synchronize_sched_expedited_cpu_stop,
2325 NULL) == -EAGAIN) {
2326 put_online_cpus();
2327
2328
2329 if (trycount++ < 10) {
2330 udelay(trycount * num_online_cpus());
2331 } else {
2332 synchronize_sched();
2333 return;
2334 }
2335
2336
2337 s = atomic_read(&sync_sched_expedited_done);
2338 if (UINT_CMP_GE((unsigned)s, (unsigned)firstsnap)) {
2339 smp_mb();
2340 return;
2341 }
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351 get_online_cpus();
2352 snap = atomic_read(&sync_sched_expedited_started);
2353 smp_mb();
2354 }
2355
2356
2357
2358
2359
2360
2361
2362 do {
2363 s = atomic_read(&sync_sched_expedited_done);
2364 if (UINT_CMP_GE((unsigned)s, (unsigned)snap)) {
2365 smp_mb();
2366 break;
2367 }
2368 } while (atomic_cmpxchg(&sync_sched_expedited_done, s, snap) != s);
2369
2370 put_online_cpus();
2371}
2372EXPORT_SYMBOL_GPL(synchronize_sched_expedited);
2373
2374
2375
2376
2377
2378
2379
2380
2381static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp)
2382{
2383 struct rcu_node *rnp = rdp->mynode;
2384
2385 rdp->n_rcu_pending++;
2386
2387
2388 check_cpu_stall(rsp, rdp);
2389
2390
2391 if (rcu_scheduler_fully_active &&
2392 rdp->qs_pending && !rdp->passed_quiesce) {
2393 rdp->n_rp_qs_pending++;
2394 } else if (rdp->qs_pending && rdp->passed_quiesce) {
2395 rdp->n_rp_report_qs++;
2396 return 1;
2397 }
2398
2399
2400 if (cpu_has_callbacks_ready_to_invoke(rdp)) {
2401 rdp->n_rp_cb_ready++;
2402 return 1;
2403 }
2404
2405
2406 if (cpu_needs_another_gp(rsp, rdp)) {
2407 rdp->n_rp_cpu_needs_gp++;
2408 return 1;
2409 }
2410
2411
2412 if (ACCESS_ONCE(rnp->completed) != rdp->completed) {
2413 rdp->n_rp_gp_completed++;
2414 return 1;
2415 }
2416
2417
2418 if (ACCESS_ONCE(rnp->gpnum) != rdp->gpnum) {
2419 rdp->n_rp_gp_started++;
2420 return 1;
2421 }
2422
2423
2424 rdp->n_rp_need_nothing++;
2425 return 0;
2426}
2427
2428
2429
2430
2431
2432
2433static int rcu_pending(int cpu)
2434{
2435 struct rcu_state *rsp;
2436
2437 for_each_rcu_flavor(rsp)
2438 if (__rcu_pending(rsp, per_cpu_ptr(rsp->rda, cpu)))
2439 return 1;
2440 return 0;
2441}
2442
2443
2444
2445
2446
2447
2448static int rcu_cpu_has_callbacks(int cpu)
2449{
2450 struct rcu_state *rsp;
2451
2452
2453 for_each_rcu_flavor(rsp)
2454 if (per_cpu_ptr(rsp->rda, cpu)->nxtlist)
2455 return 1;
2456 return 0;
2457}
2458
2459
2460
2461
2462
2463static void _rcu_barrier_trace(struct rcu_state *rsp, char *s,
2464 int cpu, unsigned long done)
2465{
2466 trace_rcu_barrier(rsp->name, s, cpu,
2467 atomic_read(&rsp->barrier_cpu_count), done);
2468}
2469
2470
2471
2472
2473
2474static void rcu_barrier_callback(struct rcu_head *rhp)
2475{
2476 struct rcu_data *rdp = container_of(rhp, struct rcu_data, barrier_head);
2477 struct rcu_state *rsp = rdp->rsp;
2478
2479 if (atomic_dec_and_test(&rsp->barrier_cpu_count)) {
2480 _rcu_barrier_trace(rsp, "LastCB", -1, rsp->n_barrier_done);
2481 complete(&rsp->barrier_completion);
2482 } else {
2483 _rcu_barrier_trace(rsp, "CB", -1, rsp->n_barrier_done);
2484 }
2485}
2486
2487
2488
2489
2490static void rcu_barrier_func(void *type)
2491{
2492 struct rcu_state *rsp = type;
2493 struct rcu_data *rdp = __this_cpu_ptr(rsp->rda);
2494
2495 _rcu_barrier_trace(rsp, "IRQ", -1, rsp->n_barrier_done);
2496 atomic_inc(&rsp->barrier_cpu_count);
2497 rsp->call(&rdp->barrier_head, rcu_barrier_callback);
2498}
2499
2500
2501
2502
2503
2504static void _rcu_barrier(struct rcu_state *rsp)
2505{
2506 int cpu;
2507 struct rcu_data *rdp;
2508 unsigned long snap = ACCESS_ONCE(rsp->n_barrier_done);
2509 unsigned long snap_done;
2510
2511 _rcu_barrier_trace(rsp, "Begin", -1, snap);
2512
2513
2514 mutex_lock(&rsp->barrier_mutex);
2515
2516
2517
2518
2519
2520 smp_mb();
2521
2522
2523
2524
2525
2526
2527
2528 snap_done = ACCESS_ONCE(rsp->n_barrier_done);
2529 _rcu_barrier_trace(rsp, "Check", -1, snap_done);
2530 if (ULONG_CMP_GE(snap_done, ((snap + 1) & ~0x1) + 2)) {
2531 _rcu_barrier_trace(rsp, "EarlyExit", -1, snap_done);
2532 smp_mb();
2533 mutex_unlock(&rsp->barrier_mutex);
2534 return;
2535 }
2536
2537
2538
2539
2540
2541
2542 ACCESS_ONCE(rsp->n_barrier_done)++;
2543 WARN_ON_ONCE((rsp->n_barrier_done & 0x1) != 1);
2544 _rcu_barrier_trace(rsp, "Inc1", -1, rsp->n_barrier_done);
2545 smp_mb();
2546
2547
2548
2549
2550
2551
2552
2553 init_completion(&rsp->barrier_completion);
2554 atomic_set(&rsp->barrier_cpu_count, 1);
2555 get_online_cpus();
2556
2557
2558
2559
2560
2561
2562 for_each_online_cpu(cpu) {
2563 rdp = per_cpu_ptr(rsp->rda, cpu);
2564 if (ACCESS_ONCE(rdp->qlen)) {
2565 _rcu_barrier_trace(rsp, "OnlineQ", cpu,
2566 rsp->n_barrier_done);
2567 smp_call_function_single(cpu, rcu_barrier_func, rsp, 1);
2568 } else {
2569 _rcu_barrier_trace(rsp, "OnlineNQ", cpu,
2570 rsp->n_barrier_done);
2571 }
2572 }
2573 put_online_cpus();
2574
2575
2576
2577
2578
2579 if (atomic_dec_and_test(&rsp->barrier_cpu_count))
2580 complete(&rsp->barrier_completion);
2581
2582
2583 smp_mb();
2584 ACCESS_ONCE(rsp->n_barrier_done)++;
2585 WARN_ON_ONCE((rsp->n_barrier_done & 0x1) != 0);
2586 _rcu_barrier_trace(rsp, "Inc2", -1, rsp->n_barrier_done);
2587 smp_mb();
2588
2589
2590 wait_for_completion(&rsp->barrier_completion);
2591
2592
2593 mutex_unlock(&rsp->barrier_mutex);
2594}
2595
2596
2597
2598
2599void rcu_barrier_bh(void)
2600{
2601 _rcu_barrier(&rcu_bh_state);
2602}
2603EXPORT_SYMBOL_GPL(rcu_barrier_bh);
2604
2605
2606
2607
2608void rcu_barrier_sched(void)
2609{
2610 _rcu_barrier(&rcu_sched_state);
2611}
2612EXPORT_SYMBOL_GPL(rcu_barrier_sched);
2613
2614
2615
2616
2617static void __init
2618rcu_boot_init_percpu_data(int cpu, struct rcu_state *rsp)
2619{
2620 unsigned long flags;
2621 struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
2622 struct rcu_node *rnp = rcu_get_root(rsp);
2623
2624
2625 raw_spin_lock_irqsave(&rnp->lock, flags);
2626 rdp->grpmask = 1UL << (cpu - rdp->mynode->grplo);
2627 init_callback_list(rdp);
2628 rdp->qlen_lazy = 0;
2629 ACCESS_ONCE(rdp->qlen) = 0;
2630 rdp->dynticks = &per_cpu(rcu_dynticks, cpu);
2631 WARN_ON_ONCE(rdp->dynticks->dynticks_nesting != DYNTICK_TASK_EXIT_IDLE);
2632 WARN_ON_ONCE(atomic_read(&rdp->dynticks->dynticks) != 1);
2633#ifdef CONFIG_RCU_USER_QS
2634 WARN_ON_ONCE(rdp->dynticks->in_user);
2635#endif
2636 rdp->cpu = cpu;
2637 rdp->rsp = rsp;
2638 raw_spin_unlock_irqrestore(&rnp->lock, flags);
2639}
2640
2641
2642
2643
2644
2645
2646
2647static void __cpuinit
2648rcu_init_percpu_data(int cpu, struct rcu_state *rsp, int preemptible)
2649{
2650 unsigned long flags;
2651 unsigned long mask;
2652 struct rcu_data *rdp = per_cpu_ptr(rsp->rda, cpu);
2653 struct rcu_node *rnp = rcu_get_root(rsp);
2654
2655
2656 mutex_lock(&rsp->onoff_mutex);
2657
2658
2659 raw_spin_lock_irqsave(&rnp->lock, flags);
2660 rdp->beenonline = 1;
2661 rdp->preemptible = preemptible;
2662 rdp->qlen_last_fqs_check = 0;
2663 rdp->n_force_qs_snap = rsp->n_force_qs;
2664 rdp->blimit = blimit;
2665 init_callback_list(rdp);
2666 rdp->dynticks->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE;
2667 atomic_set(&rdp->dynticks->dynticks,
2668 (atomic_read(&rdp->dynticks->dynticks) & ~0x1) + 1);
2669 rcu_prepare_for_idle_init(cpu);
2670 raw_spin_unlock(&rnp->lock);
2671
2672
2673 rnp = rdp->mynode;
2674 mask = rdp->grpmask;
2675 do {
2676
2677 raw_spin_lock(&rnp->lock);
2678 rnp->qsmaskinit |= mask;
2679 mask = rnp->grpmask;
2680 if (rnp == rdp->mynode) {
2681
2682
2683
2684
2685
2686 rdp->gpnum = rnp->completed;
2687 rdp->completed = rnp->completed;
2688 rdp->passed_quiesce = 0;
2689 rdp->qs_pending = 0;
2690 trace_rcu_grace_period(rsp->name, rdp->gpnum, "cpuonl");
2691 }
2692 raw_spin_unlock(&rnp->lock);
2693 rnp = rnp->parent;
2694 } while (rnp != NULL && !(rnp->qsmaskinit & mask));
2695 local_irq_restore(flags);
2696
2697 mutex_unlock(&rsp->onoff_mutex);
2698}
2699
2700static void __cpuinit rcu_prepare_cpu(int cpu)
2701{
2702 struct rcu_state *rsp;
2703
2704 for_each_rcu_flavor(rsp)
2705 rcu_init_percpu_data(cpu, rsp,
2706 strcmp(rsp->name, "rcu_preempt") == 0);
2707}
2708
2709
2710
2711
2712static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
2713 unsigned long action, void *hcpu)
2714{
2715 long cpu = (long)hcpu;
2716 struct rcu_data *rdp = per_cpu_ptr(rcu_state->rda, cpu);
2717 struct rcu_node *rnp = rdp->mynode;
2718 struct rcu_state *rsp;
2719
2720 trace_rcu_utilization("Start CPU hotplug");
2721 switch (action) {
2722 case CPU_UP_PREPARE:
2723 case CPU_UP_PREPARE_FROZEN:
2724 rcu_prepare_cpu(cpu);
2725 rcu_prepare_kthreads(cpu);
2726 break;
2727 case CPU_ONLINE:
2728 case CPU_DOWN_FAILED:
2729 rcu_boost_kthread_setaffinity(rnp, -1);
2730 break;
2731 case CPU_DOWN_PREPARE:
2732 rcu_boost_kthread_setaffinity(rnp, cpu);
2733 break;
2734 case CPU_DYING:
2735 case CPU_DYING_FROZEN:
2736
2737
2738
2739
2740
2741 for_each_rcu_flavor(rsp)
2742 rcu_cleanup_dying_cpu(rsp);
2743 rcu_cleanup_after_idle(cpu);
2744 break;
2745 case CPU_DEAD:
2746 case CPU_DEAD_FROZEN:
2747 case CPU_UP_CANCELED:
2748 case CPU_UP_CANCELED_FROZEN:
2749 for_each_rcu_flavor(rsp)
2750 rcu_cleanup_dead_cpu(cpu, rsp);
2751 break;
2752 default:
2753 break;
2754 }
2755 trace_rcu_utilization("End CPU hotplug");
2756 return NOTIFY_OK;
2757}
2758
2759
2760
2761
2762static int __init rcu_spawn_gp_kthread(void)
2763{
2764 unsigned long flags;
2765 struct rcu_node *rnp;
2766 struct rcu_state *rsp;
2767 struct task_struct *t;
2768
2769 for_each_rcu_flavor(rsp) {
2770 t = kthread_run(rcu_gp_kthread, rsp, rsp->name);
2771 BUG_ON(IS_ERR(t));
2772 rnp = rcu_get_root(rsp);
2773 raw_spin_lock_irqsave(&rnp->lock, flags);
2774 rsp->gp_kthread = t;
2775 raw_spin_unlock_irqrestore(&rnp->lock, flags);
2776 }
2777 return 0;
2778}
2779early_initcall(rcu_spawn_gp_kthread);
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789void rcu_scheduler_starting(void)
2790{
2791 WARN_ON(num_online_cpus() != 1);
2792 WARN_ON(nr_context_switches() > 0);
2793 rcu_scheduler_active = 1;
2794}
2795
2796
2797
2798
2799
2800#ifdef CONFIG_RCU_FANOUT_EXACT
2801static void __init rcu_init_levelspread(struct rcu_state *rsp)
2802{
2803 int i;
2804
2805 for (i = rcu_num_lvls - 1; i > 0; i--)
2806 rsp->levelspread[i] = CONFIG_RCU_FANOUT;
2807 rsp->levelspread[0] = rcu_fanout_leaf;
2808}
2809#else
2810static void __init rcu_init_levelspread(struct rcu_state *rsp)
2811{
2812 int ccur;
2813 int cprv;
2814 int i;
2815
2816 cprv = nr_cpu_ids;
2817 for (i = rcu_num_lvls - 1; i >= 0; i--) {
2818 ccur = rsp->levelcnt[i];
2819 rsp->levelspread[i] = (cprv + ccur - 1) / ccur;
2820 cprv = ccur;
2821 }
2822}
2823#endif
2824
2825
2826
2827
2828static void __init rcu_init_one(struct rcu_state *rsp,
2829 struct rcu_data __percpu *rda)
2830{
2831 static char *buf[] = { "rcu_node_0",
2832 "rcu_node_1",
2833 "rcu_node_2",
2834 "rcu_node_3" };
2835 static char *fqs[] = { "rcu_node_fqs_0",
2836 "rcu_node_fqs_1",
2837 "rcu_node_fqs_2",
2838 "rcu_node_fqs_3" };
2839 int cpustride = 1;
2840 int i;
2841 int j;
2842 struct rcu_node *rnp;
2843
2844 BUILD_BUG_ON(MAX_RCU_LVLS > ARRAY_SIZE(buf));
2845
2846
2847
2848 for (i = 0; i < rcu_num_lvls; i++)
2849 rsp->levelcnt[i] = num_rcu_lvl[i];
2850 for (i = 1; i < rcu_num_lvls; i++)
2851 rsp->level[i] = rsp->level[i - 1] + rsp->levelcnt[i - 1];
2852 rcu_init_levelspread(rsp);
2853
2854
2855
2856 for (i = rcu_num_lvls - 1; i >= 0; i--) {
2857 cpustride *= rsp->levelspread[i];
2858 rnp = rsp->level[i];
2859 for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) {
2860 raw_spin_lock_init(&rnp->lock);
2861 lockdep_set_class_and_name(&rnp->lock,
2862 &rcu_node_class[i], buf[i]);
2863 raw_spin_lock_init(&rnp->fqslock);
2864 lockdep_set_class_and_name(&rnp->fqslock,
2865 &rcu_fqs_class[i], fqs[i]);
2866 rnp->gpnum = rsp->gpnum;
2867 rnp->completed = rsp->completed;
2868 rnp->qsmask = 0;
2869 rnp->qsmaskinit = 0;
2870 rnp->grplo = j * cpustride;
2871 rnp->grphi = (j + 1) * cpustride - 1;
2872 if (rnp->grphi >= NR_CPUS)
2873 rnp->grphi = NR_CPUS - 1;
2874 if (i == 0) {
2875 rnp->grpnum = 0;
2876 rnp->grpmask = 0;
2877 rnp->parent = NULL;
2878 } else {
2879 rnp->grpnum = j % rsp->levelspread[i - 1];
2880 rnp->grpmask = 1UL << rnp->grpnum;
2881 rnp->parent = rsp->level[i - 1] +
2882 j / rsp->levelspread[i - 1];
2883 }
2884 rnp->level = i;
2885 INIT_LIST_HEAD(&rnp->blkd_tasks);
2886 }
2887 }
2888
2889 rsp->rda = rda;
2890 init_waitqueue_head(&rsp->gp_wq);
2891 rnp = rsp->level[rcu_num_lvls - 1];
2892 for_each_possible_cpu(i) {
2893 while (i > rnp->grphi)
2894 rnp++;
2895 per_cpu_ptr(rsp->rda, i)->mynode = rnp;
2896 rcu_boot_init_percpu_data(i, rsp);
2897 }
2898 list_add(&rsp->flavors, &rcu_struct_flavors);
2899}
2900
2901
2902
2903
2904
2905
2906static void __init rcu_init_geometry(void)
2907{
2908 int i;
2909 int j;
2910 int n = nr_cpu_ids;
2911 int rcu_capacity[MAX_RCU_LVLS + 1];
2912
2913
2914 if (rcu_fanout_leaf == CONFIG_RCU_FANOUT_LEAF &&
2915 nr_cpu_ids == NR_CPUS)
2916 return;
2917
2918
2919
2920
2921
2922
2923 rcu_capacity[0] = 1;
2924 rcu_capacity[1] = rcu_fanout_leaf;
2925 for (i = 2; i <= MAX_RCU_LVLS; i++)
2926 rcu_capacity[i] = rcu_capacity[i - 1] * CONFIG_RCU_FANOUT;
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936 if (rcu_fanout_leaf < CONFIG_RCU_FANOUT_LEAF ||
2937 rcu_fanout_leaf > sizeof(unsigned long) * 8 ||
2938 n > rcu_capacity[MAX_RCU_LVLS]) {
2939 WARN_ON(1);
2940 return;
2941 }
2942
2943
2944 for (i = 1; i <= MAX_RCU_LVLS; i++)
2945 if (n <= rcu_capacity[i]) {
2946 for (j = 0; j <= i; j++)
2947 num_rcu_lvl[j] =
2948 DIV_ROUND_UP(n, rcu_capacity[i - j]);
2949 rcu_num_lvls = i;
2950 for (j = i + 1; j <= MAX_RCU_LVLS; j++)
2951 num_rcu_lvl[j] = 0;
2952 break;
2953 }
2954
2955
2956 rcu_num_nodes = 0;
2957 for (i = 0; i <= MAX_RCU_LVLS; i++)
2958 rcu_num_nodes += num_rcu_lvl[i];
2959 rcu_num_nodes -= n;
2960}
2961
2962void __init rcu_init(void)
2963{
2964 int cpu;
2965
2966 rcu_bootup_announce();
2967 rcu_init_geometry();
2968 rcu_init_one(&rcu_sched_state, &rcu_sched_data);
2969 rcu_init_one(&rcu_bh_state, &rcu_bh_data);
2970 __rcu_init_preempt();
2971 open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
2972
2973
2974
2975
2976
2977
2978 cpu_notifier(rcu_cpu_notify, 0);
2979 for_each_online_cpu(cpu)
2980 rcu_cpu_notify(NULL, CPU_UP_PREPARE, (void *)(long)cpu);
2981 check_cpu_stall_init();
2982}
2983
2984#include "rcutree_plugin.h"
2985