aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2012-09-04 06:45:54 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2012-10-18 16:14:05 -0400
commita13904d4b6d04278deb6841020dd7dee9867745e (patch)
tree89cd8206405935c8a6b600a8da3ac042a116a45c
parent1ae3a8f858a6eb6a75a78fb8f35c98fa870dfb87 (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.c2
-rw-r--r--kernel/sched.c6
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);
251void smp_pull_timers_interrupt(struct pt_regs *regs) 251void 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
258struct smp_ops smp_ops = { 260struct 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