diff options
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r-- | kernel/softirq.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 918e52df090e..8b75008e2bd8 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/kthread.h> | 17 | #include <linux/kthread.h> |
18 | #include <linux/rcupdate.h> | 18 | #include <linux/rcupdate.h> |
19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
20 | #include <linux/tick.h> | ||
20 | 21 | ||
21 | #include <asm/irq.h> | 22 | #include <asm/irq.h> |
22 | /* | 23 | /* |
@@ -273,6 +274,18 @@ EXPORT_SYMBOL(do_softirq); | |||
273 | 274 | ||
274 | #endif | 275 | #endif |
275 | 276 | ||
277 | /* | ||
278 | * Enter an interrupt context. | ||
279 | */ | ||
280 | void irq_enter(void) | ||
281 | { | ||
282 | __irq_enter(); | ||
283 | #ifdef CONFIG_NO_HZ | ||
284 | if (idle_cpu(smp_processor_id())) | ||
285 | tick_nohz_update_jiffies(); | ||
286 | #endif | ||
287 | } | ||
288 | |||
276 | #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED | 289 | #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED |
277 | # define invoke_softirq() __do_softirq() | 290 | # define invoke_softirq() __do_softirq() |
278 | #else | 291 | #else |
@@ -289,6 +302,12 @@ void irq_exit(void) | |||
289 | sub_preempt_count(IRQ_EXIT_OFFSET); | 302 | sub_preempt_count(IRQ_EXIT_OFFSET); |
290 | if (!in_interrupt() && local_softirq_pending()) | 303 | if (!in_interrupt() && local_softirq_pending()) |
291 | invoke_softirq(); | 304 | invoke_softirq(); |
305 | |||
306 | #ifdef CONFIG_NO_HZ | ||
307 | /* Make sure that timer wheel updates are propagated */ | ||
308 | if (!in_interrupt() && idle_cpu(smp_processor_id()) && !need_resched()) | ||
309 | tick_nohz_stop_sched_tick(); | ||
310 | #endif | ||
292 | preempt_enable_no_resched(); | 311 | preempt_enable_no_resched(); |
293 | } | 312 | } |
294 | 313 | ||