RE: Latency traces I cannot interpret (sa1100, 2.6.15-rc7-rt1)

From: Daniel Walker
Date: Mon Jan 02 2006 - 16:31:57 EST



Here's a more updated patch, the should replace the other patch I sent.
I think the tracing error is the result of a missed interrupt enable in
the ARM assembly code. I've only compile tested this.

Daniel

On Mon, 2006-01-02 at 15:55 +0100, kus Kusche Klaus wrote:
> > From: Daniel Walker
> > Right .. I'm still looking into it. ARM is just missing some vital
> > tracing bits I think .
>
> As I wrote in some earlier mail, I'm probably the first one ever
> who tried it on ARM: When I tried first, tracing didn't work at all,
> because the trace timing macro's were not defined (at least for
> sa1100). I quick-hacked the three missing macros (this caused the
> tracer to produce at least some output) without checking if
> anything else is missing.
>
>
Index: linux-2.6.14/arch/arm/kernel/process.c
===================================================================
--- linux-2.6.14.orig/arch/arm/kernel/process.c
+++ linux-2.6.14/arch/arm/kernel/process.c
@@ -89,12 +89,12 @@ void default_idle(void)
if (hlt_counter)
cpu_relax();
else {
- raw_local_irq_disable();
+ __raw_local_irq_disable();
if (!need_resched()) {
timer_dyn_reprogram();
arch_idle();
}
- raw_local_irq_enable();
+ __raw_local_irq_enable();
}
}

@@ -121,8 +121,10 @@ void cpu_idle(void)
if (!idle)
idle = default_idle;
leds_event(led_idle_start);
+ __preempt_enable_no_resched();
while (!need_resched())
idle();
+ preempt_disable();
leds_event(led_idle_end);
__preempt_enable_no_resched();
__schedule();
Index: linux-2.6.14/arch/arm/kernel/entry-header.S
===================================================================
--- linux-2.6.14.orig/arch/arm/kernel/entry-header.S
+++ linux-2.6.14/arch/arm/kernel/entry-header.S
@@ -38,18 +38,30 @@

#if __LINUX_ARM_ARCH__ >= 6
.macro disable_irq
+#ifdef CONFIG_CRITICAL_IRQSOFF_TIMING
+ b trace_irqs_off
+#endif
cpsid i
.endm

.macro enable_irq
+#ifdef CONFIG_CRITICAL_IRQSOFF_TIMING
+ b trace_irqs_on
+#endif
cpsie i
.endm
#else
.macro disable_irq
+#ifdef CONFIG_CRITICAL_IRQSOFF_TIMING
+ b trace_irqs_off
+#endif
msr cpsr_c, #PSR_I_BIT | SVC_MODE
.endm

.macro enable_irq
+#ifdef CONFIG_CRITICAL_IRQSOFF_TIMING
+ b trace_irqs_on
+#endif
msr cpsr_c, #SVC_MODE
.endm
#endif