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