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#include <linux/delay.h>
28
29#ifdef CONFIG_TREE_PREEMPT_RCU
30
31struct rcu_state rcu_preempt_state = RCU_STATE_INITIALIZER(rcu_preempt_state);
32DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data);
33
34static int rcu_preempted_readers_exp(struct rcu_node *rnp);
35
36
37
38
39static void __init rcu_bootup_announce(void)
40{
41 printk(KERN_INFO
42 "Experimental preemptable hierarchical RCU implementation.\n");
43}
44
45
46
47
48
49long rcu_batches_completed_preempt(void)
50{
51 return rcu_preempt_state.completed;
52}
53EXPORT_SYMBOL_GPL(rcu_batches_completed_preempt);
54
55
56
57
58long rcu_batches_completed(void)
59{
60 return rcu_batches_completed_preempt();
61}
62EXPORT_SYMBOL_GPL(rcu_batches_completed);
63
64
65
66
67
68
69
70static void rcu_preempt_qs(int cpu)
71{
72 struct rcu_data *rdp = &per_cpu(rcu_preempt_data, cpu);
73 rdp->passed_quiesc_completed = rdp->gpnum - 1;
74 barrier();
75 rdp->passed_quiesc = 1;
76}
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91static void rcu_preempt_note_context_switch(int cpu)
92{
93 struct task_struct *t = current;
94 unsigned long flags;
95 int phase;
96 struct rcu_data *rdp;
97 struct rcu_node *rnp;
98
99 if (t->rcu_read_lock_nesting &&
100 (t->rcu_read_unlock_special & RCU_READ_UNLOCK_BLOCKED) == 0) {
101
102
103 rdp = rcu_preempt_state.rda[cpu];
104 rnp = rdp->mynode;
105 spin_lock_irqsave(&rnp->lock, flags);
106 t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BLOCKED;
107 t->rcu_blocked_node = rnp;
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 WARN_ON_ONCE((rdp->grpmask & rnp->qsmaskinit) == 0);
123 WARN_ON_ONCE(!list_empty(&t->rcu_node_entry));
124 phase = (rnp->gpnum + !(rnp->qsmask & rdp->grpmask)) & 0x1;
125 list_add(&t->rcu_node_entry, &rnp->blocked_tasks[phase]);
126 spin_unlock_irqrestore(&rnp->lock, flags);
127 }
128
129
130
131
132
133
134
135
136
137
138 rcu_preempt_qs(cpu);
139 local_irq_save(flags);
140 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;
141 local_irq_restore(flags);
142}
143
144
145
146
147
148
149void __rcu_read_lock(void)
150{
151 ACCESS_ONCE(current->rcu_read_lock_nesting)++;
152 barrier();
153}
154EXPORT_SYMBOL_GPL(__rcu_read_lock);
155
156
157
158
159
160
161static int rcu_preempted_readers(struct rcu_node *rnp)
162{
163 int phase = rnp->gpnum & 0x1;
164
165 return !list_empty(&rnp->blocked_tasks[phase]) ||
166 !list_empty(&rnp->blocked_tasks[phase + 2]);
167}
168
169
170
171
172
173
174
175
176static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
177 __releases(rnp->lock)
178{
179 unsigned long mask;
180 struct rcu_node *rnp_p;
181
182 if (rnp->qsmask != 0 || rcu_preempted_readers(rnp)) {
183 spin_unlock_irqrestore(&rnp->lock, flags);
184 return;
185 }
186
187 rnp_p = rnp->parent;
188 if (rnp_p == NULL) {
189
190
191
192
193
194 rcu_report_qs_rsp(&rcu_preempt_state, flags);
195 return;
196 }
197
198
199 mask = rnp->grpmask;
200 spin_unlock(&rnp->lock);
201 spin_lock(&rnp_p->lock);
202 rcu_report_qs_rnp(mask, &rcu_preempt_state, rnp_p, flags);
203}
204
205
206
207
208
209
210static void rcu_read_unlock_special(struct task_struct *t)
211{
212 int empty;
213 int empty_exp;
214 unsigned long flags;
215 struct rcu_node *rnp;
216 int special;
217
218
219 if (in_nmi())
220 return;
221
222 local_irq_save(flags);
223
224
225
226
227
228 special = t->rcu_read_unlock_special;
229 if (special & RCU_READ_UNLOCK_NEED_QS) {
230 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;
231 rcu_preempt_qs(smp_processor_id());
232 }
233
234
235 if (in_irq()) {
236 local_irq_restore(flags);
237 return;
238 }
239
240
241 if (special & RCU_READ_UNLOCK_BLOCKED) {
242 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_BLOCKED;
243
244
245
246
247
248
249 for (;;) {
250 rnp = t->rcu_blocked_node;
251 spin_lock(&rnp->lock);
252 if (rnp == t->rcu_blocked_node)
253 break;
254 spin_unlock(&rnp->lock);
255 }
256 empty = !rcu_preempted_readers(rnp);
257 empty_exp = !rcu_preempted_readers_exp(rnp);
258 smp_mb();
259 list_del_init(&t->rcu_node_entry);
260 t->rcu_blocked_node = NULL;
261
262
263
264
265
266
267 if (empty)
268 spin_unlock_irqrestore(&rnp->lock, flags);
269 else
270 rcu_report_unblock_qs_rnp(rnp, flags);
271
272
273
274
275
276 if (!empty_exp && !rcu_preempted_readers_exp(rnp))
277 rcu_report_exp_rnp(&rcu_preempt_state, rnp);
278 } else {
279 local_irq_restore(flags);
280 }
281}
282
283
284
285
286
287
288
289
290void __rcu_read_unlock(void)
291{
292 struct task_struct *t = current;
293
294 barrier();
295 if (--ACCESS_ONCE(t->rcu_read_lock_nesting) == 0 &&
296 unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))
297 rcu_read_unlock_special(t);
298}
299EXPORT_SYMBOL_GPL(__rcu_read_unlock);
300
301#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
302
303
304
305
306
307static void rcu_print_task_stall(struct rcu_node *rnp)
308{
309 unsigned long flags;
310 struct list_head *lp;
311 int phase;
312 struct task_struct *t;
313
314 if (rcu_preempted_readers(rnp)) {
315 spin_lock_irqsave(&rnp->lock, flags);
316 phase = rnp->gpnum & 0x1;
317 lp = &rnp->blocked_tasks[phase];
318 list_for_each_entry(t, lp, rcu_node_entry)
319 printk(" P%d", t->pid);
320 spin_unlock_irqrestore(&rnp->lock, flags);
321 }
322}
323
324#endif
325
326
327
328
329
330
331
332
333static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
334{
335 WARN_ON_ONCE(rcu_preempted_readers(rnp));
336 WARN_ON_ONCE(rnp->qsmask);
337}
338
339#ifdef CONFIG_HOTPLUG_CPU
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355static int rcu_preempt_offline_tasks(struct rcu_state *rsp,
356 struct rcu_node *rnp,
357 struct rcu_data *rdp)
358{
359 int i;
360 struct list_head *lp;
361 struct list_head *lp_root;
362 int retval = 0;
363 struct rcu_node *rnp_root = rcu_get_root(rsp);
364 struct task_struct *tp;
365
366 if (rnp == rnp_root) {
367 WARN_ONCE(1, "Last CPU thought to be offlined?");
368 return 0;
369 }
370 WARN_ON_ONCE(rnp != rdp->mynode &&
371 (!list_empty(&rnp->blocked_tasks[0]) ||
372 !list_empty(&rnp->blocked_tasks[1]) ||
373 !list_empty(&rnp->blocked_tasks[2]) ||
374 !list_empty(&rnp->blocked_tasks[3])));
375
376
377
378
379
380
381
382 if (rcu_preempted_readers(rnp))
383 retval |= RCU_OFL_TASKS_NORM_GP;
384 if (rcu_preempted_readers_exp(rnp))
385 retval |= RCU_OFL_TASKS_EXP_GP;
386 for (i = 0; i < 4; i++) {
387 lp = &rnp->blocked_tasks[i];
388 lp_root = &rnp_root->blocked_tasks[i];
389 while (!list_empty(lp)) {
390 tp = list_entry(lp->next, typeof(*tp), rcu_node_entry);
391 spin_lock(&rnp_root->lock);
392 list_del(&tp->rcu_node_entry);
393 tp->rcu_blocked_node = rnp_root;
394 list_add(&tp->rcu_node_entry, lp_root);
395 spin_unlock(&rnp_root->lock);
396 }
397 }
398 return retval;
399}
400
401
402
403
404static void rcu_preempt_offline_cpu(int cpu)
405{
406 __rcu_offline_cpu(cpu, &rcu_preempt_state);
407}
408
409#endif
410
411
412
413
414
415
416
417
418static void rcu_preempt_check_callbacks(int cpu)
419{
420 struct task_struct *t = current;
421
422 if (t->rcu_read_lock_nesting == 0) {
423 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;
424 rcu_preempt_qs(cpu);
425 return;
426 }
427 if (per_cpu(rcu_preempt_data, cpu).qs_pending)
428 t->rcu_read_unlock_special |= RCU_READ_UNLOCK_NEED_QS;
429}
430
431
432
433
434static void rcu_preempt_process_callbacks(void)
435{
436 __rcu_process_callbacks(&rcu_preempt_state,
437 &__get_cpu_var(rcu_preempt_data));
438}
439
440
441
442
443void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
444{
445 __call_rcu(head, func, &rcu_preempt_state);
446}
447EXPORT_SYMBOL_GPL(call_rcu);
448
449
450
451
452
453
454
455
456
457
458void synchronize_rcu(void)
459{
460 struct rcu_synchronize rcu;
461
462 if (!rcu_scheduler_active)
463 return;
464
465 init_completion(&rcu.completion);
466
467 call_rcu(&rcu.head, wakeme_after_rcu);
468
469 wait_for_completion(&rcu.completion);
470}
471EXPORT_SYMBOL_GPL(synchronize_rcu);
472
473static DECLARE_WAIT_QUEUE_HEAD(sync_rcu_preempt_exp_wq);
474static long sync_rcu_preempt_exp_count;
475static DEFINE_MUTEX(sync_rcu_preempt_exp_mutex);
476
477
478
479
480
481
482
483static int rcu_preempted_readers_exp(struct rcu_node *rnp)
484{
485 return !list_empty(&rnp->blocked_tasks[2]) ||
486 !list_empty(&rnp->blocked_tasks[3]);
487}
488
489
490
491
492
493
494
495
496
497
498static int sync_rcu_preempt_exp_done(struct rcu_node *rnp)
499{
500 return !rcu_preempted_readers_exp(rnp) &&
501 ACCESS_ONCE(rnp->expmask) == 0;
502}
503
504
505
506
507
508
509
510
511
512
513
514static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
515{
516 unsigned long flags;
517 unsigned long mask;
518
519 spin_lock_irqsave(&rnp->lock, flags);
520 for (;;) {
521 if (!sync_rcu_preempt_exp_done(rnp))
522 break;
523 if (rnp->parent == NULL) {
524 wake_up(&sync_rcu_preempt_exp_wq);
525 break;
526 }
527 mask = rnp->grpmask;
528 spin_unlock(&rnp->lock);
529 rnp = rnp->parent;
530 spin_lock(&rnp->lock);
531 rnp->expmask &= ~mask;
532 }
533 spin_unlock_irqrestore(&rnp->lock, flags);
534}
535
536
537
538
539
540
541
542
543static void
544sync_rcu_preempt_exp_init(struct rcu_state *rsp, struct rcu_node *rnp)
545{
546 int must_wait;
547
548 spin_lock(&rnp->lock);
549 list_splice_init(&rnp->blocked_tasks[0], &rnp->blocked_tasks[2]);
550 list_splice_init(&rnp->blocked_tasks[1], &rnp->blocked_tasks[3]);
551 must_wait = rcu_preempted_readers_exp(rnp);
552 spin_unlock(&rnp->lock);
553 if (!must_wait)
554 rcu_report_exp_rnp(rsp, rnp);
555}
556
557
558
559
560
561
562
563
564void synchronize_rcu_expedited(void)
565{
566 unsigned long flags;
567 struct rcu_node *rnp;
568 struct rcu_state *rsp = &rcu_preempt_state;
569 long snap;
570 int trycount = 0;
571
572 smp_mb();
573 snap = ACCESS_ONCE(sync_rcu_preempt_exp_count) + 1;
574 smp_mb();
575
576
577
578
579
580
581 while (!mutex_trylock(&sync_rcu_preempt_exp_mutex)) {
582 if (trycount++ < 10)
583 udelay(trycount * num_online_cpus());
584 else {
585 synchronize_rcu();
586 return;
587 }
588 if ((ACCESS_ONCE(sync_rcu_preempt_exp_count) - snap) > 0)
589 goto mb_ret;
590 }
591 if ((ACCESS_ONCE(sync_rcu_preempt_exp_count) - snap) > 0)
592 goto unlock_mb_ret;
593
594
595 synchronize_sched_expedited();
596
597 spin_lock_irqsave(&rsp->onofflock, flags);
598
599
600 rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) {
601 spin_lock(&rnp->lock);
602 rnp->expmask = rnp->qsmaskinit;
603 spin_unlock(&rnp->lock);
604 }
605
606
607 rcu_for_each_leaf_node(rsp, rnp)
608 sync_rcu_preempt_exp_init(rsp, rnp);
609 if (NUM_RCU_NODES > 1)
610 sync_rcu_preempt_exp_init(rsp, rcu_get_root(rsp));
611
612 spin_unlock_irqrestore(&rsp->onofflock, flags);
613
614
615 rnp = rcu_get_root(rsp);
616 wait_event(sync_rcu_preempt_exp_wq,
617 sync_rcu_preempt_exp_done(rnp));
618
619
620 smp_mb();
621 ACCESS_ONCE(sync_rcu_preempt_exp_count)++;
622unlock_mb_ret:
623 mutex_unlock(&sync_rcu_preempt_exp_mutex);
624mb_ret:
625 smp_mb();
626}
627EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
628
629
630
631
632
633static int rcu_preempt_pending(int cpu)
634{
635 return __rcu_pending(&rcu_preempt_state,
636 &per_cpu(rcu_preempt_data, cpu));
637}
638
639
640
641
642static int rcu_preempt_needs_cpu(int cpu)
643{
644 return !!per_cpu(rcu_preempt_data, cpu).nxtlist;
645}
646
647
648
649
650void rcu_barrier(void)
651{
652 _rcu_barrier(&rcu_preempt_state, call_rcu);
653}
654EXPORT_SYMBOL_GPL(rcu_barrier);
655
656
657
658
659static void __cpuinit rcu_preempt_init_percpu_data(int cpu)
660{
661 rcu_init_percpu_data(cpu, &rcu_preempt_state, 1);
662}
663
664
665
666
667static void rcu_preempt_send_cbs_to_orphanage(void)
668{
669 rcu_send_cbs_to_orphanage(&rcu_preempt_state);
670}
671
672
673
674
675static void __init __rcu_init_preempt(void)
676{
677 RCU_INIT_FLAVOR(&rcu_preempt_state, rcu_preempt_data);
678}
679
680
681
682
683
684
685
686void exit_rcu(void)
687{
688 struct task_struct *t = current;
689
690 if (t->rcu_read_lock_nesting == 0)
691 return;
692 t->rcu_read_lock_nesting = 1;
693 rcu_read_unlock();
694}
695
696#else
697
698
699
700
701static void __init rcu_bootup_announce(void)
702{
703 printk(KERN_INFO "Hierarchical RCU implementation.\n");
704}
705
706
707
708
709long rcu_batches_completed(void)
710{
711 return rcu_batches_completed_sched();
712}
713EXPORT_SYMBOL_GPL(rcu_batches_completed);
714
715
716
717
718
719static void rcu_preempt_note_context_switch(int cpu)
720{
721}
722
723
724
725
726
727static int rcu_preempted_readers(struct rcu_node *rnp)
728{
729 return 0;
730}
731
732#ifdef CONFIG_HOTPLUG_CPU
733
734
735static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
736{
737 spin_unlock_irqrestore(&rnp->lock, flags);
738}
739
740#endif
741
742#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
743
744
745
746
747
748static void rcu_print_task_stall(struct rcu_node *rnp)
749{
750}
751
752#endif
753
754
755
756
757
758
759static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
760{
761 WARN_ON_ONCE(rnp->qsmask);
762}
763
764#ifdef CONFIG_HOTPLUG_CPU
765
766
767
768
769
770
771
772static int rcu_preempt_offline_tasks(struct rcu_state *rsp,
773 struct rcu_node *rnp,
774 struct rcu_data *rdp)
775{
776 return 0;
777}
778
779
780
781
782
783static void rcu_preempt_offline_cpu(int cpu)
784{
785}
786
787#endif
788
789
790
791
792
793static void rcu_preempt_check_callbacks(int cpu)
794{
795}
796
797
798
799
800
801static void rcu_preempt_process_callbacks(void)
802{
803}
804
805
806
807
808void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
809{
810 call_rcu_sched(head, func);
811}
812EXPORT_SYMBOL_GPL(call_rcu);
813
814
815
816
817
818void synchronize_rcu_expedited(void)
819{
820 synchronize_sched_expedited();
821}
822EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
823
824#ifdef CONFIG_HOTPLUG_CPU
825
826
827
828
829
830
831static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
832{
833 return;
834}
835
836#endif
837
838
839
840
841static int rcu_preempt_pending(int cpu)
842{
843 return 0;
844}
845
846
847
848
849static int rcu_preempt_needs_cpu(int cpu)
850{
851 return 0;
852}
853
854
855
856
857
858void rcu_barrier(void)
859{
860 rcu_barrier_sched();
861}
862EXPORT_SYMBOL_GPL(rcu_barrier);
863
864
865
866
867
868static void __cpuinit rcu_preempt_init_percpu_data(int cpu)
869{
870}
871
872
873
874
875static void rcu_preempt_send_cbs_to_orphanage(void)
876{
877}
878
879
880
881
882static void __init __rcu_init_preempt(void)
883{
884}
885
886#endif
887