diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rcutree_plugin.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 9c71c1b18e03..f92115488187 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
@@ -1757,6 +1757,26 @@ static void rcu_prepare_for_idle(int cpu) | |||
1757 | if (!tne) | 1757 | if (!tne) |
1758 | return; | 1758 | return; |
1759 | 1759 | ||
1760 | /* Adaptive-tick mode, where usermode execution is idle to RCU. */ | ||
1761 | if (!is_idle_task(current)) { | ||
1762 | rdtp->dyntick_holdoff = jiffies - 1; | ||
1763 | if (rcu_cpu_has_nonlazy_callbacks(cpu)) { | ||
1764 | trace_rcu_prep_idle("User dyntick with callbacks"); | ||
1765 | rdtp->idle_gp_timer_expires = | ||
1766 | round_up(jiffies + RCU_IDLE_GP_DELAY, | ||
1767 | RCU_IDLE_GP_DELAY); | ||
1768 | } else if (rcu_cpu_has_callbacks(cpu)) { | ||
1769 | rdtp->idle_gp_timer_expires = | ||
1770 | round_jiffies(jiffies + RCU_IDLE_LAZY_GP_DELAY); | ||
1771 | trace_rcu_prep_idle("User dyntick with lazy callbacks"); | ||
1772 | } else { | ||
1773 | return; | ||
1774 | } | ||
1775 | tp = &rdtp->idle_gp_timer; | ||
1776 | mod_timer_pinned(tp, rdtp->idle_gp_timer_expires); | ||
1777 | return; | ||
1778 | } | ||
1779 | |||
1760 | /* | 1780 | /* |
1761 | * If this is an idle re-entry, for example, due to use of | 1781 | * If this is an idle re-entry, for example, due to use of |
1762 | * RCU_NONIDLE() or the new idle-loop tracing API within the idle | 1782 | * RCU_NONIDLE() or the new idle-loop tracing API within the idle |