aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/time/tick-sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/time/tick-sched.c')
-rw-r--r--kernel/time/tick-sched.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 95e41f7f850b..51556b95f60f 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -21,6 +21,8 @@
21#include <linux/sched.h> 21#include <linux/sched.h>
22#include <linux/tick.h> 22#include <linux/tick.h>
23 23
24#include <asm/irq_regs.h>
25
24#include "tick-internal.h" 26#include "tick-internal.h"
25 27
26/* 28/*
@@ -165,7 +167,9 @@ void tick_nohz_stop_sched_tick(void)
165 goto end; 167 goto end;
166 168
167 cpu = smp_processor_id(); 169 cpu = smp_processor_id();
168 BUG_ON(local_softirq_pending()); 170 if (unlikely(local_softirq_pending()))
171 printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n",
172 local_softirq_pending());
169 173
170 now = ktime_get(); 174 now = ktime_get();
171 /* 175 /*
@@ -191,19 +195,19 @@ void tick_nohz_stop_sched_tick(void)
191 next_jiffies = get_next_timer_interrupt(last_jiffies); 195 next_jiffies = get_next_timer_interrupt(last_jiffies);
192 delta_jiffies = next_jiffies - last_jiffies; 196 delta_jiffies = next_jiffies - last_jiffies;
193 197
198 if (rcu_needs_cpu(cpu))
199 delta_jiffies = 1;
194 /* 200 /*
195 * Do not stop the tick, if we are only one off 201 * Do not stop the tick, if we are only one off
196 * or if the cpu is required for rcu 202 * or if the cpu is required for rcu
197 */ 203 */
198 if (!ts->tick_stopped && (delta_jiffies == 1 || rcu_needs_cpu(cpu))) 204 if (!ts->tick_stopped && delta_jiffies == 1)
199 goto out; 205 goto out;
200 206
201 /* Schedule the tick, if we are at least one jiffie off */ 207 /* Schedule the tick, if we are at least one jiffie off */
202 if ((long)delta_jiffies >= 1) { 208 if ((long)delta_jiffies >= 1) {
203 209
204 if (rcu_needs_cpu(cpu)) 210 if (delta_jiffies > 1)
205 delta_jiffies = 1;
206 else
207 cpu_set(cpu, nohz_cpu_mask); 211 cpu_set(cpu, nohz_cpu_mask);
208 /* 212 /*
209 * nohz_stop_sched_tick can be called several times before 213 * nohz_stop_sched_tick can be called several times before