diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-09-04 06:45:54 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-10-18 16:14:05 -0400 |
commit | a13904d4b6d04278deb6841020dd7dee9867745e (patch) | |
tree | 89cd8206405935c8a6b600a8da3ac042a116a45c | |
parent | 1ae3a8f858a6eb6a75a78fb8f35c98fa870dfb87 (diff) |
Trace IPI-related IRQs with ft_irq_fired()
IPIs have some special cases where irq_enter() is not called. This
caused ft_irq_fired() to "miss" some rescheduling-related interrupts,
which in turn may cause outliers.
This patch makes sure ft_irq_fired() is called on scheduling-related
IPIs.
-rw-r--r-- | arch/x86/kernel/smp.c | 2 | ||||
-rw-r--r-- | kernel/sched.c | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index ed4c4f54e2ae..f5e294040b1c 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
@@ -251,8 +251,10 @@ extern void hrtimer_pull(void); | |||
251 | void smp_pull_timers_interrupt(struct pt_regs *regs) | 251 | void smp_pull_timers_interrupt(struct pt_regs *regs) |
252 | { | 252 | { |
253 | ack_APIC_irq(); | 253 | ack_APIC_irq(); |
254 | irq_enter(); | ||
254 | TRACE("pull timer interrupt\n"); | 255 | TRACE("pull timer interrupt\n"); |
255 | hrtimer_pull(); | 256 | hrtimer_pull(); |
257 | irq_exit(); | ||
256 | } | 258 | } |
257 | 259 | ||
258 | struct smp_ops smp_ops = { | 260 | struct smp_ops smp_ops = { |
diff --git a/kernel/sched.c b/kernel/sched.c index cbb1b5f57117..1d7b38a7ff25 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -2597,8 +2597,12 @@ void scheduler_ipi(void) | |||
2597 | struct rq *rq = this_rq(); | 2597 | struct rq *rq = this_rq(); |
2598 | struct task_struct *list = xchg(&rq->wake_list, NULL); | 2598 | struct task_struct *list = xchg(&rq->wake_list, NULL); |
2599 | 2599 | ||
2600 | if (!list) | 2600 | if (!list) { |
2601 | /* If we don't call irq_enter(), we need to trigger the IRQ | ||
2602 | * tracing manually. */ | ||
2603 | ft_irq_fired(); | ||
2601 | return; | 2604 | return; |
2605 | } | ||
2602 | 2606 | ||
2603 | /* | 2607 | /* |
2604 | * Not all reschedule IPI handlers call irq_enter/irq_exit, since | 2608 | * Not all reschedule IPI handlers call irq_enter/irq_exit, since |