diff options
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r-- | kernel/softirq.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 14e1a14f94d2..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 | /* |
@@ -278,9 +279,11 @@ EXPORT_SYMBOL(do_softirq); | |||
278 | */ | 279 | */ |
279 | void irq_enter(void) | 280 | void irq_enter(void) |
280 | { | 281 | { |
281 | account_system_vtime(current); | 282 | __irq_enter(); |
282 | add_preempt_count(HARDIRQ_OFFSET); | 283 | #ifdef CONFIG_NO_HZ |
283 | trace_hardirq_enter(); | 284 | if (idle_cpu(smp_processor_id())) |
285 | tick_nohz_update_jiffies(); | ||
286 | #endif | ||
284 | } | 287 | } |
285 | 288 | ||
286 | #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED | 289 | #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED |
@@ -299,6 +302,12 @@ void irq_exit(void) | |||
299 | sub_preempt_count(IRQ_EXIT_OFFSET); | 302 | sub_preempt_count(IRQ_EXIT_OFFSET); |
300 | if (!in_interrupt() && local_softirq_pending()) | 303 | if (!in_interrupt() && local_softirq_pending()) |
301 | 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 | ||
302 | preempt_enable_no_resched(); | 311 | preempt_enable_no_resched(); |
303 | } | 312 | } |
304 | 313 | ||