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
31#define pr_fmt(fmt) "rcu: " fmt
32
33#include <linux/types.h>
34#include <linux/kernel.h>
35#include <linux/init.h>
36#include <linux/spinlock.h>
37#include <linux/smp.h>
38#include <linux/rcupdate_wait.h>
39#include <linux/interrupt.h>
40#include <linux/sched.h>
41#include <linux/sched/debug.h>
42#include <linux/nmi.h>
43#include <linux/atomic.h>
44#include <linux/bitops.h>
45#include <linux/export.h>
46#include <linux/completion.h>
47#include <linux/moduleparam.h>
48#include <linux/percpu.h>
49#include <linux/notifier.h>
50#include <linux/cpu.h>
51#include <linux/mutex.h>
52#include <linux/time.h>
53#include <linux/kernel_stat.h>
54#include <linux/wait.h>
55#include <linux/kthread.h>
56#include <uapi/linux/sched/types.h>
57#include <linux/prefetch.h>
58#include <linux/delay.h>
59#include <linux/stop_machine.h>
60#include <linux/random.h>
61#include <linux/trace_events.h>
62#include <linux/suspend.h>
63#include <linux/ftrace.h>
64#include <linux/tick.h>
65
66#include "tree.h"
67#include "rcu.h"
68
69#ifdef MODULE_PARAM_PREFIX
70#undef MODULE_PARAM_PREFIX
71#endif
72#define MODULE_PARAM_PREFIX "rcutree."
73
74
75
76
77
78
79
80#define RCU_DYNTICK_CTRL_MASK 0x1
81#define RCU_DYNTICK_CTRL_CTR (RCU_DYNTICK_CTRL_MASK + 1)
82#ifndef rcu_eqs_special_exit
83#define rcu_eqs_special_exit() do { } while (0)
84#endif
85
86static DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, rcu_data) = {
87 .dynticks_nesting = 1,
88 .dynticks_nmi_nesting = DYNTICK_IRQ_NONIDLE,
89 .dynticks = ATOMIC_INIT(RCU_DYNTICK_CTRL_CTR),
90};
91struct rcu_state rcu_state = {
92 .level = { &rcu_state.node[0] },
93 .gp_state = RCU_GP_IDLE,
94 .gp_seq = (0UL - 300UL) << RCU_SEQ_CTR_SHIFT,
95 .barrier_mutex = __MUTEX_INITIALIZER(rcu_state.barrier_mutex),
96 .name = RCU_NAME,
97 .abbr = RCU_ABBR,
98 .exp_mutex = __MUTEX_INITIALIZER(rcu_state.exp_mutex),
99 .exp_wake_mutex = __MUTEX_INITIALIZER(rcu_state.exp_wake_mutex),
100 .ofl_lock = __RAW_SPIN_LOCK_UNLOCKED(rcu_state.ofl_lock),
101};
102
103
104static bool dump_tree;
105module_param(dump_tree, bool, 0444);
106
107static bool rcu_fanout_exact;
108module_param(rcu_fanout_exact, bool, 0444);
109
110static int rcu_fanout_leaf = RCU_FANOUT_LEAF;
111module_param(rcu_fanout_leaf, int, 0444);
112int rcu_num_lvls __read_mostly = RCU_NUM_LVLS;
113
114int num_rcu_lvl[] = NUM_RCU_LVL_INIT;
115int rcu_num_nodes __read_mostly = NUM_RCU_NODES;
116
117int sysctl_panic_on_rcu_stall __read_mostly;
118
119
120
121
122
123
124
125
126
127
128
129
130
131int rcu_scheduler_active __read_mostly;
132EXPORT_SYMBOL_GPL(rcu_scheduler_active);
133
134
135
136
137
138
139
140
141
142
143
144
145
146static int rcu_scheduler_fully_active __read_mostly;
147
148static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
149 unsigned long gps, unsigned long flags);
150static void rcu_init_new_rnp(struct rcu_node *rnp_leaf);
151static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf);
152static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu);
153static void invoke_rcu_core(void);
154static void invoke_rcu_callbacks(struct rcu_data *rdp);
155static void rcu_report_exp_rdp(struct rcu_data *rdp);
156static void sync_sched_exp_online_cleanup(int cpu);
157
158
159static int kthread_prio = IS_ENABLED(CONFIG_RCU_BOOST) ? 1 : 0;
160module_param(kthread_prio, int, 0644);
161
162
163
164static int gp_preinit_delay;
165module_param(gp_preinit_delay, int, 0444);
166static int gp_init_delay;
167module_param(gp_init_delay, int, 0444);
168static int gp_cleanup_delay;
169module_param(gp_cleanup_delay, int, 0444);
170
171
172int rcu_get_gp_kthreads_prio(void)
173{
174 return kthread_prio;
175}
176EXPORT_SYMBOL_GPL(rcu_get_gp_kthreads_prio);
177
178
179
180
181
182
183
184
185
186
187#define PER_RCU_NODE_PERIOD 3
188
189
190
191
192
193
194
195unsigned long rcu_rnp_online_cpus(struct rcu_node *rnp)
196{
197 return READ_ONCE(rnp->qsmaskinitnext);
198}
199
200
201
202
203
204
205static int rcu_gp_in_progress(void)
206{
207 return rcu_seq_state(rcu_seq_current(&rcu_state.gp_seq));
208}
209
210void rcu_softirq_qs(void)
211{
212 rcu_qs();
213 rcu_preempt_deferred_qs(current);
214}
215
216
217
218
219
220static void rcu_dynticks_eqs_enter(void)
221{
222 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
223 int seq;
224
225
226
227
228
229
230 seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdp->dynticks);
231
232 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
233 (seq & RCU_DYNTICK_CTRL_CTR));
234
235 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
236 (seq & RCU_DYNTICK_CTRL_MASK));
237}
238
239
240
241
242
243static void rcu_dynticks_eqs_exit(void)
244{
245 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
246 int seq;
247
248
249
250
251
252
253 seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdp->dynticks);
254 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
255 !(seq & RCU_DYNTICK_CTRL_CTR));
256 if (seq & RCU_DYNTICK_CTRL_MASK) {
257 atomic_andnot(RCU_DYNTICK_CTRL_MASK, &rdp->dynticks);
258 smp_mb__after_atomic();
259
260 rcu_eqs_special_exit();
261 }
262}
263
264
265
266
267
268
269
270
271
272
273
274static void rcu_dynticks_eqs_online(void)
275{
276 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
277
278 if (atomic_read(&rdp->dynticks) & RCU_DYNTICK_CTRL_CTR)
279 return;
280 atomic_add(RCU_DYNTICK_CTRL_CTR, &rdp->dynticks);
281}
282
283
284
285
286
287
288bool rcu_dynticks_curr_cpu_in_eqs(void)
289{
290 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
291
292 return !(atomic_read(&rdp->dynticks) & RCU_DYNTICK_CTRL_CTR);
293}
294
295
296
297
298
299int rcu_dynticks_snap(struct rcu_data *rdp)
300{
301 int snap = atomic_add_return(0, &rdp->dynticks);
302
303 return snap & ~RCU_DYNTICK_CTRL_MASK;
304}
305
306
307
308
309
310static bool rcu_dynticks_in_eqs(int snap)
311{
312 return !(snap & RCU_DYNTICK_CTRL_CTR);
313}
314
315
316
317
318
319
320static bool rcu_dynticks_in_eqs_since(struct rcu_data *rdp, int snap)
321{
322 return snap != rcu_dynticks_snap(rdp);
323}
324
325
326
327
328
329
330
331
332bool rcu_eqs_special_set(int cpu)
333{
334 int old;
335 int new;
336 struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
337
338 do {
339 old = atomic_read(&rdp->dynticks);
340 if (old & RCU_DYNTICK_CTRL_CTR)
341 return false;
342 new = old | RCU_DYNTICK_CTRL_MASK;
343 } while (atomic_cmpxchg(&rdp->dynticks, old, new) != old);
344 return true;
345}
346
347
348
349
350
351
352
353
354
355
356
357
358static void __maybe_unused rcu_momentary_dyntick_idle(void)
359{
360 int special;
361
362 raw_cpu_write(rcu_data.rcu_need_heavy_qs, false);
363 special = atomic_add_return(2 * RCU_DYNTICK_CTRL_CTR,
364 &this_cpu_ptr(&rcu_data)->dynticks);
365
366 WARN_ON_ONCE(!(special & RCU_DYNTICK_CTRL_CTR));
367 rcu_preempt_deferred_qs(current);
368}
369
370
371
372
373
374
375
376
377static int rcu_is_cpu_rrupt_from_idle(void)
378{
379 return __this_cpu_read(rcu_data.dynticks_nesting) <= 0 &&
380 __this_cpu_read(rcu_data.dynticks_nmi_nesting) <= 1;
381}
382
383#define DEFAULT_RCU_BLIMIT 10
384static long blimit = DEFAULT_RCU_BLIMIT;
385#define DEFAULT_RCU_QHIMARK 10000
386static long qhimark = DEFAULT_RCU_QHIMARK;
387#define DEFAULT_RCU_QLOMARK 100
388static long qlowmark = DEFAULT_RCU_QLOMARK;
389
390module_param(blimit, long, 0444);
391module_param(qhimark, long, 0444);
392module_param(qlowmark, long, 0444);
393
394static ulong jiffies_till_first_fqs = ULONG_MAX;
395static ulong jiffies_till_next_fqs = ULONG_MAX;
396static bool rcu_kick_kthreads;
397
398
399
400
401
402static ulong jiffies_till_sched_qs = ULONG_MAX;
403module_param(jiffies_till_sched_qs, ulong, 0444);
404static ulong jiffies_to_sched_qs;
405module_param(jiffies_to_sched_qs, ulong, 0444);
406
407
408
409
410
411
412
413static void adjust_jiffies_till_sched_qs(void)
414{
415 unsigned long j;
416
417
418 if (jiffies_till_sched_qs != ULONG_MAX) {
419 WRITE_ONCE(jiffies_to_sched_qs, jiffies_till_sched_qs);
420 return;
421 }
422 j = READ_ONCE(jiffies_till_first_fqs) +
423 2 * READ_ONCE(jiffies_till_next_fqs);
424 if (j < HZ / 10 + nr_cpu_ids / RCU_JIFFIES_FQS_DIV)
425 j = HZ / 10 + nr_cpu_ids / RCU_JIFFIES_FQS_DIV;
426 pr_info("RCU calculated value of scheduler-enlistment delay is %ld jiffies.\n", j);
427 WRITE_ONCE(jiffies_to_sched_qs, j);
428}
429
430static int param_set_first_fqs_jiffies(const char *val, const struct kernel_param *kp)
431{
432 ulong j;
433 int ret = kstrtoul(val, 0, &j);
434
435 if (!ret) {
436 WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : j);
437 adjust_jiffies_till_sched_qs();
438 }
439 return ret;
440}
441
442static int param_set_next_fqs_jiffies(const char *val, const struct kernel_param *kp)
443{
444 ulong j;
445 int ret = kstrtoul(val, 0, &j);
446
447 if (!ret) {
448 WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : (j ?: 1));
449 adjust_jiffies_till_sched_qs();
450 }
451 return ret;
452}
453
454static struct kernel_param_ops first_fqs_jiffies_ops = {
455 .set = param_set_first_fqs_jiffies,
456 .get = param_get_ulong,
457};
458
459static struct kernel_param_ops next_fqs_jiffies_ops = {
460 .set = param_set_next_fqs_jiffies,
461 .get = param_get_ulong,
462};
463
464module_param_cb(jiffies_till_first_fqs, &first_fqs_jiffies_ops, &jiffies_till_first_fqs, 0644);
465module_param_cb(jiffies_till_next_fqs, &next_fqs_jiffies_ops, &jiffies_till_next_fqs, 0644);
466module_param(rcu_kick_kthreads, bool, 0644);
467
468static void force_qs_rnp(int (*f)(struct rcu_data *rdp));
469static void force_quiescent_state(void);
470static int rcu_pending(void);
471
472
473
474
475unsigned long rcu_get_gp_seq(void)
476{
477 return READ_ONCE(rcu_state.gp_seq);
478}
479EXPORT_SYMBOL_GPL(rcu_get_gp_seq);
480
481
482
483
484
485
486
487unsigned long rcu_exp_batches_completed(void)
488{
489 return rcu_state.expedited_sequence;
490}
491EXPORT_SYMBOL_GPL(rcu_exp_batches_completed);
492
493
494
495
496void rcu_force_quiescent_state(void)
497{
498 force_quiescent_state();
499}
500EXPORT_SYMBOL_GPL(rcu_force_quiescent_state);
501
502
503
504
505void show_rcu_gp_kthreads(void)
506{
507 int cpu;
508 struct rcu_data *rdp;
509 struct rcu_node *rnp;
510
511 pr_info("%s: wait state: %d ->state: %#lx\n", rcu_state.name,
512 rcu_state.gp_state, rcu_state.gp_kthread->state);
513 rcu_for_each_node_breadth_first(rnp) {
514 if (ULONG_CMP_GE(rcu_state.gp_seq, rnp->gp_seq_needed))
515 continue;
516 pr_info("\trcu_node %d:%d ->gp_seq %lu ->gp_seq_needed %lu\n",
517 rnp->grplo, rnp->grphi, rnp->gp_seq,
518 rnp->gp_seq_needed);
519 if (!rcu_is_leaf_node(rnp))
520 continue;
521 for_each_leaf_node_possible_cpu(rnp, cpu) {
522 rdp = per_cpu_ptr(&rcu_data, cpu);
523 if (rdp->gpwrap ||
524 ULONG_CMP_GE(rcu_state.gp_seq,
525 rdp->gp_seq_needed))
526 continue;
527 pr_info("\tcpu %d ->gp_seq_needed %lu\n",
528 cpu, rdp->gp_seq_needed);
529 }
530 }
531
532}
533EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);
534
535
536
537
538void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags,
539 unsigned long *gp_seq)
540{
541 switch (test_type) {
542 case RCU_FLAVOR:
543 case RCU_BH_FLAVOR:
544 case RCU_SCHED_FLAVOR:
545 *flags = READ_ONCE(rcu_state.gp_flags);
546 *gp_seq = rcu_seq_current(&rcu_state.gp_seq);
547 break;
548 default:
549 break;
550 }
551}
552EXPORT_SYMBOL_GPL(rcutorture_get_gp_data);
553
554
555
556
557static struct rcu_node *rcu_get_root(void)
558{
559 return &rcu_state.node[0];
560}
561
562
563
564
565
566
567
568
569
570static void rcu_eqs_enter(bool user)
571{
572 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
573
574 WARN_ON_ONCE(rdp->dynticks_nmi_nesting != DYNTICK_IRQ_NONIDLE);
575 WRITE_ONCE(rdp->dynticks_nmi_nesting, 0);
576 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
577 rdp->dynticks_nesting == 0);
578 if (rdp->dynticks_nesting != 1) {
579 rdp->dynticks_nesting--;
580 return;
581 }
582
583 lockdep_assert_irqs_disabled();
584 trace_rcu_dyntick(TPS("Start"), rdp->dynticks_nesting, 0, rdp->dynticks);
585 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
586 rdp = this_cpu_ptr(&rcu_data);
587 do_nocb_deferred_wakeup(rdp);
588 rcu_prepare_for_idle();
589 rcu_preempt_deferred_qs(current);
590 WRITE_ONCE(rdp->dynticks_nesting, 0);
591 rcu_dynticks_eqs_enter();
592 rcu_dynticks_task_enter();
593}
594
595
596
597
598
599
600
601
602
603
604
605
606void rcu_idle_enter(void)
607{
608 lockdep_assert_irqs_disabled();
609 rcu_eqs_enter(false);
610}
611
612#ifdef CONFIG_NO_HZ_FULL
613
614
615
616
617
618
619
620
621
622
623
624void rcu_user_enter(void)
625{
626 lockdep_assert_irqs_disabled();
627 rcu_eqs_enter(true);
628}
629#endif
630
631
632
633
634
635
636
637
638
639
640static __always_inline void rcu_nmi_exit_common(bool irq)
641{
642 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
643
644
645
646
647
648
649 WARN_ON_ONCE(rdp->dynticks_nmi_nesting <= 0);
650 WARN_ON_ONCE(rcu_dynticks_curr_cpu_in_eqs());
651
652
653
654
655
656 if (rdp->dynticks_nmi_nesting != 1) {
657 trace_rcu_dyntick(TPS("--="), rdp->dynticks_nmi_nesting, rdp->dynticks_nmi_nesting - 2, rdp->dynticks);
658 WRITE_ONCE(rdp->dynticks_nmi_nesting,
659 rdp->dynticks_nmi_nesting - 2);
660 return;
661 }
662
663
664 trace_rcu_dyntick(TPS("Startirq"), rdp->dynticks_nmi_nesting, 0, rdp->dynticks);
665 WRITE_ONCE(rdp->dynticks_nmi_nesting, 0);
666
667 if (irq)
668 rcu_prepare_for_idle();
669
670 rcu_dynticks_eqs_enter();
671
672 if (irq)
673 rcu_dynticks_task_enter();
674}
675
676
677
678
679
680
681
682
683void rcu_nmi_exit(void)
684{
685 rcu_nmi_exit_common(false);
686}
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707void rcu_irq_exit(void)
708{
709 lockdep_assert_irqs_disabled();
710 rcu_nmi_exit_common(true);
711}
712
713
714
715
716
717
718
719void rcu_irq_exit_irqson(void)
720{
721 unsigned long flags;
722
723 local_irq_save(flags);
724 rcu_irq_exit();
725 local_irq_restore(flags);
726}
727
728
729
730
731
732
733
734
735
736static void rcu_eqs_exit(bool user)
737{
738 struct rcu_data *rdp;
739 long oldval;
740
741 lockdep_assert_irqs_disabled();
742 rdp = this_cpu_ptr(&rcu_data);
743 oldval = rdp->dynticks_nesting;
744 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && oldval < 0);
745 if (oldval) {
746 rdp->dynticks_nesting++;
747 return;
748 }
749 rcu_dynticks_task_exit();
750 rcu_dynticks_eqs_exit();
751 rcu_cleanup_after_idle();
752 trace_rcu_dyntick(TPS("End"), rdp->dynticks_nesting, 1, rdp->dynticks);
753 WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
754 WRITE_ONCE(rdp->dynticks_nesting, 1);
755 WARN_ON_ONCE(rdp->dynticks_nmi_nesting);
756 WRITE_ONCE(rdp->dynticks_nmi_nesting, DYNTICK_IRQ_NONIDLE);
757}
758
759
760
761
762
763
764
765
766
767
768void rcu_idle_exit(void)
769{
770 unsigned long flags;
771
772 local_irq_save(flags);
773 rcu_eqs_exit(false);
774 local_irq_restore(flags);
775}
776
777#ifdef CONFIG_NO_HZ_FULL
778
779
780
781
782
783
784
785
786
787void rcu_user_exit(void)
788{
789 rcu_eqs_exit(1);
790}
791#endif
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806static __always_inline void rcu_nmi_enter_common(bool irq)
807{
808 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
809 long incby = 2;
810
811
812 WARN_ON_ONCE(rdp->dynticks_nmi_nesting < 0);
813
814
815
816
817
818
819
820
821
822 if (rcu_dynticks_curr_cpu_in_eqs()) {
823
824 if (irq)
825 rcu_dynticks_task_exit();
826
827 rcu_dynticks_eqs_exit();
828
829 if (irq)
830 rcu_cleanup_after_idle();
831
832 incby = 1;
833 }
834 trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="),
835 rdp->dynticks_nmi_nesting,
836 rdp->dynticks_nmi_nesting + incby, rdp->dynticks);
837 WRITE_ONCE(rdp->dynticks_nmi_nesting,
838 rdp->dynticks_nmi_nesting + incby);
839 barrier();
840}
841
842
843
844
845void rcu_nmi_enter(void)
846{
847 rcu_nmi_enter_common(false);
848}
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872void rcu_irq_enter(void)
873{
874 lockdep_assert_irqs_disabled();
875 rcu_nmi_enter_common(true);
876}
877
878
879
880
881
882
883
884void rcu_irq_enter_irqson(void)
885{
886 unsigned long flags;
887
888 local_irq_save(flags);
889 rcu_irq_enter();
890 local_irq_restore(flags);
891}
892
893
894
895
896
897
898
899
900
901bool notrace rcu_is_watching(void)
902{
903 bool ret;
904
905 preempt_disable_notrace();
906 ret = !rcu_dynticks_curr_cpu_in_eqs();
907 preempt_enable_notrace();
908 return ret;
909}
910EXPORT_SYMBOL_GPL(rcu_is_watching);
911
912
913
914
915
916
917
918
919void rcu_request_urgent_qs_task(struct task_struct *t)
920{
921 int cpu;
922
923 barrier();
924 cpu = task_cpu(t);
925 if (!task_curr(t))
926 return;
927 smp_store_release(per_cpu_ptr(&rcu_data.rcu_urgent_qs, cpu), true);
928}
929
930#if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU)
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945bool rcu_lockdep_current_cpu_online(void)
946{
947 struct rcu_data *rdp;
948 struct rcu_node *rnp;
949 bool ret = false;
950
951 if (in_nmi() || !rcu_scheduler_fully_active)
952 return true;
953 preempt_disable();
954 rdp = this_cpu_ptr(&rcu_data);
955 rnp = rdp->mynode;
956 if (rdp->grpmask & rcu_rnp_online_cpus(rnp))
957 ret = true;
958 preempt_enable();
959 return ret;
960}
961EXPORT_SYMBOL_GPL(rcu_lockdep_current_cpu_online);
962
963#endif
964
965
966
967
968
969
970
971
972static void rcu_gpnum_ovf(struct rcu_node *rnp, struct rcu_data *rdp)
973{
974 raw_lockdep_assert_held_rcu_node(rnp);
975 if (ULONG_CMP_LT(rcu_seq_current(&rdp->gp_seq) + ULONG_MAX / 4,
976 rnp->gp_seq))
977 WRITE_ONCE(rdp->gpwrap, true);
978 if (ULONG_CMP_LT(rdp->rcu_iw_gp_seq + ULONG_MAX / 4, rnp->gp_seq))
979 rdp->rcu_iw_gp_seq = rnp->gp_seq + ULONG_MAX / 4;
980}
981
982
983
984
985
986
987static int dyntick_save_progress_counter(struct rcu_data *rdp)
988{
989 rdp->dynticks_snap = rcu_dynticks_snap(rdp);
990 if (rcu_dynticks_in_eqs(rdp->dynticks_snap)) {
991 trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
992 rcu_gpnum_ovf(rdp->mynode, rdp);
993 return 1;
994 }
995 return 0;
996}
997
998
999
1000
1001
1002
1003
1004static void rcu_iw_handler(struct irq_work *iwp)
1005{
1006 struct rcu_data *rdp;
1007 struct rcu_node *rnp;
1008
1009 rdp = container_of(iwp, struct rcu_data, rcu_iw);
1010 rnp = rdp->mynode;
1011 raw_spin_lock_rcu_node(rnp);
1012 if (!WARN_ON_ONCE(!rdp->rcu_iw_pending)) {
1013 rdp->rcu_iw_gp_seq = rnp->gp_seq;
1014 rdp->rcu_iw_pending = false;
1015 }
1016 raw_spin_unlock_rcu_node(rnp);
1017}
1018
1019
1020
1021
1022
1023
1024
1025static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
1026{
1027 unsigned long jtsq;
1028 bool *rnhqp;
1029 bool *ruqp;
1030 struct rcu_node *rnp = rdp->mynode;
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040 if (rcu_dynticks_in_eqs_since(rdp, rdp->dynticks_snap)) {
1041 trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
1042 rcu_gpnum_ovf(rnp, rdp);
1043 return 1;
1044 }
1045
1046
1047 if (!(rdp->grpmask & rcu_rnp_online_cpus(rnp)) &&
1048 time_after(jiffies, rcu_state.gp_start + HZ)) {
1049 bool onl;
1050 struct rcu_node *rnp1;
1051
1052 WARN_ON(1);
1053 pr_info("%s: grp: %d-%d level: %d ->gp_seq %ld ->completedqs %ld\n",
1054 __func__, rnp->grplo, rnp->grphi, rnp->level,
1055 (long)rnp->gp_seq, (long)rnp->completedqs);
1056 for (rnp1 = rnp; rnp1; rnp1 = rnp1->parent)
1057 pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx ->rcu_gp_init_mask %#lx\n",
1058 __func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext, rnp1->rcu_gp_init_mask);
1059 onl = !!(rdp->grpmask & rcu_rnp_online_cpus(rnp));
1060 pr_info("%s %d: %c online: %ld(%d) offline: %ld(%d)\n",
1061 __func__, rdp->cpu, ".o"[onl],
1062 (long)rdp->rcu_onl_gp_seq, rdp->rcu_onl_gp_flags,
1063 (long)rdp->rcu_ofl_gp_seq, rdp->rcu_ofl_gp_flags);
1064 return 1;
1065 }
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078 jtsq = READ_ONCE(jiffies_to_sched_qs);
1079 ruqp = per_cpu_ptr(&rcu_data.rcu_urgent_qs, rdp->cpu);
1080 rnhqp = &per_cpu(rcu_data.rcu_need_heavy_qs, rdp->cpu);
1081 if (!READ_ONCE(*rnhqp) &&
1082 (time_after(jiffies, rcu_state.gp_start + jtsq * 2) ||
1083 time_after(jiffies, rcu_state.jiffies_resched))) {
1084 WRITE_ONCE(*rnhqp, true);
1085
1086 smp_store_release(ruqp, true);
1087 } else if (time_after(jiffies, rcu_state.gp_start + jtsq)) {
1088 WRITE_ONCE(*ruqp, true);
1089 }
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099 if (tick_nohz_full_cpu(rdp->cpu) &&
1100 time_after(jiffies,
1101 READ_ONCE(rdp->last_fqs_resched) + jtsq * 3)) {
1102 resched_cpu(rdp->cpu);
1103 WRITE_ONCE(rdp->last_fqs_resched, jiffies);
1104 }
1105
1106
1107
1108
1109
1110
1111
1112
1113 if (time_after(jiffies, rcu_state.jiffies_resched)) {
1114 if (time_after(jiffies,
1115 READ_ONCE(rdp->last_fqs_resched) + jtsq)) {
1116 resched_cpu(rdp->cpu);
1117 WRITE_ONCE(rdp->last_fqs_resched, jiffies);
1118 }
1119 if (IS_ENABLED(CONFIG_IRQ_WORK) &&
1120 !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq &&
1121 (rnp->ffmask & rdp->grpmask)) {
1122 init_irq_work(&rdp->rcu_iw, rcu_iw_handler);
1123 rdp->rcu_iw_pending = true;
1124 rdp->rcu_iw_gp_seq = rnp->gp_seq;
1125 irq_work_queue_on(&rdp->rcu_iw, rdp->cpu);
1126 }
1127 }
1128
1129 return 0;
1130}
1131
1132static void record_gp_stall_check_time(void)
1133{
1134 unsigned long j = jiffies;
1135 unsigned long j1;
1136
1137 rcu_state.gp_start = j;
1138 j1 = rcu_jiffies_till_stall_check();
1139
1140 smp_store_release(&rcu_state.jiffies_stall, j + j1);
1141 rcu_state.jiffies_resched = j + j1 / 2;
1142 rcu_state.n_force_qs_gpstart = READ_ONCE(rcu_state.n_force_qs);
1143}
1144
1145
1146
1147
1148static const char *gp_state_getname(short gs)
1149{
1150 if (gs < 0 || gs >= ARRAY_SIZE(gp_state_names))
1151 return "???";
1152 return gp_state_names[gs];
1153}
1154
1155
1156
1157
1158static void rcu_check_gp_kthread_starvation(void)
1159{
1160 struct task_struct *gpk = rcu_state.gp_kthread;
1161 unsigned long j;
1162
1163 j = jiffies - READ_ONCE(rcu_state.gp_activity);
1164 if (j > 2 * HZ) {
1165 pr_err("%s kthread starved for %ld jiffies! g%ld f%#x %s(%d) ->state=%#lx ->cpu=%d\n",
1166 rcu_state.name, j,
1167 (long)rcu_seq_current(&rcu_state.gp_seq),
1168 rcu_state.gp_flags,
1169 gp_state_getname(rcu_state.gp_state), rcu_state.gp_state,
1170 gpk ? gpk->state : ~0, gpk ? task_cpu(gpk) : -1);
1171 if (gpk) {
1172 pr_err("RCU grace-period kthread stack dump:\n");
1173 sched_show_task(gpk);
1174 wake_up_process(gpk);
1175 }
1176 }
1177}
1178
1179
1180
1181
1182
1183
1184
1185static void rcu_dump_cpu_stacks(void)
1186{
1187 int cpu;
1188 unsigned long flags;
1189 struct rcu_node *rnp;
1190
1191 rcu_for_each_leaf_node(rnp) {
1192 raw_spin_lock_irqsave_rcu_node(rnp, flags);
1193 for_each_leaf_node_possible_cpu(rnp, cpu)
1194 if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu))
1195 if (!trigger_single_cpu_backtrace(cpu))
1196 dump_cpu_task(cpu);
1197 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1198 }
1199}
1200
1201
1202
1203
1204
1205static void rcu_stall_kick_kthreads(void)
1206{
1207 unsigned long j;
1208
1209 if (!rcu_kick_kthreads)
1210 return;
1211 j = READ_ONCE(rcu_state.jiffies_kick_kthreads);
1212 if (time_after(jiffies, j) && rcu_state.gp_kthread &&
1213 (rcu_gp_in_progress() || READ_ONCE(rcu_state.gp_flags))) {
1214 WARN_ONCE(1, "Kicking %s grace-period kthread\n",
1215 rcu_state.name);
1216 rcu_ftrace_dump(DUMP_ALL);
1217 wake_up_process(rcu_state.gp_kthread);
1218 WRITE_ONCE(rcu_state.jiffies_kick_kthreads, j + HZ);
1219 }
1220}
1221
1222static void panic_on_rcu_stall(void)
1223{
1224 if (sysctl_panic_on_rcu_stall)
1225 panic("RCU Stall\n");
1226}
1227
1228static void print_other_cpu_stall(unsigned long gp_seq)
1229{
1230 int cpu;
1231 unsigned long flags;
1232 unsigned long gpa;
1233 unsigned long j;
1234 int ndetected = 0;
1235 struct rcu_node *rnp = rcu_get_root();
1236 long totqlen = 0;
1237
1238
1239 rcu_stall_kick_kthreads();
1240 if (rcu_cpu_stall_suppress)
1241 return;
1242
1243
1244
1245
1246
1247
1248 pr_err("INFO: %s detected stalls on CPUs/tasks:", rcu_state.name);
1249 print_cpu_stall_info_begin();
1250 rcu_for_each_leaf_node(rnp) {
1251 raw_spin_lock_irqsave_rcu_node(rnp, flags);
1252 ndetected += rcu_print_task_stall(rnp);
1253 if (rnp->qsmask != 0) {
1254 for_each_leaf_node_possible_cpu(rnp, cpu)
1255 if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) {
1256 print_cpu_stall_info(cpu);
1257 ndetected++;
1258 }
1259 }
1260 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1261 }
1262
1263 print_cpu_stall_info_end();
1264 for_each_possible_cpu(cpu)
1265 totqlen += rcu_segcblist_n_cbs(&per_cpu_ptr(&rcu_data,
1266 cpu)->cblist);
1267 pr_cont("(detected by %d, t=%ld jiffies, g=%ld, q=%lu)\n",
1268 smp_processor_id(), (long)(jiffies - rcu_state.gp_start),
1269 (long)rcu_seq_current(&rcu_state.gp_seq), totqlen);
1270 if (ndetected) {
1271 rcu_dump_cpu_stacks();
1272
1273
1274 rcu_print_detail_task_stall();
1275 } else {
1276 if (rcu_seq_current(&rcu_state.gp_seq) != gp_seq) {
1277 pr_err("INFO: Stall ended before state dump start\n");
1278 } else {
1279 j = jiffies;
1280 gpa = READ_ONCE(rcu_state.gp_activity);
1281 pr_err("All QSes seen, last %s kthread activity %ld (%ld-%ld), jiffies_till_next_fqs=%ld, root ->qsmask %#lx\n",
1282 rcu_state.name, j - gpa, j, gpa,
1283 READ_ONCE(jiffies_till_next_fqs),
1284 rcu_get_root()->qsmask);
1285
1286 sched_show_task(current);
1287 }
1288 }
1289
1290 if (ULONG_CMP_GE(jiffies, READ_ONCE(rcu_state.jiffies_stall)))
1291 WRITE_ONCE(rcu_state.jiffies_stall,
1292 jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
1293
1294 rcu_check_gp_kthread_starvation();
1295
1296 panic_on_rcu_stall();
1297
1298 force_quiescent_state();
1299}
1300
1301static void print_cpu_stall(void)
1302{
1303 int cpu;
1304 unsigned long flags;
1305 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
1306 struct rcu_node *rnp = rcu_get_root();
1307 long totqlen = 0;
1308
1309
1310 rcu_stall_kick_kthreads();
1311 if (rcu_cpu_stall_suppress)
1312 return;
1313
1314
1315
1316
1317
1318
1319 pr_err("INFO: %s self-detected stall on CPU", rcu_state.name);
1320 print_cpu_stall_info_begin();
1321 raw_spin_lock_irqsave_rcu_node(rdp->mynode, flags);
1322 print_cpu_stall_info(smp_processor_id());
1323 raw_spin_unlock_irqrestore_rcu_node(rdp->mynode, flags);
1324 print_cpu_stall_info_end();
1325 for_each_possible_cpu(cpu)
1326 totqlen += rcu_segcblist_n_cbs(&per_cpu_ptr(&rcu_data,
1327 cpu)->cblist);
1328 pr_cont(" (t=%lu jiffies g=%ld q=%lu)\n",
1329 jiffies - rcu_state.gp_start,
1330 (long)rcu_seq_current(&rcu_state.gp_seq), totqlen);
1331
1332 rcu_check_gp_kthread_starvation();
1333
1334 rcu_dump_cpu_stacks();
1335
1336 raw_spin_lock_irqsave_rcu_node(rnp, flags);
1337
1338 if (ULONG_CMP_GE(jiffies, READ_ONCE(rcu_state.jiffies_stall)))
1339 WRITE_ONCE(rcu_state.jiffies_stall,
1340 jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
1341 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1342
1343 panic_on_rcu_stall();
1344
1345
1346
1347
1348
1349
1350
1351
1352 set_tsk_need_resched(current);
1353 set_preempt_need_resched();
1354}
1355
1356static void check_cpu_stall(struct rcu_data *rdp)
1357{
1358 unsigned long gs1;
1359 unsigned long gs2;
1360 unsigned long gps;
1361 unsigned long j;
1362 unsigned long jn;
1363 unsigned long js;
1364 struct rcu_node *rnp;
1365
1366 if ((rcu_cpu_stall_suppress && !rcu_kick_kthreads) ||
1367 !rcu_gp_in_progress())
1368 return;
1369 rcu_stall_kick_kthreads();
1370 j = jiffies;
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390 gs1 = READ_ONCE(rcu_state.gp_seq);
1391 smp_rmb();
1392 js = READ_ONCE(rcu_state.jiffies_stall);
1393 smp_rmb();
1394 gps = READ_ONCE(rcu_state.gp_start);
1395 smp_rmb();
1396 gs2 = READ_ONCE(rcu_state.gp_seq);
1397 if (gs1 != gs2 ||
1398 ULONG_CMP_LT(j, js) ||
1399 ULONG_CMP_GE(gps, js))
1400 return;
1401 rnp = rdp->mynode;
1402 jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
1403 if (rcu_gp_in_progress() &&
1404 (READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
1405 cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
1406
1407
1408 print_cpu_stall();
1409
1410 } else if (rcu_gp_in_progress() &&
1411 ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
1412 cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
1413
1414
1415 print_other_cpu_stall(gs2);
1416 }
1417}
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428void rcu_cpu_stall_reset(void)
1429{
1430 WRITE_ONCE(rcu_state.jiffies_stall, jiffies + ULONG_MAX / 2);
1431}
1432
1433
1434static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
1435 unsigned long gp_seq_req, const char *s)
1436{
1437 trace_rcu_future_grace_period(rcu_state.name, rnp->gp_seq, gp_seq_req,
1438 rnp->level, rnp->grplo, rnp->grphi, s);
1439}
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp,
1458 unsigned long gp_seq_req)
1459{
1460 bool ret = false;
1461 struct rcu_node *rnp;
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472 raw_lockdep_assert_held_rcu_node(rnp_start);
1473 trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, TPS("Startleaf"));
1474 for (rnp = rnp_start; 1; rnp = rnp->parent) {
1475 if (rnp != rnp_start)
1476 raw_spin_lock_rcu_node(rnp);
1477 if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) ||
1478 rcu_seq_started(&rnp->gp_seq, gp_seq_req) ||
1479 (rnp != rnp_start &&
1480 rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) {
1481 trace_rcu_this_gp(rnp, rdp, gp_seq_req,
1482 TPS("Prestarted"));
1483 goto unlock_out;
1484 }
1485 rnp->gp_seq_needed = gp_seq_req;
1486 if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) {
1487
1488
1489
1490
1491
1492
1493 trace_rcu_this_gp(rnp_start, rdp, gp_seq_req,
1494 TPS("Startedleaf"));
1495 goto unlock_out;
1496 }
1497 if (rnp != rnp_start && rnp->parent != NULL)
1498 raw_spin_unlock_rcu_node(rnp);
1499 if (!rnp->parent)
1500 break;
1501 }
1502
1503
1504 if (rcu_gp_in_progress()) {
1505 trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedleafroot"));
1506 goto unlock_out;
1507 }
1508 trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedroot"));
1509 WRITE_ONCE(rcu_state.gp_flags, rcu_state.gp_flags | RCU_GP_FLAG_INIT);
1510 rcu_state.gp_req_activity = jiffies;
1511 if (!rcu_state.gp_kthread) {
1512 trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("NoGPkthread"));
1513 goto unlock_out;
1514 }
1515 trace_rcu_grace_period(rcu_state.name, READ_ONCE(rcu_state.gp_seq), TPS("newreq"));
1516 ret = true;
1517unlock_out:
1518
1519 if (ULONG_CMP_LT(gp_seq_req, rnp->gp_seq_needed)) {
1520 rnp_start->gp_seq_needed = rnp->gp_seq_needed;
1521 rdp->gp_seq_needed = rnp->gp_seq_needed;
1522 }
1523 if (rnp != rnp_start)
1524 raw_spin_unlock_rcu_node(rnp);
1525 return ret;
1526}
1527
1528
1529
1530
1531
1532static bool rcu_future_gp_cleanup(struct rcu_node *rnp)
1533{
1534 bool needmore;
1535 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
1536
1537 needmore = ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed);
1538 if (!needmore)
1539 rnp->gp_seq_needed = rnp->gp_seq;
1540 trace_rcu_this_gp(rnp, rdp, rnp->gp_seq,
1541 needmore ? TPS("CleanupMore") : TPS("Cleanup"));
1542 return needmore;
1543}
1544
1545
1546
1547
1548
1549
1550
1551static void rcu_gp_kthread_wake(void)
1552{
1553 if (current == rcu_state.gp_kthread ||
1554 !READ_ONCE(rcu_state.gp_flags) ||
1555 !rcu_state.gp_kthread)
1556 return;
1557 swake_up(&rcu_state.gp_wq);
1558}
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572static bool rcu_accelerate_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
1573{
1574 unsigned long gp_seq_req;
1575 bool ret = false;
1576
1577 raw_lockdep_assert_held_rcu_node(rnp);
1578
1579
1580 if (!rcu_segcblist_pend_cbs(&rdp->cblist))
1581 return false;
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593 gp_seq_req = rcu_seq_snap(&rcu_state.gp_seq);
1594 if (rcu_segcblist_accelerate(&rdp->cblist, gp_seq_req))
1595 ret = rcu_start_this_gp(rnp, rdp, gp_seq_req);
1596
1597
1598 if (rcu_segcblist_restempty(&rdp->cblist, RCU_WAIT_TAIL))
1599 trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("AccWaitCB"));
1600 else
1601 trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("AccReadyCB"));
1602 return ret;
1603}
1604
1605
1606
1607
1608
1609
1610
1611
1612static void rcu_accelerate_cbs_unlocked(struct rcu_node *rnp,
1613 struct rcu_data *rdp)
1614{
1615 unsigned long c;
1616 bool needwake;
1617
1618 lockdep_assert_irqs_disabled();
1619 c = rcu_seq_snap(&rcu_state.gp_seq);
1620 if (!rdp->gpwrap && ULONG_CMP_GE(rdp->gp_seq_needed, c)) {
1621
1622 (void)rcu_segcblist_accelerate(&rdp->cblist, c);
1623 return;
1624 }
1625 raw_spin_lock_rcu_node(rnp);
1626 needwake = rcu_accelerate_cbs(rnp, rdp);
1627 raw_spin_unlock_rcu_node(rnp);
1628 if (needwake)
1629 rcu_gp_kthread_wake();
1630}
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642static bool rcu_advance_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
1643{
1644 raw_lockdep_assert_held_rcu_node(rnp);
1645
1646
1647 if (!rcu_segcblist_pend_cbs(&rdp->cblist))
1648 return false;
1649
1650
1651
1652
1653
1654 rcu_segcblist_advance(&rdp->cblist, rnp->gp_seq);
1655
1656
1657 return rcu_accelerate_cbs(rnp, rdp);
1658}
1659
1660
1661
1662
1663
1664
1665
1666static bool __note_gp_changes(struct rcu_node *rnp, struct rcu_data *rdp)
1667{
1668 bool ret;
1669 bool need_gp;
1670
1671 raw_lockdep_assert_held_rcu_node(rnp);
1672
1673 if (rdp->gp_seq == rnp->gp_seq)
1674 return false;
1675
1676
1677 if (rcu_seq_completed_gp(rdp->gp_seq, rnp->gp_seq) ||
1678 unlikely(READ_ONCE(rdp->gpwrap))) {
1679 ret = rcu_advance_cbs(rnp, rdp);
1680 trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("cpuend"));
1681 } else {
1682 ret = rcu_accelerate_cbs(rnp, rdp);
1683 }
1684
1685
1686 if (rcu_seq_new_gp(rdp->gp_seq, rnp->gp_seq) ||
1687 unlikely(READ_ONCE(rdp->gpwrap))) {
1688
1689
1690
1691
1692
1693 trace_rcu_grace_period(rcu_state.name, rnp->gp_seq, TPS("cpustart"));
1694 need_gp = !!(rnp->qsmask & rdp->grpmask);
1695 rdp->cpu_no_qs.b.norm = need_gp;
1696 rdp->core_needs_qs = need_gp;
1697 zero_cpu_stall_ticks(rdp);
1698 }
1699 rdp->gp_seq = rnp->gp_seq;
1700 if (ULONG_CMP_GE(rnp->gp_seq_needed, rdp->gp_seq_needed) || rdp->gpwrap)
1701 rdp->gp_seq_needed = rnp->gp_seq_needed;
1702 WRITE_ONCE(rdp->gpwrap, false);
1703 rcu_gpnum_ovf(rnp, rdp);
1704 return ret;
1705}
1706
1707static void note_gp_changes(struct rcu_data *rdp)
1708{
1709 unsigned long flags;
1710 bool needwake;
1711 struct rcu_node *rnp;
1712
1713 local_irq_save(flags);
1714 rnp = rdp->mynode;
1715 if ((rdp->gp_seq == rcu_seq_current(&rnp->gp_seq) &&
1716 !unlikely(READ_ONCE(rdp->gpwrap))) ||
1717 !raw_spin_trylock_rcu_node(rnp)) {
1718 local_irq_restore(flags);
1719 return;
1720 }
1721 needwake = __note_gp_changes(rnp, rdp);
1722 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1723 if (needwake)
1724 rcu_gp_kthread_wake();
1725}
1726
1727static void rcu_gp_slow(int delay)
1728{
1729 if (delay > 0 &&
1730 !(rcu_seq_ctr(rcu_state.gp_seq) %
1731 (rcu_num_nodes * PER_RCU_NODE_PERIOD * delay)))
1732 schedule_timeout_uninterruptible(delay);
1733}
1734
1735
1736
1737
1738static bool rcu_gp_init(void)
1739{
1740 unsigned long flags;
1741 unsigned long oldmask;
1742 unsigned long mask;
1743 struct rcu_data *rdp;
1744 struct rcu_node *rnp = rcu_get_root();
1745
1746 WRITE_ONCE(rcu_state.gp_activity, jiffies);
1747 raw_spin_lock_irq_rcu_node(rnp);
1748 if (!READ_ONCE(rcu_state.gp_flags)) {
1749
1750 raw_spin_unlock_irq_rcu_node(rnp);
1751 return false;
1752 }
1753 WRITE_ONCE(rcu_state.gp_flags, 0);
1754
1755 if (WARN_ON_ONCE(rcu_gp_in_progress())) {
1756
1757
1758
1759
1760 raw_spin_unlock_irq_rcu_node(rnp);
1761 return false;
1762 }
1763
1764
1765 record_gp_stall_check_time();
1766
1767 rcu_seq_start(&rcu_state.gp_seq);
1768 trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("start"));
1769 raw_spin_unlock_irq_rcu_node(rnp);
1770
1771
1772
1773
1774
1775
1776
1777 rcu_state.gp_state = RCU_GP_ONOFF;
1778 rcu_for_each_leaf_node(rnp) {
1779 raw_spin_lock(&rcu_state.ofl_lock);
1780 raw_spin_lock_irq_rcu_node(rnp);
1781 if (rnp->qsmaskinit == rnp->qsmaskinitnext &&
1782 !rnp->wait_blkd_tasks) {
1783
1784 raw_spin_unlock_irq_rcu_node(rnp);
1785 raw_spin_unlock(&rcu_state.ofl_lock);
1786 continue;
1787 }
1788
1789
1790 oldmask = rnp->qsmaskinit;
1791 rnp->qsmaskinit = rnp->qsmaskinitnext;
1792
1793
1794 if (!oldmask != !rnp->qsmaskinit) {
1795 if (!oldmask) {
1796 if (!rnp->wait_blkd_tasks)
1797 rcu_init_new_rnp(rnp);
1798 } else if (rcu_preempt_has_tasks(rnp)) {
1799 rnp->wait_blkd_tasks = true;
1800 } else {
1801 rcu_cleanup_dead_rnp(rnp);
1802 }
1803 }
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813 if (rnp->wait_blkd_tasks &&
1814 (!rcu_preempt_has_tasks(rnp) || rnp->qsmaskinit)) {
1815 rnp->wait_blkd_tasks = false;
1816 if (!rnp->qsmaskinit)
1817 rcu_cleanup_dead_rnp(rnp);
1818 }
1819
1820 raw_spin_unlock_irq_rcu_node(rnp);
1821 raw_spin_unlock(&rcu_state.ofl_lock);
1822 }
1823 rcu_gp_slow(gp_preinit_delay);
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837 rcu_state.gp_state = RCU_GP_INIT;
1838 rcu_for_each_node_breadth_first(rnp) {
1839 rcu_gp_slow(gp_init_delay);
1840 raw_spin_lock_irqsave_rcu_node(rnp, flags);
1841 rdp = this_cpu_ptr(&rcu_data);
1842 rcu_preempt_check_blocked_tasks(rnp);
1843 rnp->qsmask = rnp->qsmaskinit;
1844 WRITE_ONCE(rnp->gp_seq, rcu_state.gp_seq);
1845 if (rnp == rdp->mynode)
1846 (void)__note_gp_changes(rnp, rdp);
1847 rcu_preempt_boost_start_gp(rnp);
1848 trace_rcu_grace_period_init(rcu_state.name, rnp->gp_seq,
1849 rnp->level, rnp->grplo,
1850 rnp->grphi, rnp->qsmask);
1851
1852 mask = rnp->qsmask & ~rnp->qsmaskinitnext;
1853 rnp->rcu_gp_init_mask = mask;
1854 if ((mask || rnp->wait_blkd_tasks) && rcu_is_leaf_node(rnp))
1855 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
1856 else
1857 raw_spin_unlock_irq_rcu_node(rnp);
1858 cond_resched_tasks_rcu_qs();
1859 WRITE_ONCE(rcu_state.gp_activity, jiffies);
1860 }
1861
1862 return true;
1863}
1864
1865
1866
1867
1868
1869static bool rcu_gp_fqs_check_wake(int *gfp)
1870{
1871 struct rcu_node *rnp = rcu_get_root();
1872
1873
1874 *gfp = READ_ONCE(rcu_state.gp_flags);
1875 if (*gfp & RCU_GP_FLAG_FQS)
1876 return true;
1877
1878
1879 if (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))
1880 return true;
1881
1882 return false;
1883}
1884
1885
1886
1887
1888static void rcu_gp_fqs(bool first_time)
1889{
1890 struct rcu_node *rnp = rcu_get_root();
1891
1892 WRITE_ONCE(rcu_state.gp_activity, jiffies);
1893 rcu_state.n_force_qs++;
1894 if (first_time) {
1895
1896 force_qs_rnp(dyntick_save_progress_counter);
1897 } else {
1898
1899 force_qs_rnp(rcu_implicit_dynticks_qs);
1900 }
1901
1902 if (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) {
1903 raw_spin_lock_irq_rcu_node(rnp);
1904 WRITE_ONCE(rcu_state.gp_flags,
1905 READ_ONCE(rcu_state.gp_flags) & ~RCU_GP_FLAG_FQS);
1906 raw_spin_unlock_irq_rcu_node(rnp);
1907 }
1908}
1909
1910
1911
1912
1913static void rcu_gp_fqs_loop(void)
1914{
1915 bool first_gp_fqs;
1916 int gf;
1917 unsigned long j;
1918 int ret;
1919 struct rcu_node *rnp = rcu_get_root();
1920
1921 first_gp_fqs = true;
1922 j = READ_ONCE(jiffies_till_first_fqs);
1923 ret = 0;
1924 for (;;) {
1925 if (!ret) {
1926 rcu_state.jiffies_force_qs = jiffies + j;
1927 WRITE_ONCE(rcu_state.jiffies_kick_kthreads,
1928 jiffies + 3 * j);
1929 }
1930 trace_rcu_grace_period(rcu_state.name,
1931 READ_ONCE(rcu_state.gp_seq),
1932 TPS("fqswait"));
1933 rcu_state.gp_state = RCU_GP_WAIT_FQS;
1934 ret = swait_event_idle_timeout(
1935 rcu_state.gp_wq, rcu_gp_fqs_check_wake(&gf), j);
1936 rcu_state.gp_state = RCU_GP_DOING_FQS;
1937
1938
1939 if (!READ_ONCE(rnp->qsmask) &&
1940 !rcu_preempt_blocked_readers_cgp(rnp))
1941 break;
1942
1943 if (ULONG_CMP_GE(jiffies, rcu_state.jiffies_force_qs) ||
1944 (gf & RCU_GP_FLAG_FQS)) {
1945 trace_rcu_grace_period(rcu_state.name,
1946 READ_ONCE(rcu_state.gp_seq),
1947 TPS("fqsstart"));
1948 rcu_gp_fqs(first_gp_fqs);
1949 first_gp_fqs = false;
1950 trace_rcu_grace_period(rcu_state.name,
1951 READ_ONCE(rcu_state.gp_seq),
1952 TPS("fqsend"));
1953 cond_resched_tasks_rcu_qs();
1954 WRITE_ONCE(rcu_state.gp_activity, jiffies);
1955 ret = 0;
1956 j = READ_ONCE(jiffies_till_next_fqs);
1957 } else {
1958
1959 cond_resched_tasks_rcu_qs();
1960 WRITE_ONCE(rcu_state.gp_activity, jiffies);
1961 WARN_ON(signal_pending(current));
1962 trace_rcu_grace_period(rcu_state.name,
1963 READ_ONCE(rcu_state.gp_seq),
1964 TPS("fqswaitsig"));
1965 ret = 1;
1966 j = jiffies;
1967 if (time_after(jiffies, rcu_state.jiffies_force_qs))
1968 j = 1;
1969 else
1970 j = rcu_state.jiffies_force_qs - j;
1971 }
1972 }
1973}
1974
1975
1976
1977
1978static void rcu_gp_cleanup(void)
1979{
1980 unsigned long gp_duration;
1981 bool needgp = false;
1982 unsigned long new_gp_seq;
1983 struct rcu_data *rdp;
1984 struct rcu_node *rnp = rcu_get_root();
1985 struct swait_queue_head *sq;
1986
1987 WRITE_ONCE(rcu_state.gp_activity, jiffies);
1988 raw_spin_lock_irq_rcu_node(rnp);
1989 gp_duration = jiffies - rcu_state.gp_start;
1990 if (gp_duration > rcu_state.gp_max)
1991 rcu_state.gp_max = gp_duration;
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001 raw_spin_unlock_irq_rcu_node(rnp);
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012 new_gp_seq = rcu_state.gp_seq;
2013 rcu_seq_end(&new_gp_seq);
2014 rcu_for_each_node_breadth_first(rnp) {
2015 raw_spin_lock_irq_rcu_node(rnp);
2016 if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)))
2017 dump_blkd_tasks(rnp, 10);
2018 WARN_ON_ONCE(rnp->qsmask);
2019 WRITE_ONCE(rnp->gp_seq, new_gp_seq);
2020 rdp = this_cpu_ptr(&rcu_data);
2021 if (rnp == rdp->mynode)
2022 needgp = __note_gp_changes(rnp, rdp) || needgp;
2023
2024 needgp = rcu_future_gp_cleanup(rnp) || needgp;
2025 sq = rcu_nocb_gp_get(rnp);
2026 raw_spin_unlock_irq_rcu_node(rnp);
2027 rcu_nocb_gp_cleanup(sq);
2028 cond_resched_tasks_rcu_qs();
2029 WRITE_ONCE(rcu_state.gp_activity, jiffies);
2030 rcu_gp_slow(gp_cleanup_delay);
2031 }
2032 rnp = rcu_get_root();
2033 raw_spin_lock_irq_rcu_node(rnp);
2034
2035
2036 rcu_seq_end(&rcu_state.gp_seq);
2037 trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("end"));
2038 rcu_state.gp_state = RCU_GP_IDLE;
2039
2040 rdp = this_cpu_ptr(&rcu_data);
2041 if (!needgp && ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed)) {
2042 trace_rcu_this_gp(rnp, rdp, rnp->gp_seq_needed,
2043 TPS("CleanupMore"));
2044 needgp = true;
2045 }
2046
2047 if (!rcu_accelerate_cbs(rnp, rdp) && needgp) {
2048 WRITE_ONCE(rcu_state.gp_flags, RCU_GP_FLAG_INIT);
2049 rcu_state.gp_req_activity = jiffies;
2050 trace_rcu_grace_period(rcu_state.name,
2051 READ_ONCE(rcu_state.gp_seq),
2052 TPS("newreq"));
2053 } else {
2054 WRITE_ONCE(rcu_state.gp_flags,
2055 rcu_state.gp_flags & RCU_GP_FLAG_INIT);
2056 }
2057 raw_spin_unlock_irq_rcu_node(rnp);
2058}
2059
2060
2061
2062
2063static int __noreturn rcu_gp_kthread(void *unused)
2064{
2065 rcu_bind_gp_kthread();
2066 for (;;) {
2067
2068
2069 for (;;) {
2070 trace_rcu_grace_period(rcu_state.name,
2071 READ_ONCE(rcu_state.gp_seq),
2072 TPS("reqwait"));
2073 rcu_state.gp_state = RCU_GP_WAIT_GPS;
2074 swait_event_idle(rcu_state.gp_wq,
2075 READ_ONCE(rcu_state.gp_flags) &
2076 RCU_GP_FLAG_INIT);
2077 rcu_state.gp_state = RCU_GP_DONE_GPS;
2078
2079 if (rcu_gp_init())
2080 break;
2081 cond_resched_tasks_rcu_qs();
2082 WRITE_ONCE(rcu_state.gp_activity, jiffies);
2083 WARN_ON(signal_pending(current));
2084 trace_rcu_grace_period(rcu_state.name,
2085 READ_ONCE(rcu_state.gp_seq),
2086 TPS("reqwaitsig"));
2087 }
2088
2089
2090 rcu_gp_fqs_loop();
2091
2092
2093 rcu_state.gp_state = RCU_GP_CLEANUP;
2094 rcu_gp_cleanup();
2095 rcu_state.gp_state = RCU_GP_CLEANED;
2096 }
2097}
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108static void rcu_report_qs_rsp(unsigned long flags)
2109 __releases(rcu_get_root()->lock)
2110{
2111 raw_lockdep_assert_held_rcu_node(rcu_get_root());
2112 WARN_ON_ONCE(!rcu_gp_in_progress());
2113 WRITE_ONCE(rcu_state.gp_flags,
2114 READ_ONCE(rcu_state.gp_flags) | RCU_GP_FLAG_FQS);
2115 raw_spin_unlock_irqrestore_rcu_node(rcu_get_root(), flags);
2116 rcu_gp_kthread_wake();
2117}
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
2134 unsigned long gps, unsigned long flags)
2135 __releases(rnp->lock)
2136{
2137 unsigned long oldmask = 0;
2138 struct rcu_node *rnp_c;
2139
2140 raw_lockdep_assert_held_rcu_node(rnp);
2141
2142
2143 for (;;) {
2144 if ((!(rnp->qsmask & mask) && mask) || rnp->gp_seq != gps) {
2145
2146
2147
2148
2149
2150 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2151 return;
2152 }
2153 WARN_ON_ONCE(oldmask);
2154 WARN_ON_ONCE(!rcu_is_leaf_node(rnp) &&
2155 rcu_preempt_blocked_readers_cgp(rnp));
2156 rnp->qsmask &= ~mask;
2157 trace_rcu_quiescent_state_report(rcu_state.name, rnp->gp_seq,
2158 mask, rnp->qsmask, rnp->level,
2159 rnp->grplo, rnp->grphi,
2160 !!rnp->gp_tasks);
2161 if (rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) {
2162
2163
2164 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2165 return;
2166 }
2167 rnp->completedqs = rnp->gp_seq;
2168 mask = rnp->grpmask;
2169 if (rnp->parent == NULL) {
2170
2171
2172
2173 break;
2174 }
2175 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2176 rnp_c = rnp;
2177 rnp = rnp->parent;
2178 raw_spin_lock_irqsave_rcu_node(rnp, flags);
2179 oldmask = rnp_c->qsmask;
2180 }
2181
2182
2183
2184
2185
2186
2187 rcu_report_qs_rsp(flags);
2188}
2189
2190
2191
2192
2193
2194
2195
2196
2197static void __maybe_unused
2198rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
2199 __releases(rnp->lock)
2200{
2201 unsigned long gps;
2202 unsigned long mask;
2203 struct rcu_node *rnp_p;
2204
2205 raw_lockdep_assert_held_rcu_node(rnp);
2206 if (WARN_ON_ONCE(!IS_ENABLED(CONFIG_PREEMPT)) ||
2207 WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)) ||
2208 rnp->qsmask != 0) {
2209 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2210 return;
2211 }
2212
2213 rnp->completedqs = rnp->gp_seq;
2214 rnp_p = rnp->parent;
2215 if (rnp_p == NULL) {
2216
2217
2218
2219
2220 rcu_report_qs_rsp(flags);
2221 return;
2222 }
2223
2224
2225 gps = rnp->gp_seq;
2226 mask = rnp->grpmask;
2227 raw_spin_unlock_rcu_node(rnp);
2228 raw_spin_lock_rcu_node(rnp_p);
2229 rcu_report_qs_rnp(mask, rnp_p, gps, flags);
2230}
2231
2232
2233
2234
2235
2236static void
2237rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
2238{
2239 unsigned long flags;
2240 unsigned long mask;
2241 bool needwake;
2242 struct rcu_node *rnp;
2243
2244 rnp = rdp->mynode;
2245 raw_spin_lock_irqsave_rcu_node(rnp, flags);
2246 if (rdp->cpu_no_qs.b.norm || rdp->gp_seq != rnp->gp_seq ||
2247 rdp->gpwrap) {
2248
2249
2250
2251
2252
2253
2254
2255 rdp->cpu_no_qs.b.norm = true;
2256 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2257 return;
2258 }
2259 mask = rdp->grpmask;
2260 if ((rnp->qsmask & mask) == 0) {
2261 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2262 } else {
2263 rdp->core_needs_qs = false;
2264
2265
2266
2267
2268
2269 needwake = rcu_accelerate_cbs(rnp, rdp);
2270
2271 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
2272
2273 if (needwake)
2274 rcu_gp_kthread_wake();
2275 }
2276}
2277
2278
2279
2280
2281
2282
2283
2284static void
2285rcu_check_quiescent_state(struct rcu_data *rdp)
2286{
2287
2288 note_gp_changes(rdp);
2289
2290
2291
2292
2293
2294 if (!rdp->core_needs_qs)
2295 return;
2296
2297
2298
2299
2300
2301 if (rdp->cpu_no_qs.b.norm)
2302 return;
2303
2304
2305
2306
2307
2308 rcu_report_qs_rdp(rdp->cpu, rdp);
2309}
2310
2311
2312
2313
2314
2315int rcutree_dying_cpu(unsigned int cpu)
2316{
2317 RCU_TRACE(bool blkd;)
2318 RCU_TRACE(struct rcu_data *rdp = this_cpu_ptr(&rcu_data);)
2319 RCU_TRACE(struct rcu_node *rnp = rdp->mynode;)
2320
2321 if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2322 return 0;
2323
2324 RCU_TRACE(blkd = !!(rnp->qsmask & rdp->grpmask);)
2325 trace_rcu_grace_period(rcu_state.name, rnp->gp_seq,
2326 blkd ? TPS("cpuofl") : TPS("cpuofl-bgp"));
2327 return 0;
2328}
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf)
2348{
2349 long mask;
2350 struct rcu_node *rnp = rnp_leaf;
2351
2352 raw_lockdep_assert_held_rcu_node(rnp_leaf);
2353 if (!IS_ENABLED(CONFIG_HOTPLUG_CPU) ||
2354 WARN_ON_ONCE(rnp_leaf->qsmaskinit) ||
2355 WARN_ON_ONCE(rcu_preempt_has_tasks(rnp_leaf)))
2356 return;
2357 for (;;) {
2358 mask = rnp->grpmask;
2359 rnp = rnp->parent;
2360 if (!rnp)
2361 break;
2362 raw_spin_lock_rcu_node(rnp);
2363 rnp->qsmaskinit &= ~mask;
2364
2365 WARN_ON_ONCE(rnp->qsmask);
2366 if (rnp->qsmaskinit) {
2367 raw_spin_unlock_rcu_node(rnp);
2368
2369 return;
2370 }
2371 raw_spin_unlock_rcu_node(rnp);
2372 }
2373}
2374
2375
2376
2377
2378
2379
2380
2381int rcutree_dead_cpu(unsigned int cpu)
2382{
2383 struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
2384 struct rcu_node *rnp = rdp->mynode;
2385
2386 if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2387 return 0;
2388
2389
2390 rcu_boost_kthread_setaffinity(rnp, -1);
2391
2392 do_nocb_deferred_wakeup(per_cpu_ptr(&rcu_data, cpu));
2393 return 0;
2394}
2395
2396
2397
2398
2399
2400static void rcu_do_batch(struct rcu_data *rdp)
2401{
2402 unsigned long flags;
2403 struct rcu_head *rhp;
2404 struct rcu_cblist rcl = RCU_CBLIST_INITIALIZER(rcl);
2405 long bl, count;
2406
2407
2408 if (!rcu_segcblist_ready_cbs(&rdp->cblist)) {
2409 trace_rcu_batch_start(rcu_state.name,
2410 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
2411 rcu_segcblist_n_cbs(&rdp->cblist), 0);
2412 trace_rcu_batch_end(rcu_state.name, 0,
2413 !rcu_segcblist_empty(&rdp->cblist),
2414 need_resched(), is_idle_task(current),
2415 rcu_is_callbacks_kthread());
2416 return;
2417 }
2418
2419
2420
2421
2422
2423
2424 local_irq_save(flags);
2425 WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
2426 bl = rdp->blimit;
2427 trace_rcu_batch_start(rcu_state.name,
2428 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
2429 rcu_segcblist_n_cbs(&rdp->cblist), bl);
2430 rcu_segcblist_extract_done_cbs(&rdp->cblist, &rcl);
2431 local_irq_restore(flags);
2432
2433
2434 rhp = rcu_cblist_dequeue(&rcl);
2435 for (; rhp; rhp = rcu_cblist_dequeue(&rcl)) {
2436 debug_rcu_head_unqueue(rhp);
2437 if (__rcu_reclaim(rcu_state.name, rhp))
2438 rcu_cblist_dequeued_lazy(&rcl);
2439
2440
2441
2442
2443 if (-rcl.len >= bl &&
2444 (need_resched() ||
2445 (!is_idle_task(current) && !rcu_is_callbacks_kthread())))
2446 break;
2447 }
2448
2449 local_irq_save(flags);
2450 count = -rcl.len;
2451 trace_rcu_batch_end(rcu_state.name, count, !!rcl.head, need_resched(),
2452 is_idle_task(current), rcu_is_callbacks_kthread());
2453
2454
2455 rcu_segcblist_insert_done_cbs(&rdp->cblist, &rcl);
2456 smp_mb();
2457 rcu_segcblist_insert_count(&rdp->cblist, &rcl);
2458
2459
2460 count = rcu_segcblist_n_cbs(&rdp->cblist);
2461 if (rdp->blimit == LONG_MAX && count <= qlowmark)
2462 rdp->blimit = blimit;
2463
2464
2465 if (count == 0 && rdp->qlen_last_fqs_check != 0) {
2466 rdp->qlen_last_fqs_check = 0;
2467 rdp->n_force_qs_snap = rcu_state.n_force_qs;
2468 } else if (count < rdp->qlen_last_fqs_check - qhimark)
2469 rdp->qlen_last_fqs_check = count;
2470
2471
2472
2473
2474
2475 WARN_ON_ONCE(rcu_segcblist_empty(&rdp->cblist) != (count == 0));
2476
2477 local_irq_restore(flags);
2478
2479
2480 if (rcu_segcblist_ready_cbs(&rdp->cblist))
2481 invoke_rcu_core();
2482}
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492void rcu_check_callbacks(int user)
2493{
2494 trace_rcu_utilization(TPS("Start scheduler-tick"));
2495 raw_cpu_inc(rcu_data.ticks_this_gp);
2496
2497 if (smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs))) {
2498
2499 if (!rcu_is_cpu_rrupt_from_idle() && !user) {
2500 set_tsk_need_resched(current);
2501 set_preempt_need_resched();
2502 }
2503 __this_cpu_write(rcu_data.rcu_urgent_qs, false);
2504 }
2505 rcu_flavor_check_callbacks(user);
2506 if (rcu_pending())
2507 invoke_rcu_core();
2508
2509 trace_rcu_utilization(TPS("End scheduler-tick"));
2510}
2511
2512
2513
2514
2515
2516
2517
2518
2519static void force_qs_rnp(int (*f)(struct rcu_data *rdp))
2520{
2521 int cpu;
2522 unsigned long flags;
2523 unsigned long mask;
2524 struct rcu_node *rnp;
2525
2526 rcu_for_each_leaf_node(rnp) {
2527 cond_resched_tasks_rcu_qs();
2528 mask = 0;
2529 raw_spin_lock_irqsave_rcu_node(rnp, flags);
2530 if (rnp->qsmask == 0) {
2531 if (!IS_ENABLED(CONFIG_PREEMPT) ||
2532 rcu_preempt_blocked_readers_cgp(rnp)) {
2533
2534
2535
2536
2537
2538 rcu_initiate_boost(rnp, flags);
2539
2540 continue;
2541 }
2542 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2543 continue;
2544 }
2545 for_each_leaf_node_possible_cpu(rnp, cpu) {
2546 unsigned long bit = leaf_node_cpu_bit(rnp, cpu);
2547 if ((rnp->qsmask & bit) != 0) {
2548 if (f(per_cpu_ptr(&rcu_data, cpu)))
2549 mask |= bit;
2550 }
2551 }
2552 if (mask != 0) {
2553
2554 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
2555 } else {
2556
2557 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2558 }
2559 }
2560}
2561
2562
2563
2564
2565
2566static void force_quiescent_state(void)
2567{
2568 unsigned long flags;
2569 bool ret;
2570 struct rcu_node *rnp;
2571 struct rcu_node *rnp_old = NULL;
2572
2573
2574 rnp = __this_cpu_read(rcu_data.mynode);
2575 for (; rnp != NULL; rnp = rnp->parent) {
2576 ret = (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) ||
2577 !raw_spin_trylock(&rnp->fqslock);
2578 if (rnp_old != NULL)
2579 raw_spin_unlock(&rnp_old->fqslock);
2580 if (ret)
2581 return;
2582 rnp_old = rnp;
2583 }
2584
2585
2586
2587 raw_spin_lock_irqsave_rcu_node(rnp_old, flags);
2588 raw_spin_unlock(&rnp_old->fqslock);
2589 if (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) {
2590 raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
2591 return;
2592 }
2593 WRITE_ONCE(rcu_state.gp_flags,
2594 READ_ONCE(rcu_state.gp_flags) | RCU_GP_FLAG_FQS);
2595 raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
2596 rcu_gp_kthread_wake();
2597}
2598
2599
2600
2601
2602
2603static void
2604rcu_check_gp_start_stall(struct rcu_node *rnp, struct rcu_data *rdp)
2605{
2606 const unsigned long gpssdelay = rcu_jiffies_till_stall_check() * HZ;
2607 unsigned long flags;
2608 unsigned long j;
2609 struct rcu_node *rnp_root = rcu_get_root();
2610 static atomic_t warned = ATOMIC_INIT(0);
2611
2612 if (!IS_ENABLED(CONFIG_PROVE_RCU) || rcu_gp_in_progress() ||
2613 ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed))
2614 return;
2615 j = jiffies;
2616 if (time_before(j, READ_ONCE(rcu_state.gp_req_activity) + gpssdelay) ||
2617 time_before(j, READ_ONCE(rcu_state.gp_activity) + gpssdelay) ||
2618 atomic_read(&warned))
2619 return;
2620
2621 raw_spin_lock_irqsave_rcu_node(rnp, flags);
2622 j = jiffies;
2623 if (rcu_gp_in_progress() ||
2624 ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
2625 time_before(j, READ_ONCE(rcu_state.gp_req_activity) + gpssdelay) ||
2626 time_before(j, READ_ONCE(rcu_state.gp_activity) + gpssdelay) ||
2627 atomic_read(&warned)) {
2628 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2629 return;
2630 }
2631
2632
2633 if (rnp_root != rnp)
2634 raw_spin_lock_rcu_node(rnp_root);
2635 j = jiffies;
2636 if (rcu_gp_in_progress() ||
2637 ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
2638 time_before(j, rcu_state.gp_req_activity + gpssdelay) ||
2639 time_before(j, rcu_state.gp_activity + gpssdelay) ||
2640 atomic_xchg(&warned, 1)) {
2641 raw_spin_unlock_rcu_node(rnp_root);
2642 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2643 return;
2644 }
2645 pr_alert("%s: g%ld->%ld gar:%lu ga:%lu f%#x gs:%d %s->state:%#lx\n",
2646 __func__, (long)READ_ONCE(rcu_state.gp_seq),
2647 (long)READ_ONCE(rnp_root->gp_seq_needed),
2648 j - rcu_state.gp_req_activity, j - rcu_state.gp_activity,
2649 rcu_state.gp_flags, rcu_state.gp_state, rcu_state.name,
2650 rcu_state.gp_kthread ? rcu_state.gp_kthread->state : 0x1ffffL);
2651 WARN_ON(1);
2652 if (rnp_root != rnp)
2653 raw_spin_unlock_rcu_node(rnp_root);
2654 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2655}
2656
2657
2658
2659
2660
2661
2662static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused)
2663{
2664 unsigned long flags;
2665 struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
2666 struct rcu_node *rnp = rdp->mynode;
2667
2668 if (cpu_is_offline(smp_processor_id()))
2669 return;
2670 trace_rcu_utilization(TPS("Start RCU core"));
2671 WARN_ON_ONCE(!rdp->beenonline);
2672
2673
2674 if (!(preempt_count() & PREEMPT_MASK)) {
2675 rcu_preempt_deferred_qs(current);
2676 } else if (rcu_preempt_need_deferred_qs(current)) {
2677 set_tsk_need_resched(current);
2678 set_preempt_need_resched();
2679 }
2680
2681
2682 rcu_check_quiescent_state(rdp);
2683
2684
2685 if (!rcu_gp_in_progress() &&
2686 rcu_segcblist_is_enabled(&rdp->cblist)) {
2687 local_irq_save(flags);
2688 if (!rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
2689 rcu_accelerate_cbs_unlocked(rnp, rdp);
2690 local_irq_restore(flags);
2691 }
2692
2693 rcu_check_gp_start_stall(rnp, rdp);
2694
2695
2696 if (rcu_segcblist_ready_cbs(&rdp->cblist))
2697 invoke_rcu_callbacks(rdp);
2698
2699
2700 do_nocb_deferred_wakeup(rdp);
2701 trace_rcu_utilization(TPS("End RCU core"));
2702}
2703
2704
2705
2706
2707
2708
2709
2710
2711static void invoke_rcu_callbacks(struct rcu_data *rdp)
2712{
2713 if (unlikely(!READ_ONCE(rcu_scheduler_fully_active)))
2714 return;
2715 if (likely(!rcu_state.boost)) {
2716 rcu_do_batch(rdp);
2717 return;
2718 }
2719 invoke_rcu_callbacks_kthread();
2720}
2721
2722static void invoke_rcu_core(void)
2723{
2724 if (cpu_online(smp_processor_id()))
2725 raise_softirq(RCU_SOFTIRQ);
2726}
2727
2728
2729
2730
2731static void __call_rcu_core(struct rcu_data *rdp, struct rcu_head *head,
2732 unsigned long flags)
2733{
2734
2735
2736
2737
2738 if (!rcu_is_watching())
2739 invoke_rcu_core();
2740
2741
2742 if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
2743 return;
2744
2745
2746
2747
2748
2749
2750
2751
2752 if (unlikely(rcu_segcblist_n_cbs(&rdp->cblist) >
2753 rdp->qlen_last_fqs_check + qhimark)) {
2754
2755
2756 note_gp_changes(rdp);
2757
2758
2759 if (!rcu_gp_in_progress()) {
2760 rcu_accelerate_cbs_unlocked(rdp->mynode, rdp);
2761 } else {
2762
2763 rdp->blimit = LONG_MAX;
2764 if (rcu_state.n_force_qs == rdp->n_force_qs_snap &&
2765 rcu_segcblist_first_pend_cb(&rdp->cblist) != head)
2766 force_quiescent_state();
2767 rdp->n_force_qs_snap = rcu_state.n_force_qs;
2768 rdp->qlen_last_fqs_check = rcu_segcblist_n_cbs(&rdp->cblist);
2769 }
2770 }
2771}
2772
2773
2774
2775
2776static void rcu_leak_callback(struct rcu_head *rhp)
2777{
2778}
2779
2780
2781
2782
2783
2784
2785
2786static void
2787__call_rcu(struct rcu_head *head, rcu_callback_t func, int cpu, bool lazy)
2788{
2789 unsigned long flags;
2790 struct rcu_data *rdp;
2791
2792
2793 WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1));
2794
2795 if (debug_rcu_head_queue(head)) {
2796
2797
2798
2799
2800
2801 WARN_ONCE(1, "__call_rcu(): Double-freed CB %p->%pF()!!!\n",
2802 head, head->func);
2803 WRITE_ONCE(head->func, rcu_leak_callback);
2804 return;
2805 }
2806 head->func = func;
2807 head->next = NULL;
2808 local_irq_save(flags);
2809 rdp = this_cpu_ptr(&rcu_data);
2810
2811
2812 if (unlikely(!rcu_segcblist_is_enabled(&rdp->cblist)) || cpu != -1) {
2813 int offline;
2814
2815 if (cpu != -1)
2816 rdp = per_cpu_ptr(&rcu_data, cpu);
2817 if (likely(rdp->mynode)) {
2818
2819 offline = !__call_rcu_nocb(rdp, head, lazy, flags);
2820 WARN_ON_ONCE(offline);
2821
2822 local_irq_restore(flags);
2823 return;
2824 }
2825
2826
2827
2828
2829 BUG_ON(cpu != -1);
2830 WARN_ON_ONCE(!rcu_is_watching());
2831 if (rcu_segcblist_empty(&rdp->cblist))
2832 rcu_segcblist_init(&rdp->cblist);
2833 }
2834 rcu_segcblist_enqueue(&rdp->cblist, head, lazy);
2835 if (!lazy)
2836 rcu_idle_count_callbacks_posted();
2837
2838 if (__is_kfree_rcu_offset((unsigned long)func))
2839 trace_rcu_kfree_callback(rcu_state.name, head,
2840 (unsigned long)func,
2841 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
2842 rcu_segcblist_n_cbs(&rdp->cblist));
2843 else
2844 trace_rcu_callback(rcu_state.name, head,
2845 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
2846 rcu_segcblist_n_cbs(&rdp->cblist));
2847
2848
2849 __call_rcu_core(rdp, head, flags);
2850 local_irq_restore(flags);
2851}
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888void call_rcu(struct rcu_head *head, rcu_callback_t func)
2889{
2890 __call_rcu(head, func, -1, 0);
2891}
2892EXPORT_SYMBOL_GPL(call_rcu);
2893
2894
2895
2896
2897
2898
2899
2900
2901void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
2902{
2903 __call_rcu(head, func, -1, 1);
2904}
2905EXPORT_SYMBOL_GPL(kfree_call_rcu);
2906
2907
2908
2909
2910
2911
2912
2913
2914unsigned long get_state_synchronize_rcu(void)
2915{
2916
2917
2918
2919
2920 smp_mb();
2921 return rcu_seq_snap(&rcu_state.gp_seq);
2922}
2923EXPORT_SYMBOL_GPL(get_state_synchronize_rcu);
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939void cond_synchronize_rcu(unsigned long oldstate)
2940{
2941 if (!rcu_seq_done(&rcu_state.gp_seq, oldstate))
2942 synchronize_rcu();
2943 else
2944 smp_mb();
2945}
2946EXPORT_SYMBOL_GPL(cond_synchronize_rcu);
2947
2948
2949
2950
2951
2952
2953
2954
2955static int rcu_pending(void)
2956{
2957 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
2958 struct rcu_node *rnp = rdp->mynode;
2959
2960
2961 check_cpu_stall(rdp);
2962
2963
2964 if (rcu_nohz_full_cpu())
2965 return 0;
2966
2967
2968 if (rdp->core_needs_qs && !rdp->cpu_no_qs.b.norm)
2969 return 1;
2970
2971
2972 if (rcu_segcblist_ready_cbs(&rdp->cblist))
2973 return 1;
2974
2975
2976 if (!rcu_gp_in_progress() &&
2977 rcu_segcblist_is_enabled(&rdp->cblist) &&
2978 !rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
2979 return 1;
2980
2981
2982 if (rcu_seq_current(&rnp->gp_seq) != rdp->gp_seq ||
2983 unlikely(READ_ONCE(rdp->gpwrap)))
2984 return 1;
2985
2986
2987 if (rcu_nocb_need_deferred_wakeup(rdp))
2988 return 1;
2989
2990
2991 return 0;
2992}
2993
2994
2995
2996
2997
2998
2999static bool rcu_cpu_has_callbacks(bool *all_lazy)
3000{
3001 bool al = true;
3002 bool hc = false;
3003 struct rcu_data *rdp;
3004
3005 rdp = this_cpu_ptr(&rcu_data);
3006 if (!rcu_segcblist_empty(&rdp->cblist)) {
3007 hc = true;
3008 if (rcu_segcblist_n_nonlazy_cbs(&rdp->cblist))
3009 al = false;
3010 }
3011 if (all_lazy)
3012 *all_lazy = al;
3013 return hc;
3014}
3015
3016
3017
3018
3019
3020static void rcu_barrier_trace(const char *s, int cpu, unsigned long done)
3021{
3022 trace_rcu_barrier(rcu_state.name, s, cpu,
3023 atomic_read(&rcu_state.barrier_cpu_count), done);
3024}
3025
3026
3027
3028
3029
3030static void rcu_barrier_callback(struct rcu_head *rhp)
3031{
3032 if (atomic_dec_and_test(&rcu_state.barrier_cpu_count)) {
3033 rcu_barrier_trace(TPS("LastCB"), -1,
3034 rcu_state.barrier_sequence);
3035 complete(&rcu_state.barrier_completion);
3036 } else {
3037 rcu_barrier_trace(TPS("CB"), -1, rcu_state.barrier_sequence);
3038 }
3039}
3040
3041
3042
3043
3044static void rcu_barrier_func(void *unused)
3045{
3046 struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
3047
3048 rcu_barrier_trace(TPS("IRQ"), -1, rcu_state.barrier_sequence);
3049 rdp->barrier_head.func = rcu_barrier_callback;
3050 debug_rcu_head_queue(&rdp->barrier_head);
3051 if (rcu_segcblist_entrain(&rdp->cblist, &rdp->barrier_head, 0)) {
3052 atomic_inc(&rcu_state.barrier_cpu_count);
3053 } else {
3054 debug_rcu_head_unqueue(&rdp->barrier_head);
3055 rcu_barrier_trace(TPS("IRQNQ"), -1,
3056 rcu_state.barrier_sequence);
3057 }
3058}
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068void rcu_barrier(void)
3069{
3070 int cpu;
3071 struct rcu_data *rdp;
3072 unsigned long s = rcu_seq_snap(&rcu_state.barrier_sequence);
3073
3074 rcu_barrier_trace(TPS("Begin"), -1, s);
3075
3076
3077 mutex_lock(&rcu_state.barrier_mutex);
3078
3079
3080 if (rcu_seq_done(&rcu_state.barrier_sequence, s)) {
3081 rcu_barrier_trace(TPS("EarlyExit"), -1,
3082 rcu_state.barrier_sequence);
3083 smp_mb();
3084 mutex_unlock(&rcu_state.barrier_mutex);
3085 return;
3086 }
3087
3088
3089 rcu_seq_start(&rcu_state.barrier_sequence);
3090 rcu_barrier_trace(TPS("Inc1"), -1, rcu_state.barrier_sequence);
3091
3092
3093
3094
3095
3096
3097
3098 init_completion(&rcu_state.barrier_completion);
3099 atomic_set(&rcu_state.barrier_cpu_count, 1);
3100 get_online_cpus();
3101
3102
3103
3104
3105
3106
3107 for_each_possible_cpu(cpu) {
3108 if (!cpu_online(cpu) && !rcu_is_nocb_cpu(cpu))
3109 continue;
3110 rdp = per_cpu_ptr(&rcu_data, cpu);
3111 if (rcu_is_nocb_cpu(cpu)) {
3112 if (!rcu_nocb_cpu_needs_barrier(cpu)) {
3113 rcu_barrier_trace(TPS("OfflineNoCB"), cpu,
3114 rcu_state.barrier_sequence);
3115 } else {
3116 rcu_barrier_trace(TPS("OnlineNoCB"), cpu,
3117 rcu_state.barrier_sequence);
3118 smp_mb__before_atomic();
3119 atomic_inc(&rcu_state.barrier_cpu_count);
3120 __call_rcu(&rdp->barrier_head,
3121 rcu_barrier_callback, cpu, 0);
3122 }
3123 } else if (rcu_segcblist_n_cbs(&rdp->cblist)) {
3124 rcu_barrier_trace(TPS("OnlineQ"), cpu,
3125 rcu_state.barrier_sequence);
3126 smp_call_function_single(cpu, rcu_barrier_func, NULL, 1);
3127 } else {
3128 rcu_barrier_trace(TPS("OnlineNQ"), cpu,
3129 rcu_state.barrier_sequence);
3130 }
3131 }
3132 put_online_cpus();
3133
3134
3135
3136
3137
3138 if (atomic_dec_and_test(&rcu_state.barrier_cpu_count))
3139 complete(&rcu_state.barrier_completion);
3140
3141
3142 wait_for_completion(&rcu_state.barrier_completion);
3143
3144
3145 rcu_barrier_trace(TPS("Inc2"), -1, rcu_state.barrier_sequence);
3146 rcu_seq_end(&rcu_state.barrier_sequence);
3147
3148
3149 mutex_unlock(&rcu_state.barrier_mutex);
3150}
3151EXPORT_SYMBOL_GPL(rcu_barrier);
3152
3153
3154
3155
3156
3157
3158
3159static void rcu_init_new_rnp(struct rcu_node *rnp_leaf)
3160{
3161 long mask;
3162 long oldmask;
3163 struct rcu_node *rnp = rnp_leaf;
3164
3165 raw_lockdep_assert_held_rcu_node(rnp_leaf);
3166 WARN_ON_ONCE(rnp->wait_blkd_tasks);
3167 for (;;) {
3168 mask = rnp->grpmask;
3169 rnp = rnp->parent;
3170 if (rnp == NULL)
3171 return;
3172 raw_spin_lock_rcu_node(rnp);
3173 oldmask = rnp->qsmaskinit;
3174 rnp->qsmaskinit |= mask;
3175 raw_spin_unlock_rcu_node(rnp);
3176 if (oldmask)
3177 return;
3178 }
3179}
3180
3181
3182
3183
3184static void __init
3185rcu_boot_init_percpu_data(int cpu)
3186{
3187 struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3188
3189
3190 rdp->grpmask = leaf_node_cpu_bit(rdp->mynode, cpu);
3191 WARN_ON_ONCE(rdp->dynticks_nesting != 1);
3192 WARN_ON_ONCE(rcu_dynticks_in_eqs(rcu_dynticks_snap(rdp)));
3193 rdp->rcu_ofl_gp_seq = rcu_state.gp_seq;
3194 rdp->rcu_ofl_gp_flags = RCU_GP_CLEANED;
3195 rdp->rcu_onl_gp_seq = rcu_state.gp_seq;
3196 rdp->rcu_onl_gp_flags = RCU_GP_CLEANED;
3197 rdp->cpu = cpu;
3198 rcu_boot_init_nocb_percpu_data(rdp);
3199}
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210int rcutree_prepare_cpu(unsigned int cpu)
3211{
3212 unsigned long flags;
3213 struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3214 struct rcu_node *rnp = rcu_get_root();
3215
3216
3217 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3218 rdp->qlen_last_fqs_check = 0;
3219 rdp->n_force_qs_snap = rcu_state.n_force_qs;
3220 rdp->blimit = blimit;
3221 if (rcu_segcblist_empty(&rdp->cblist) &&
3222 !init_nocb_callback_list(rdp))
3223 rcu_segcblist_init(&rdp->cblist);
3224 rdp->dynticks_nesting = 1;
3225 rcu_dynticks_eqs_online();
3226 raw_spin_unlock_rcu_node(rnp);
3227
3228
3229
3230
3231
3232
3233 rnp = rdp->mynode;
3234 raw_spin_lock_rcu_node(rnp);
3235 rdp->beenonline = true;
3236 rdp->gp_seq = rnp->gp_seq;
3237 rdp->gp_seq_needed = rnp->gp_seq;
3238 rdp->cpu_no_qs.b.norm = true;
3239 rdp->core_needs_qs = false;
3240 rdp->rcu_iw_pending = false;
3241 rdp->rcu_iw_gp_seq = rnp->gp_seq - 1;
3242 trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("cpuonl"));
3243 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3244 rcu_prepare_kthreads(cpu);
3245 rcu_spawn_all_nocb_kthreads(cpu);
3246
3247 return 0;
3248}
3249
3250
3251
3252
3253static void rcutree_affinity_setting(unsigned int cpu, int outgoing)
3254{
3255 struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3256
3257 rcu_boost_kthread_setaffinity(rdp->mynode, outgoing);
3258}
3259
3260
3261
3262
3263
3264int rcutree_online_cpu(unsigned int cpu)
3265{
3266 unsigned long flags;
3267 struct rcu_data *rdp;
3268 struct rcu_node *rnp;
3269
3270 rdp = per_cpu_ptr(&rcu_data, cpu);
3271 rnp = rdp->mynode;
3272 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3273 rnp->ffmask |= rdp->grpmask;
3274 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3275 if (IS_ENABLED(CONFIG_TREE_SRCU))
3276 srcu_online_cpu(cpu);
3277 if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE)
3278 return 0;
3279 sync_sched_exp_online_cleanup(cpu);
3280 rcutree_affinity_setting(cpu, -1);
3281 return 0;
3282}
3283
3284
3285
3286
3287
3288int rcutree_offline_cpu(unsigned int cpu)
3289{
3290 unsigned long flags;
3291 struct rcu_data *rdp;
3292 struct rcu_node *rnp;
3293
3294 rdp = per_cpu_ptr(&rcu_data, cpu);
3295 rnp = rdp->mynode;
3296 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3297 rnp->ffmask &= ~rdp->grpmask;
3298 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3299
3300 rcutree_affinity_setting(cpu, cpu);
3301 if (IS_ENABLED(CONFIG_TREE_SRCU))
3302 srcu_offline_cpu(cpu);
3303 return 0;
3304}
3305
3306static DEFINE_PER_CPU(int, rcu_cpu_started);
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319void rcu_cpu_starting(unsigned int cpu)
3320{
3321 unsigned long flags;
3322 unsigned long mask;
3323 int nbits;
3324 unsigned long oldmask;
3325 struct rcu_data *rdp;
3326 struct rcu_node *rnp;
3327
3328 if (per_cpu(rcu_cpu_started, cpu))
3329 return;
3330
3331 per_cpu(rcu_cpu_started, cpu) = 1;
3332
3333 rdp = per_cpu_ptr(&rcu_data, cpu);
3334 rnp = rdp->mynode;
3335 mask = rdp->grpmask;
3336 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3337 rnp->qsmaskinitnext |= mask;
3338 oldmask = rnp->expmaskinitnext;
3339 rnp->expmaskinitnext |= mask;
3340 oldmask ^= rnp->expmaskinitnext;
3341 nbits = bitmap_weight(&oldmask, BITS_PER_LONG);
3342
3343 smp_store_release(&rcu_state.ncpus, rcu_state.ncpus + nbits);
3344 rcu_gpnum_ovf(rnp, rdp);
3345 rdp->rcu_onl_gp_seq = READ_ONCE(rcu_state.gp_seq);
3346 rdp->rcu_onl_gp_flags = READ_ONCE(rcu_state.gp_flags);
3347 if (rnp->qsmask & mask) {
3348
3349 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
3350 } else {
3351 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3352 }
3353 smp_mb();
3354}
3355
3356#ifdef CONFIG_HOTPLUG_CPU
3357
3358
3359
3360
3361
3362
3363
3364
3365void rcu_report_dead(unsigned int cpu)
3366{
3367 unsigned long flags;
3368 unsigned long mask;
3369 struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3370 struct rcu_node *rnp = rdp->mynode;
3371
3372
3373 preempt_disable();
3374 rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
3375 preempt_enable();
3376 rcu_preempt_deferred_qs(current);
3377
3378
3379 mask = rdp->grpmask;
3380 raw_spin_lock(&rcu_state.ofl_lock);
3381 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3382 rdp->rcu_ofl_gp_seq = READ_ONCE(rcu_state.gp_seq);
3383 rdp->rcu_ofl_gp_flags = READ_ONCE(rcu_state.gp_flags);
3384 if (rnp->qsmask & mask) {
3385
3386 rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
3387 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3388 }
3389 rnp->qsmaskinitnext &= ~mask;
3390 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3391 raw_spin_unlock(&rcu_state.ofl_lock);
3392
3393 per_cpu(rcu_cpu_started, cpu) = 0;
3394}
3395
3396
3397
3398
3399
3400
3401void rcutree_migrate_callbacks(int cpu)
3402{
3403 unsigned long flags;
3404 struct rcu_data *my_rdp;
3405 struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3406 struct rcu_node *rnp_root = rcu_get_root();
3407 bool needwake;
3408
3409 if (rcu_is_nocb_cpu(cpu) || rcu_segcblist_empty(&rdp->cblist))
3410 return;
3411
3412 local_irq_save(flags);
3413 my_rdp = this_cpu_ptr(&rcu_data);
3414 if (rcu_nocb_adopt_orphan_cbs(my_rdp, rdp, flags)) {
3415 local_irq_restore(flags);
3416 return;
3417 }
3418 raw_spin_lock_rcu_node(rnp_root);
3419
3420 needwake = rcu_advance_cbs(rnp_root, rdp) ||
3421 rcu_advance_cbs(rnp_root, my_rdp);
3422 rcu_segcblist_merge(&my_rdp->cblist, &rdp->cblist);
3423 WARN_ON_ONCE(rcu_segcblist_empty(&my_rdp->cblist) !=
3424 !rcu_segcblist_n_cbs(&my_rdp->cblist));
3425 raw_spin_unlock_irqrestore_rcu_node(rnp_root, flags);
3426 if (needwake)
3427 rcu_gp_kthread_wake();
3428 WARN_ONCE(rcu_segcblist_n_cbs(&rdp->cblist) != 0 ||
3429 !rcu_segcblist_empty(&rdp->cblist),
3430 "rcu_cleanup_dead_cpu: Callbacks on offline CPU %d: qlen=%lu, 1stCB=%p\n",
3431 cpu, rcu_segcblist_n_cbs(&rdp->cblist),
3432 rcu_segcblist_first_cb(&rdp->cblist));
3433}
3434#endif
3435
3436
3437
3438
3439
3440static int rcu_pm_notify(struct notifier_block *self,
3441 unsigned long action, void *hcpu)
3442{
3443 switch (action) {
3444 case PM_HIBERNATION_PREPARE:
3445 case PM_SUSPEND_PREPARE:
3446 if (nr_cpu_ids <= 256)
3447 rcu_expedite_gp();
3448 break;
3449 case PM_POST_HIBERNATION:
3450 case PM_POST_SUSPEND:
3451 if (nr_cpu_ids <= 256)
3452 rcu_unexpedite_gp();
3453 break;
3454 default:
3455 break;
3456 }
3457 return NOTIFY_OK;
3458}
3459
3460
3461
3462
3463static int __init rcu_spawn_gp_kthread(void)
3464{
3465 unsigned long flags;
3466 int kthread_prio_in = kthread_prio;
3467 struct rcu_node *rnp;
3468 struct sched_param sp;
3469 struct task_struct *t;
3470
3471
3472 if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 2
3473 && IS_BUILTIN(CONFIG_RCU_TORTURE_TEST))
3474 kthread_prio = 2;
3475 else if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 1)
3476 kthread_prio = 1;
3477 else if (kthread_prio < 0)
3478 kthread_prio = 0;
3479 else if (kthread_prio > 99)
3480 kthread_prio = 99;
3481
3482 if (kthread_prio != kthread_prio_in)
3483 pr_alert("rcu_spawn_gp_kthread(): Limited prio to %d from %d\n",
3484 kthread_prio, kthread_prio_in);
3485
3486 rcu_scheduler_fully_active = 1;
3487 t = kthread_create(rcu_gp_kthread, NULL, "%s", rcu_state.name);
3488 BUG_ON(IS_ERR(t));
3489 rnp = rcu_get_root();
3490 raw_spin_lock_irqsave_rcu_node(rnp, flags);
3491 rcu_state.gp_kthread = t;
3492 if (kthread_prio) {
3493 sp.sched_priority = kthread_prio;
3494 sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
3495 }
3496 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3497 wake_up_process(t);
3498 rcu_spawn_nocb_kthreads();
3499 rcu_spawn_boost_kthreads();
3500 return 0;
3501}
3502early_initcall(rcu_spawn_gp_kthread);
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514void rcu_scheduler_starting(void)
3515{
3516 WARN_ON(num_online_cpus() != 1);
3517 WARN_ON(nr_context_switches() > 0);
3518 rcu_test_sync_prims();
3519 rcu_scheduler_active = RCU_SCHEDULER_INIT;
3520 rcu_test_sync_prims();
3521}
3522
3523
3524
3525
3526static void __init rcu_init_one(void)
3527{
3528 static const char * const buf[] = RCU_NODE_NAME_INIT;
3529 static const char * const fqs[] = RCU_FQS_NAME_INIT;
3530 static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
3531 static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
3532
3533 int levelspread[RCU_NUM_LVLS];
3534 int cpustride = 1;
3535 int i;
3536 int j;
3537 struct rcu_node *rnp;
3538
3539 BUILD_BUG_ON(RCU_NUM_LVLS > ARRAY_SIZE(buf));
3540
3541
3542 if (rcu_num_lvls <= 0 || rcu_num_lvls > RCU_NUM_LVLS)
3543 panic("rcu_init_one: rcu_num_lvls out of range");
3544
3545
3546
3547 for (i = 1; i < rcu_num_lvls; i++)
3548 rcu_state.level[i] =
3549 rcu_state.level[i - 1] + num_rcu_lvl[i - 1];
3550 rcu_init_levelspread(levelspread, num_rcu_lvl);
3551
3552
3553
3554 for (i = rcu_num_lvls - 1; i >= 0; i--) {
3555 cpustride *= levelspread[i];
3556 rnp = rcu_state.level[i];
3557 for (j = 0; j < num_rcu_lvl[i]; j++, rnp++) {
3558 raw_spin_lock_init(&ACCESS_PRIVATE(rnp, lock));
3559 lockdep_set_class_and_name(&ACCESS_PRIVATE(rnp, lock),
3560 &rcu_node_class[i], buf[i]);
3561 raw_spin_lock_init(&rnp->fqslock);
3562 lockdep_set_class_and_name(&rnp->fqslock,
3563 &rcu_fqs_class[i], fqs[i]);
3564 rnp->gp_seq = rcu_state.gp_seq;
3565 rnp->gp_seq_needed = rcu_state.gp_seq;
3566 rnp->completedqs = rcu_state.gp_seq;
3567 rnp->qsmask = 0;
3568 rnp->qsmaskinit = 0;
3569 rnp->grplo = j * cpustride;
3570 rnp->grphi = (j + 1) * cpustride - 1;
3571 if (rnp->grphi >= nr_cpu_ids)
3572 rnp->grphi = nr_cpu_ids - 1;
3573 if (i == 0) {
3574 rnp->grpnum = 0;
3575 rnp->grpmask = 0;
3576 rnp->parent = NULL;
3577 } else {
3578 rnp->grpnum = j % levelspread[i - 1];
3579 rnp->grpmask = BIT(rnp->grpnum);
3580 rnp->parent = rcu_state.level[i - 1] +
3581 j / levelspread[i - 1];
3582 }
3583 rnp->level = i;
3584 INIT_LIST_HEAD(&rnp->blkd_tasks);
3585 rcu_init_one_nocb(rnp);
3586 init_waitqueue_head(&rnp->exp_wq[0]);
3587 init_waitqueue_head(&rnp->exp_wq[1]);
3588 init_waitqueue_head(&rnp->exp_wq[2]);
3589 init_waitqueue_head(&rnp->exp_wq[3]);
3590 spin_lock_init(&rnp->exp_lock);
3591 }
3592 }
3593
3594 init_swait_queue_head(&rcu_state.gp_wq);
3595 init_swait_queue_head(&rcu_state.expedited_wq);
3596 rnp = rcu_first_leaf_node();
3597 for_each_possible_cpu(i) {
3598 while (i > rnp->grphi)
3599 rnp++;
3600 per_cpu_ptr(&rcu_data, i)->mynode = rnp;
3601 rcu_boot_init_percpu_data(i);
3602 }
3603}
3604
3605
3606
3607
3608
3609
3610static void __init rcu_init_geometry(void)
3611{
3612 ulong d;
3613 int i;
3614 int rcu_capacity[RCU_NUM_LVLS];
3615
3616
3617
3618
3619
3620
3621
3622
3623 d = RCU_JIFFIES_TILL_FORCE_QS + nr_cpu_ids / RCU_JIFFIES_FQS_DIV;
3624 if (jiffies_till_first_fqs == ULONG_MAX)
3625 jiffies_till_first_fqs = d;
3626 if (jiffies_till_next_fqs == ULONG_MAX)
3627 jiffies_till_next_fqs = d;
3628 if (jiffies_till_sched_qs == ULONG_MAX)
3629 adjust_jiffies_till_sched_qs();
3630
3631
3632 if (rcu_fanout_leaf == RCU_FANOUT_LEAF &&
3633 nr_cpu_ids == NR_CPUS)
3634 return;
3635 pr_info("Adjusting geometry for rcu_fanout_leaf=%d, nr_cpu_ids=%u\n",
3636 rcu_fanout_leaf, nr_cpu_ids);
3637
3638
3639
3640
3641
3642
3643
3644 if (rcu_fanout_leaf < 2 ||
3645 rcu_fanout_leaf > sizeof(unsigned long) * 8) {
3646 rcu_fanout_leaf = RCU_FANOUT_LEAF;
3647 WARN_ON(1);
3648 return;
3649 }
3650
3651
3652
3653
3654
3655 rcu_capacity[0] = rcu_fanout_leaf;
3656 for (i = 1; i < RCU_NUM_LVLS; i++)
3657 rcu_capacity[i] = rcu_capacity[i - 1] * RCU_FANOUT;
3658
3659
3660
3661
3662
3663 if (nr_cpu_ids > rcu_capacity[RCU_NUM_LVLS - 1]) {
3664 rcu_fanout_leaf = RCU_FANOUT_LEAF;
3665 WARN_ON(1);
3666 return;
3667 }
3668
3669
3670 for (i = 0; nr_cpu_ids > rcu_capacity[i]; i++) {
3671 }
3672 rcu_num_lvls = i + 1;
3673
3674
3675 for (i = 0; i < rcu_num_lvls; i++) {
3676 int cap = rcu_capacity[(rcu_num_lvls - 1) - i];
3677 num_rcu_lvl[i] = DIV_ROUND_UP(nr_cpu_ids, cap);
3678 }
3679
3680
3681 rcu_num_nodes = 0;
3682 for (i = 0; i < rcu_num_lvls; i++)
3683 rcu_num_nodes += num_rcu_lvl[i];
3684}
3685
3686
3687
3688
3689
3690static void __init rcu_dump_rcu_node_tree(void)
3691{
3692 int level = 0;
3693 struct rcu_node *rnp;
3694
3695 pr_info("rcu_node tree layout dump\n");
3696 pr_info(" ");
3697 rcu_for_each_node_breadth_first(rnp) {
3698 if (rnp->level != level) {
3699 pr_cont("\n");
3700 pr_info(" ");
3701 level = rnp->level;
3702 }
3703 pr_cont("%d:%d ^%d ", rnp->grplo, rnp->grphi, rnp->grpnum);
3704 }
3705 pr_cont("\n");
3706}
3707
3708struct workqueue_struct *rcu_gp_wq;
3709struct workqueue_struct *rcu_par_gp_wq;
3710
3711void __init rcu_init(void)
3712{
3713 int cpu;
3714
3715 rcu_early_boot_tests();
3716
3717 rcu_bootup_announce();
3718 rcu_init_geometry();
3719 rcu_init_one();
3720 if (dump_tree)
3721 rcu_dump_rcu_node_tree();
3722 open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
3723
3724
3725
3726
3727
3728
3729 pm_notifier(rcu_pm_notify, 0);
3730 for_each_online_cpu(cpu) {
3731 rcutree_prepare_cpu(cpu);
3732 rcu_cpu_starting(cpu);
3733 rcutree_online_cpu(cpu);
3734 }
3735
3736
3737 rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0);
3738 WARN_ON(!rcu_gp_wq);
3739 rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);
3740 WARN_ON(!rcu_par_gp_wq);
3741 srcu_init();
3742}
3743
3744#include "tree_exp.h"
3745#include "tree_plugin.h"
3746