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#ifdef CONFIG_TREE_PREEMPT_RCU
29
30struct rcu_state rcu_preempt_state = RCU_STATE_INITIALIZER(rcu_preempt_state);
31DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data);
32
33
34
35
36static inline void rcu_bootup_announce(void)
37{
38 printk(KERN_INFO
39 "Experimental preemptable hierarchical RCU implementation.\n");
40}
41
42
43
44
45
46long rcu_batches_completed_preempt(void)
47{
48 return rcu_preempt_state.completed;
49}
50EXPORT_SYMBOL_GPL(rcu_batches_completed_preempt);
51
52
53
54
55long rcu_batches_completed(void)
56{
57 return rcu_batches_completed_preempt();
58}
59EXPORT_SYMBOL_GPL(rcu_batches_completed);
60
61
62
63
64
65
66
67static void rcu_preempt_qs(int cpu)
68{
69 struct rcu_data *rdp = &per_cpu(rcu_preempt_data, cpu);
70 rdp->passed_quiesc_completed = rdp->completed;
71 barrier();
72 rdp->passed_quiesc = 1;
73}
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88static void rcu_preempt_note_context_switch(int cpu)
89{
90 struct task_struct *t = current;
91 unsigned long flags;
92 int phase;
93 struct rcu_data *rdp;
94 struct rcu_node *rnp;
95
96 if (t->rcu_read_lock_nesting &&
97 (t->rcu_read_unlock_special & RCU_READ_UNLOCK_BLOCKED) == 0) {
98
99
100 rdp = rcu_preempt_state.rda[cpu];
101 rnp = rdp->mynode;
102 spin_lock_irqsave(&rnp->lock, flags);
103 t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BLOCKED;
104 t->rcu_blocked_node = rnp;
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 WARN_ON_ONCE((rdp->grpmask & rnp->qsmaskinit) == 0);
120 WARN_ON_ONCE(!list_empty(&t->rcu_node_entry));
121 phase = (rnp->gpnum + !(rnp->qsmask & rdp->grpmask)) & 0x1;
122 list_add(&t->rcu_node_entry, &rnp->blocked_tasks[phase]);
123 spin_unlock_irqrestore(&rnp->lock, flags);
124 }
125
126
127
128
129
130
131
132
133
134
135 rcu_preempt_qs(cpu);
136 local_irq_save(flags);
137 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;
138 local_irq_restore(flags);
139}
140
141
142
143
144
145
146void __rcu_read_lock(void)
147{
148 ACCESS_ONCE(current->rcu_read_lock_nesting)++;
149 barrier();
150}
151EXPORT_SYMBOL_GPL(__rcu_read_lock);
152
153
154
155
156
157
158static int rcu_preempted_readers(struct rcu_node *rnp)
159{
160 return !list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1]);
161}
162
163static void rcu_read_unlock_special(struct task_struct *t)
164{
165 int empty;
166 unsigned long flags;
167 unsigned long mask;
168 struct rcu_node *rnp;
169 int special;
170
171
172 if (in_nmi())
173 return;
174
175 local_irq_save(flags);
176
177
178
179
180
181 special = t->rcu_read_unlock_special;
182 if (special & RCU_READ_UNLOCK_NEED_QS) {
183 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;
184 rcu_preempt_qs(smp_processor_id());
185 }
186
187
188 if (in_irq()) {
189 local_irq_restore(flags);
190 return;
191 }
192
193
194 if (special & RCU_READ_UNLOCK_BLOCKED) {
195 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_BLOCKED;
196
197
198
199
200
201
202 for (;;) {
203 rnp = t->rcu_blocked_node;
204 spin_lock(&rnp->lock);
205 if (rnp == t->rcu_blocked_node)
206 break;
207 spin_unlock(&rnp->lock);
208 }
209 empty = !rcu_preempted_readers(rnp);
210 list_del_init(&t->rcu_node_entry);
211 t->rcu_blocked_node = NULL;
212
213
214
215
216
217
218
219 if (!empty && rnp->qsmask == 0 &&
220 !rcu_preempted_readers(rnp)) {
221 struct rcu_node *rnp_p;
222
223 if (rnp->parent == NULL) {
224
225 cpu_quiet_msk_finish(&rcu_preempt_state, flags);
226 return;
227 }
228
229 mask = rnp->grpmask;
230 spin_unlock_irqrestore(&rnp->lock, flags);
231 rnp_p = rnp->parent;
232 spin_lock_irqsave(&rnp_p->lock, flags);
233 WARN_ON_ONCE(rnp->qsmask);
234 cpu_quiet_msk(mask, &rcu_preempt_state, rnp_p, flags);
235 return;
236 }
237 spin_unlock(&rnp->lock);
238 }
239 local_irq_restore(flags);
240}
241
242
243
244
245
246
247
248
249void __rcu_read_unlock(void)
250{
251 struct task_struct *t = current;
252
253 barrier();
254 if (--ACCESS_ONCE(t->rcu_read_lock_nesting) == 0 &&
255 unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))
256 rcu_read_unlock_special(t);
257}
258EXPORT_SYMBOL_GPL(__rcu_read_unlock);
259
260#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
261
262
263
264
265
266static void rcu_print_task_stall(struct rcu_node *rnp)
267{
268 unsigned long flags;
269 struct list_head *lp;
270 int phase;
271 struct task_struct *t;
272
273 if (rcu_preempted_readers(rnp)) {
274 spin_lock_irqsave(&rnp->lock, flags);
275 phase = rnp->gpnum & 0x1;
276 lp = &rnp->blocked_tasks[phase];
277 list_for_each_entry(t, lp, rcu_node_entry)
278 printk(" P%d", t->pid);
279 spin_unlock_irqrestore(&rnp->lock, flags);
280 }
281}
282
283#endif
284
285
286
287
288
289
290
291
292static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
293{
294 WARN_ON_ONCE(rcu_preempted_readers(rnp));
295 WARN_ON_ONCE(rnp->qsmask);
296}
297
298#ifdef CONFIG_HOTPLUG_CPU
299
300
301
302
303
304
305
306
307
308
309
310
311
312static int rcu_preempt_offline_tasks(struct rcu_state *rsp,
313 struct rcu_node *rnp,
314 struct rcu_data *rdp)
315{
316 int i;
317 struct list_head *lp;
318 struct list_head *lp_root;
319 int retval = rcu_preempted_readers(rnp);
320 struct rcu_node *rnp_root = rcu_get_root(rsp);
321 struct task_struct *tp;
322
323 if (rnp == rnp_root) {
324 WARN_ONCE(1, "Last CPU thought to be offlined?");
325 return 0;
326 }
327 WARN_ON_ONCE(rnp != rdp->mynode &&
328 (!list_empty(&rnp->blocked_tasks[0]) ||
329 !list_empty(&rnp->blocked_tasks[1])));
330
331
332
333
334
335
336
337 for (i = 0; i < 2; i++) {
338 lp = &rnp->blocked_tasks[i];
339 lp_root = &rnp_root->blocked_tasks[i];
340 while (!list_empty(lp)) {
341 tp = list_entry(lp->next, typeof(*tp), rcu_node_entry);
342 spin_lock(&rnp_root->lock);
343 list_del(&tp->rcu_node_entry);
344 tp->rcu_blocked_node = rnp_root;
345 list_add(&tp->rcu_node_entry, lp_root);
346 spin_unlock(&rnp_root->lock);
347 }
348 }
349
350 return retval;
351}
352
353
354
355
356static void rcu_preempt_offline_cpu(int cpu)
357{
358 __rcu_offline_cpu(cpu, &rcu_preempt_state);
359}
360
361#endif
362
363
364
365
366
367
368
369
370static void rcu_preempt_check_callbacks(int cpu)
371{
372 struct task_struct *t = current;
373
374 if (t->rcu_read_lock_nesting == 0) {
375 t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;
376 rcu_preempt_qs(cpu);
377 return;
378 }
379 if (per_cpu(rcu_preempt_data, cpu).qs_pending)
380 t->rcu_read_unlock_special |= RCU_READ_UNLOCK_NEED_QS;
381}
382
383
384
385
386static void rcu_preempt_process_callbacks(void)
387{
388 __rcu_process_callbacks(&rcu_preempt_state,
389 &__get_cpu_var(rcu_preempt_data));
390}
391
392
393
394
395void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
396{
397 __call_rcu(head, func, &rcu_preempt_state);
398}
399EXPORT_SYMBOL_GPL(call_rcu);
400
401
402
403
404
405
406void synchronize_rcu_expedited(void)
407{
408 synchronize_rcu();
409}
410EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
411
412
413
414
415
416static int rcu_preempt_pending(int cpu)
417{
418 return __rcu_pending(&rcu_preempt_state,
419 &per_cpu(rcu_preempt_data, cpu));
420}
421
422
423
424
425static int rcu_preempt_needs_cpu(int cpu)
426{
427 return !!per_cpu(rcu_preempt_data, cpu).nxtlist;
428}
429
430
431
432
433void rcu_barrier(void)
434{
435 _rcu_barrier(&rcu_preempt_state, call_rcu);
436}
437EXPORT_SYMBOL_GPL(rcu_barrier);
438
439
440
441
442static void __cpuinit rcu_preempt_init_percpu_data(int cpu)
443{
444 rcu_init_percpu_data(cpu, &rcu_preempt_state, 1);
445}
446
447
448
449
450static void rcu_preempt_send_cbs_to_orphanage(void)
451{
452 rcu_send_cbs_to_orphanage(&rcu_preempt_state);
453}
454
455
456
457
458static void __init __rcu_init_preempt(void)
459{
460 RCU_INIT_FLAVOR(&rcu_preempt_state, rcu_preempt_data);
461}
462
463
464
465
466
467
468
469void exit_rcu(void)
470{
471 struct task_struct *t = current;
472
473 if (t->rcu_read_lock_nesting == 0)
474 return;
475 t->rcu_read_lock_nesting = 1;
476 rcu_read_unlock();
477}
478
479#else
480
481
482
483
484static inline void rcu_bootup_announce(void)
485{
486 printk(KERN_INFO "Hierarchical RCU implementation.\n");
487}
488
489
490
491
492long rcu_batches_completed(void)
493{
494 return rcu_batches_completed_sched();
495}
496EXPORT_SYMBOL_GPL(rcu_batches_completed);
497
498
499
500
501
502static void rcu_preempt_note_context_switch(int cpu)
503{
504}
505
506
507
508
509
510static int rcu_preempted_readers(struct rcu_node *rnp)
511{
512 return 0;
513}
514
515#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
516
517
518
519
520
521static void rcu_print_task_stall(struct rcu_node *rnp)
522{
523}
524
525#endif
526
527
528
529
530
531
532static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
533{
534 WARN_ON_ONCE(rnp->qsmask);
535}
536
537#ifdef CONFIG_HOTPLUG_CPU
538
539
540
541
542
543
544
545static int rcu_preempt_offline_tasks(struct rcu_state *rsp,
546 struct rcu_node *rnp,
547 struct rcu_data *rdp)
548{
549 return 0;
550}
551
552
553
554
555
556static void rcu_preempt_offline_cpu(int cpu)
557{
558}
559
560#endif
561
562
563
564
565
566static void rcu_preempt_check_callbacks(int cpu)
567{
568}
569
570
571
572
573
574static void rcu_preempt_process_callbacks(void)
575{
576}
577
578
579
580
581void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
582{
583 call_rcu_sched(head, func);
584}
585EXPORT_SYMBOL_GPL(call_rcu);
586
587
588
589
590
591void synchronize_rcu_expedited(void)
592{
593 synchronize_sched_expedited();
594}
595EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
596
597
598
599
600static int rcu_preempt_pending(int cpu)
601{
602 return 0;
603}
604
605
606
607
608static int rcu_preempt_needs_cpu(int cpu)
609{
610 return 0;
611}
612
613
614
615
616
617void rcu_barrier(void)
618{
619 rcu_barrier_sched();
620}
621EXPORT_SYMBOL_GPL(rcu_barrier);
622
623
624
625
626
627static void __cpuinit rcu_preempt_init_percpu_data(int cpu)
628{
629}
630
631
632
633
634static void rcu_preempt_send_cbs_to_orphanage(void)
635{
636}
637
638
639
640
641static void __init __rcu_init_preempt(void)
642{
643}
644
645#endif
646