diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-28 13:13:16 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-28 13:13:16 -0500 |
| commit | 642c4c75a765d7a3244ab39c8e6fb09be21eca5b (patch) | |
| tree | ce0be9b476f362835d3a3d6e4fd32801cd15c9fe /kernel/rcutree_plugin.h | |
| parent | f91b22c35f6b0ae06ec5b67922eca1999c3b6e0a (diff) | |
| parent | 71da81324c83ef65bb196c7f874ac1c6996d8287 (diff) | |
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (44 commits)
rcu: Fix accelerated GPs for last non-dynticked CPU
rcu: Make non-RCU_PROVE_LOCKING rcu_read_lock_sched_held() understand boot
rcu: Fix accelerated grace periods for last non-dynticked CPU
rcu: Export rcu_scheduler_active
rcu: Make rcu_read_lock_sched_held() take boot time into account
rcu: Make lockdep_rcu_dereference() message less alarmist
sched, cgroups: Fix module export
rcu: Add RCU_CPU_STALL_VERBOSE to dump detailed per-task information
rcu: Fix rcutorture mod_timer argument to delay one jiffy
rcu: Fix deadlock in TREE_PREEMPT_RCU CPU stall detection
rcu: Convert to raw_spinlocks
rcu: Stop overflowing signed integers
rcu: Use canonical URL for Mathieu's dissertation
rcu: Accelerate grace period if last non-dynticked CPU
rcu: Fix citation of Mathieu's dissertation
rcu: Documentation update for CONFIG_PROVE_RCU
security: Apply lockdep-based checking to rcu_dereference() uses
idr: Apply lockdep-based diagnostics to rcu_dereference() uses
radix-tree: Disable RCU lockdep checking in radix tree
vfs: Abstract rcu_dereference_check for files-fdtable use
...
Diffstat (limited to 'kernel/rcutree_plugin.h')
| -rw-r--r-- | kernel/rcutree_plugin.h | 229 |
1 files changed, 205 insertions, 24 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 37fbccdf41d5..464ad2cdee00 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
| @@ -62,6 +62,15 @@ long rcu_batches_completed(void) | |||
| 62 | EXPORT_SYMBOL_GPL(rcu_batches_completed); | 62 | EXPORT_SYMBOL_GPL(rcu_batches_completed); |
| 63 | 63 | ||
| 64 | /* | 64 | /* |
| 65 | * Force a quiescent state for preemptible RCU. | ||
| 66 | */ | ||
| 67 | void rcu_force_quiescent_state(void) | ||
| 68 | { | ||
| 69 | force_quiescent_state(&rcu_preempt_state, 0); | ||
| 70 | } | ||
| 71 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); | ||
| 72 | |||
| 73 | /* | ||
| 65 | * Record a preemptable-RCU quiescent state for the specified CPU. Note | 74 | * Record a preemptable-RCU quiescent state for the specified CPU. Note |
| 66 | * that this just means that the task currently running on the CPU is | 75 | * that this just means that the task currently running on the CPU is |
| 67 | * not in a quiescent state. There might be any number of tasks blocked | 76 | * not in a quiescent state. There might be any number of tasks blocked |
| @@ -102,7 +111,7 @@ static void rcu_preempt_note_context_switch(int cpu) | |||
| 102 | /* Possibly blocking in an RCU read-side critical section. */ | 111 | /* Possibly blocking in an RCU read-side critical section. */ |
| 103 | rdp = rcu_preempt_state.rda[cpu]; | 112 | rdp = rcu_preempt_state.rda[cpu]; |
| 104 | rnp = rdp->mynode; | 113 | rnp = rdp->mynode; |
| 105 | spin_lock_irqsave(&rnp->lock, flags); | 114 | raw_spin_lock_irqsave(&rnp->lock, flags); |
| 106 | t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BLOCKED; | 115 | t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BLOCKED; |
| 107 | t->rcu_blocked_node = rnp; | 116 | t->rcu_blocked_node = rnp; |
| 108 | 117 | ||
| @@ -123,7 +132,7 @@ static void rcu_preempt_note_context_switch(int cpu) | |||
| 123 | WARN_ON_ONCE(!list_empty(&t->rcu_node_entry)); | 132 | WARN_ON_ONCE(!list_empty(&t->rcu_node_entry)); |
| 124 | phase = (rnp->gpnum + !(rnp->qsmask & rdp->grpmask)) & 0x1; | 133 | phase = (rnp->gpnum + !(rnp->qsmask & rdp->grpmask)) & 0x1; |
| 125 | list_add(&t->rcu_node_entry, &rnp->blocked_tasks[phase]); | 134 | list_add(&t->rcu_node_entry, &rnp->blocked_tasks[phase]); |
| 126 | spin_unlock_irqrestore(&rnp->lock, flags); | 135 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
| 127 | } | 136 | } |
| 128 | 137 | ||
| 129 | /* | 138 | /* |
| @@ -180,7 +189,7 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | |||
| 180 | struct rcu_node *rnp_p; | 189 | struct rcu_node *rnp_p; |
| 181 | 190 | ||
| 182 | if (rnp->qsmask != 0 || rcu_preempted_readers(rnp)) { | 191 | if (rnp->qsmask != 0 || rcu_preempted_readers(rnp)) { |
| 183 | spin_unlock_irqrestore(&rnp->lock, flags); | 192 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
| 184 | return; /* Still need more quiescent states! */ | 193 | return; /* Still need more quiescent states! */ |
| 185 | } | 194 | } |
| 186 | 195 | ||
| @@ -197,8 +206,8 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | |||
| 197 | 206 | ||
| 198 | /* Report up the rest of the hierarchy. */ | 207 | /* Report up the rest of the hierarchy. */ |
| 199 | mask = rnp->grpmask; | 208 | mask = rnp->grpmask; |
| 200 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 209 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 201 | spin_lock(&rnp_p->lock); /* irqs already disabled. */ | 210 | raw_spin_lock(&rnp_p->lock); /* irqs already disabled. */ |
| 202 | rcu_report_qs_rnp(mask, &rcu_preempt_state, rnp_p, flags); | 211 | rcu_report_qs_rnp(mask, &rcu_preempt_state, rnp_p, flags); |
| 203 | } | 212 | } |
| 204 | 213 | ||
| @@ -248,10 +257,10 @@ static void rcu_read_unlock_special(struct task_struct *t) | |||
| 248 | */ | 257 | */ |
| 249 | for (;;) { | 258 | for (;;) { |
| 250 | rnp = t->rcu_blocked_node; | 259 | rnp = t->rcu_blocked_node; |
| 251 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 260 | raw_spin_lock(&rnp->lock); /* irqs already disabled. */ |
| 252 | if (rnp == t->rcu_blocked_node) | 261 | if (rnp == t->rcu_blocked_node) |
| 253 | break; | 262 | break; |
| 254 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 263 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 255 | } | 264 | } |
| 256 | empty = !rcu_preempted_readers(rnp); | 265 | empty = !rcu_preempted_readers(rnp); |
| 257 | empty_exp = !rcu_preempted_readers_exp(rnp); | 266 | empty_exp = !rcu_preempted_readers_exp(rnp); |
| @@ -265,7 +274,7 @@ static void rcu_read_unlock_special(struct task_struct *t) | |||
| 265 | * Note that rcu_report_unblock_qs_rnp() releases rnp->lock. | 274 | * Note that rcu_report_unblock_qs_rnp() releases rnp->lock. |
| 266 | */ | 275 | */ |
| 267 | if (empty) | 276 | if (empty) |
| 268 | spin_unlock_irqrestore(&rnp->lock, flags); | 277 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
| 269 | else | 278 | else |
| 270 | rcu_report_unblock_qs_rnp(rnp, flags); | 279 | rcu_report_unblock_qs_rnp(rnp, flags); |
| 271 | 280 | ||
| @@ -295,29 +304,73 @@ void __rcu_read_unlock(void) | |||
| 295 | if (--ACCESS_ONCE(t->rcu_read_lock_nesting) == 0 && | 304 | if (--ACCESS_ONCE(t->rcu_read_lock_nesting) == 0 && |
| 296 | unlikely(ACCESS_ONCE(t->rcu_read_unlock_special))) | 305 | unlikely(ACCESS_ONCE(t->rcu_read_unlock_special))) |
| 297 | rcu_read_unlock_special(t); | 306 | rcu_read_unlock_special(t); |
| 307 | #ifdef CONFIG_PROVE_LOCKING | ||
| 308 | WARN_ON_ONCE(ACCESS_ONCE(t->rcu_read_lock_nesting) < 0); | ||
| 309 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ | ||
| 298 | } | 310 | } |
| 299 | EXPORT_SYMBOL_GPL(__rcu_read_unlock); | 311 | EXPORT_SYMBOL_GPL(__rcu_read_unlock); |
| 300 | 312 | ||
| 301 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 313 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
| 302 | 314 | ||
| 315 | #ifdef CONFIG_RCU_CPU_STALL_VERBOSE | ||
| 316 | |||
| 317 | /* | ||
| 318 | * Dump detailed information for all tasks blocking the current RCU | ||
| 319 | * grace period on the specified rcu_node structure. | ||
| 320 | */ | ||
| 321 | static void rcu_print_detail_task_stall_rnp(struct rcu_node *rnp) | ||
| 322 | { | ||
| 323 | unsigned long flags; | ||
| 324 | struct list_head *lp; | ||
| 325 | int phase; | ||
| 326 | struct task_struct *t; | ||
| 327 | |||
| 328 | if (rcu_preempted_readers(rnp)) { | ||
| 329 | raw_spin_lock_irqsave(&rnp->lock, flags); | ||
| 330 | phase = rnp->gpnum & 0x1; | ||
| 331 | lp = &rnp->blocked_tasks[phase]; | ||
| 332 | list_for_each_entry(t, lp, rcu_node_entry) | ||
| 333 | sched_show_task(t); | ||
| 334 | raw_spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 335 | } | ||
| 336 | } | ||
| 337 | |||
| 338 | /* | ||
| 339 | * Dump detailed information for all tasks blocking the current RCU | ||
| 340 | * grace period. | ||
| 341 | */ | ||
| 342 | static void rcu_print_detail_task_stall(struct rcu_state *rsp) | ||
| 343 | { | ||
| 344 | struct rcu_node *rnp = rcu_get_root(rsp); | ||
| 345 | |||
| 346 | rcu_print_detail_task_stall_rnp(rnp); | ||
| 347 | rcu_for_each_leaf_node(rsp, rnp) | ||
| 348 | rcu_print_detail_task_stall_rnp(rnp); | ||
| 349 | } | ||
| 350 | |||
| 351 | #else /* #ifdef CONFIG_RCU_CPU_STALL_VERBOSE */ | ||
| 352 | |||
| 353 | static void rcu_print_detail_task_stall(struct rcu_state *rsp) | ||
| 354 | { | ||
| 355 | } | ||
| 356 | |||
| 357 | #endif /* #else #ifdef CONFIG_RCU_CPU_STALL_VERBOSE */ | ||
| 358 | |||
| 303 | /* | 359 | /* |
| 304 | * Scan the current list of tasks blocked within RCU read-side critical | 360 | * Scan the current list of tasks blocked within RCU read-side critical |
| 305 | * sections, printing out the tid of each. | 361 | * sections, printing out the tid of each. |
| 306 | */ | 362 | */ |
| 307 | static void rcu_print_task_stall(struct rcu_node *rnp) | 363 | static void rcu_print_task_stall(struct rcu_node *rnp) |
| 308 | { | 364 | { |
| 309 | unsigned long flags; | ||
| 310 | struct list_head *lp; | 365 | struct list_head *lp; |
| 311 | int phase; | 366 | int phase; |
| 312 | struct task_struct *t; | 367 | struct task_struct *t; |
| 313 | 368 | ||
| 314 | if (rcu_preempted_readers(rnp)) { | 369 | if (rcu_preempted_readers(rnp)) { |
| 315 | spin_lock_irqsave(&rnp->lock, flags); | ||
| 316 | phase = rnp->gpnum & 0x1; | 370 | phase = rnp->gpnum & 0x1; |
| 317 | lp = &rnp->blocked_tasks[phase]; | 371 | lp = &rnp->blocked_tasks[phase]; |
| 318 | list_for_each_entry(t, lp, rcu_node_entry) | 372 | list_for_each_entry(t, lp, rcu_node_entry) |
| 319 | printk(" P%d", t->pid); | 373 | printk(" P%d", t->pid); |
| 320 | spin_unlock_irqrestore(&rnp->lock, flags); | ||
| 321 | } | 374 | } |
| 322 | } | 375 | } |
| 323 | 376 | ||
| @@ -388,11 +441,11 @@ static int rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
| 388 | lp_root = &rnp_root->blocked_tasks[i]; | 441 | lp_root = &rnp_root->blocked_tasks[i]; |
| 389 | while (!list_empty(lp)) { | 442 | while (!list_empty(lp)) { |
| 390 | tp = list_entry(lp->next, typeof(*tp), rcu_node_entry); | 443 | tp = list_entry(lp->next, typeof(*tp), rcu_node_entry); |
| 391 | spin_lock(&rnp_root->lock); /* irqs already disabled */ | 444 | raw_spin_lock(&rnp_root->lock); /* irqs already disabled */ |
| 392 | list_del(&tp->rcu_node_entry); | 445 | list_del(&tp->rcu_node_entry); |
| 393 | tp->rcu_blocked_node = rnp_root; | 446 | tp->rcu_blocked_node = rnp_root; |
| 394 | list_add(&tp->rcu_node_entry, lp_root); | 447 | list_add(&tp->rcu_node_entry, lp_root); |
| 395 | spin_unlock(&rnp_root->lock); /* irqs remain disabled */ | 448 | raw_spin_unlock(&rnp_root->lock); /* irqs remain disabled */ |
| 396 | } | 449 | } |
| 397 | } | 450 | } |
| 398 | return retval; | 451 | return retval; |
| @@ -516,7 +569,7 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp) | |||
| 516 | unsigned long flags; | 569 | unsigned long flags; |
| 517 | unsigned long mask; | 570 | unsigned long mask; |
| 518 | 571 | ||
| 519 | spin_lock_irqsave(&rnp->lock, flags); | 572 | raw_spin_lock_irqsave(&rnp->lock, flags); |
| 520 | for (;;) { | 573 | for (;;) { |
| 521 | if (!sync_rcu_preempt_exp_done(rnp)) | 574 | if (!sync_rcu_preempt_exp_done(rnp)) |
| 522 | break; | 575 | break; |
| @@ -525,12 +578,12 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp) | |||
| 525 | break; | 578 | break; |
| 526 | } | 579 | } |
| 527 | mask = rnp->grpmask; | 580 | mask = rnp->grpmask; |
| 528 | spin_unlock(&rnp->lock); /* irqs remain disabled */ | 581 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled */ |
| 529 | rnp = rnp->parent; | 582 | rnp = rnp->parent; |
| 530 | spin_lock(&rnp->lock); /* irqs already disabled */ | 583 | raw_spin_lock(&rnp->lock); /* irqs already disabled */ |
| 531 | rnp->expmask &= ~mask; | 584 | rnp->expmask &= ~mask; |
| 532 | } | 585 | } |
| 533 | spin_unlock_irqrestore(&rnp->lock, flags); | 586 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
| 534 | } | 587 | } |
| 535 | 588 | ||
| 536 | /* | 589 | /* |
| @@ -545,11 +598,11 @@ sync_rcu_preempt_exp_init(struct rcu_state *rsp, struct rcu_node *rnp) | |||
| 545 | { | 598 | { |
| 546 | int must_wait; | 599 | int must_wait; |
| 547 | 600 | ||
| 548 | spin_lock(&rnp->lock); /* irqs already disabled */ | 601 | raw_spin_lock(&rnp->lock); /* irqs already disabled */ |
| 549 | list_splice_init(&rnp->blocked_tasks[0], &rnp->blocked_tasks[2]); | 602 | list_splice_init(&rnp->blocked_tasks[0], &rnp->blocked_tasks[2]); |
| 550 | list_splice_init(&rnp->blocked_tasks[1], &rnp->blocked_tasks[3]); | 603 | list_splice_init(&rnp->blocked_tasks[1], &rnp->blocked_tasks[3]); |
| 551 | must_wait = rcu_preempted_readers_exp(rnp); | 604 | must_wait = rcu_preempted_readers_exp(rnp); |
| 552 | spin_unlock(&rnp->lock); /* irqs remain disabled */ | 605 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled */ |
| 553 | if (!must_wait) | 606 | if (!must_wait) |
| 554 | rcu_report_exp_rnp(rsp, rnp); | 607 | rcu_report_exp_rnp(rsp, rnp); |
| 555 | } | 608 | } |
| @@ -594,13 +647,13 @@ void synchronize_rcu_expedited(void) | |||
| 594 | /* force all RCU readers onto blocked_tasks[]. */ | 647 | /* force all RCU readers onto blocked_tasks[]. */ |
| 595 | synchronize_sched_expedited(); | 648 | synchronize_sched_expedited(); |
| 596 | 649 | ||
| 597 | spin_lock_irqsave(&rsp->onofflock, flags); | 650 | raw_spin_lock_irqsave(&rsp->onofflock, flags); |
| 598 | 651 | ||
| 599 | /* Initialize ->expmask for all non-leaf rcu_node structures. */ | 652 | /* Initialize ->expmask for all non-leaf rcu_node structures. */ |
| 600 | rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) { | 653 | rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) { |
| 601 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 654 | raw_spin_lock(&rnp->lock); /* irqs already disabled. */ |
| 602 | rnp->expmask = rnp->qsmaskinit; | 655 | rnp->expmask = rnp->qsmaskinit; |
| 603 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 656 | raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 604 | } | 657 | } |
| 605 | 658 | ||
| 606 | /* Snapshot current state of ->blocked_tasks[] lists. */ | 659 | /* Snapshot current state of ->blocked_tasks[] lists. */ |
| @@ -609,7 +662,7 @@ void synchronize_rcu_expedited(void) | |||
| 609 | if (NUM_RCU_NODES > 1) | 662 | if (NUM_RCU_NODES > 1) |
| 610 | sync_rcu_preempt_exp_init(rsp, rcu_get_root(rsp)); | 663 | sync_rcu_preempt_exp_init(rsp, rcu_get_root(rsp)); |
| 611 | 664 | ||
| 612 | spin_unlock_irqrestore(&rsp->onofflock, flags); | 665 | raw_spin_unlock_irqrestore(&rsp->onofflock, flags); |
| 613 | 666 | ||
| 614 | /* Wait for snapshotted ->blocked_tasks[] lists to drain. */ | 667 | /* Wait for snapshotted ->blocked_tasks[] lists to drain. */ |
| 615 | rnp = rcu_get_root(rsp); | 668 | rnp = rcu_get_root(rsp); |
| @@ -713,6 +766,16 @@ long rcu_batches_completed(void) | |||
| 713 | EXPORT_SYMBOL_GPL(rcu_batches_completed); | 766 | EXPORT_SYMBOL_GPL(rcu_batches_completed); |
| 714 | 767 | ||
| 715 | /* | 768 | /* |
| 769 | * Force a quiescent state for RCU, which, because there is no preemptible | ||
| 770 | * RCU, becomes the same as rcu-sched. | ||
| 771 | */ | ||
| 772 | void rcu_force_quiescent_state(void) | ||
| 773 | { | ||
| 774 | rcu_sched_force_quiescent_state(); | ||
| 775 | } | ||
| 776 | EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); | ||
| 777 | |||
| 778 | /* | ||
| 716 | * Because preemptable RCU does not exist, we never have to check for | 779 | * Because preemptable RCU does not exist, we never have to check for |
| 717 | * CPUs being in quiescent states. | 780 | * CPUs being in quiescent states. |
| 718 | */ | 781 | */ |
| @@ -734,7 +797,7 @@ static int rcu_preempted_readers(struct rcu_node *rnp) | |||
| 734 | /* Because preemptible RCU does not exist, no quieting of tasks. */ | 797 | /* Because preemptible RCU does not exist, no quieting of tasks. */ |
| 735 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | 798 | static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) |
| 736 | { | 799 | { |
| 737 | spin_unlock_irqrestore(&rnp->lock, flags); | 800 | raw_spin_unlock_irqrestore(&rnp->lock, flags); |
| 738 | } | 801 | } |
| 739 | 802 | ||
| 740 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | 803 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ |
| @@ -745,6 +808,14 @@ static void rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags) | |||
| 745 | * Because preemptable RCU does not exist, we never have to check for | 808 | * Because preemptable RCU does not exist, we never have to check for |
| 746 | * tasks blocked within RCU read-side critical sections. | 809 | * tasks blocked within RCU read-side critical sections. |
| 747 | */ | 810 | */ |
| 811 | static void rcu_print_detail_task_stall(struct rcu_state *rsp) | ||
| 812 | { | ||
| 813 | } | ||
| 814 | |||
| 815 | /* | ||
| 816 | * Because preemptable RCU does not exist, we never have to check for | ||
| 817 | * tasks blocked within RCU read-side critical sections. | ||
| 818 | */ | ||
| 748 | static void rcu_print_task_stall(struct rcu_node *rnp) | 819 | static void rcu_print_task_stall(struct rcu_node *rnp) |
| 749 | { | 820 | { |
| 750 | } | 821 | } |
| @@ -884,3 +955,113 @@ static void __init __rcu_init_preempt(void) | |||
| 884 | } | 955 | } |
| 885 | 956 | ||
| 886 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ | 957 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 958 | |||
| 959 | #if !defined(CONFIG_RCU_FAST_NO_HZ) | ||
| 960 | |||
| 961 | /* | ||
| 962 | * Check to see if any future RCU-related work will need to be done | ||
| 963 | * by the current CPU, even if none need be done immediately, returning | ||
| 964 | * 1 if so. This function is part of the RCU implementation; it is -not- | ||
| 965 | * an exported member of the RCU API. | ||
| 966 | * | ||
| 967 | * Because we have preemptible RCU, just check whether this CPU needs | ||
| 968 | * any flavor of RCU. Do not chew up lots of CPU cycles with preemption | ||
| 969 | * disabled in a most-likely vain attempt to cause RCU not to need this CPU. | ||
| 970 | */ | ||
| 971 | int rcu_needs_cpu(int cpu) | ||
| 972 | { | ||
| 973 | return rcu_needs_cpu_quick_check(cpu); | ||
| 974 | } | ||
| 975 | |||
| 976 | /* | ||
| 977 | * Check to see if we need to continue a callback-flush operations to | ||
| 978 | * allow the last CPU to enter dyntick-idle mode. But fast dyntick-idle | ||
| 979 | * entry is not configured, so we never do need to. | ||
| 980 | */ | ||
| 981 | static void rcu_needs_cpu_flush(void) | ||
| 982 | { | ||
| 983 | } | ||
| 984 | |||
| 985 | #else /* #if !defined(CONFIG_RCU_FAST_NO_HZ) */ | ||
| 986 | |||
| 987 | #define RCU_NEEDS_CPU_FLUSHES 5 | ||
| 988 | static DEFINE_PER_CPU(int, rcu_dyntick_drain); | ||
| 989 | static DEFINE_PER_CPU(unsigned long, rcu_dyntick_holdoff); | ||
| 990 | |||
| 991 | /* | ||
| 992 | * Check to see if any future RCU-related work will need to be done | ||
| 993 | * by the current CPU, even if none need be done immediately, returning | ||
| 994 | * 1 if so. This function is part of the RCU implementation; it is -not- | ||
| 995 | * an exported member of the RCU API. | ||
| 996 | * | ||
| 997 | * Because we are not supporting preemptible RCU, attempt to accelerate | ||
| 998 | * any current grace periods so that RCU no longer needs this CPU, but | ||
| 999 | * only if all other CPUs are already in dynticks-idle mode. This will | ||
| 1000 | * allow the CPU cores to be powered down immediately, as opposed to after | ||
| 1001 | * waiting many milliseconds for grace periods to elapse. | ||
| 1002 | * | ||
| 1003 | * Because it is not legal to invoke rcu_process_callbacks() with irqs | ||
| 1004 | * disabled, we do one pass of force_quiescent_state(), then do a | ||
| 1005 | * raise_softirq() to cause rcu_process_callbacks() to be invoked later. | ||
| 1006 | * The per-cpu rcu_dyntick_drain variable controls the sequencing. | ||
| 1007 | */ | ||
| 1008 | int rcu_needs_cpu(int cpu) | ||
| 1009 | { | ||
| 1010 | int c = 0; | ||
| 1011 | int thatcpu; | ||
| 1012 | |||
| 1013 | /* Don't bother unless we are the last non-dyntick-idle CPU. */ | ||
| 1014 | for_each_cpu_not(thatcpu, nohz_cpu_mask) | ||
| 1015 | if (thatcpu != cpu) { | ||
| 1016 | per_cpu(rcu_dyntick_drain, cpu) = 0; | ||
| 1017 | per_cpu(rcu_dyntick_holdoff, cpu) = jiffies - 1; | ||
| 1018 | return rcu_needs_cpu_quick_check(cpu); | ||
| 1019 | } | ||
| 1020 | |||
| 1021 | /* Check and update the rcu_dyntick_drain sequencing. */ | ||
| 1022 | if (per_cpu(rcu_dyntick_drain, cpu) <= 0) { | ||
| 1023 | /* First time through, initialize the counter. */ | ||
| 1024 | per_cpu(rcu_dyntick_drain, cpu) = RCU_NEEDS_CPU_FLUSHES; | ||
| 1025 | } else if (--per_cpu(rcu_dyntick_drain, cpu) <= 0) { | ||
| 1026 | /* We have hit the limit, so time to give up. */ | ||
| 1027 | per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; | ||
| 1028 | return rcu_needs_cpu_quick_check(cpu); | ||
| 1029 | } | ||
| 1030 | |||
| 1031 | /* Do one step pushing remaining RCU callbacks through. */ | ||
| 1032 | if (per_cpu(rcu_sched_data, cpu).nxtlist) { | ||
| 1033 | rcu_sched_qs(cpu); | ||
| 1034 | force_quiescent_state(&rcu_sched_state, 0); | ||
| 1035 | c = c || per_cpu(rcu_sched_data, cpu).nxtlist; | ||
| 1036 | } | ||
| 1037 | if (per_cpu(rcu_bh_data, cpu).nxtlist) { | ||
| 1038 | rcu_bh_qs(cpu); | ||
| 1039 | force_quiescent_state(&rcu_bh_state, 0); | ||
| 1040 | c = c || per_cpu(rcu_bh_data, cpu).nxtlist; | ||
| 1041 | } | ||
| 1042 | |||
| 1043 | /* If RCU callbacks are still pending, RCU still needs this CPU. */ | ||
| 1044 | if (c) { | ||
| 1045 | raise_softirq(RCU_SOFTIRQ); | ||
| 1046 | per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; | ||
| 1047 | } | ||
| 1048 | return c; | ||
| 1049 | } | ||
| 1050 | |||
| 1051 | /* | ||
| 1052 | * Check to see if we need to continue a callback-flush operations to | ||
| 1053 | * allow the last CPU to enter dyntick-idle mode. | ||
| 1054 | */ | ||
| 1055 | static void rcu_needs_cpu_flush(void) | ||
| 1056 | { | ||
| 1057 | int cpu = smp_processor_id(); | ||
| 1058 | unsigned long flags; | ||
| 1059 | |||
| 1060 | if (per_cpu(rcu_dyntick_drain, cpu) <= 0) | ||
| 1061 | return; | ||
| 1062 | local_irq_save(flags); | ||
| 1063 | (void)rcu_needs_cpu(cpu); | ||
| 1064 | local_irq_restore(flags); | ||
| 1065 | } | ||
| 1066 | |||
| 1067 | #endif /* #else #if !defined(CONFIG_RCU_FAST_NO_HZ) */ | ||
