All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai] Interpreting I-pipe trace
@ 2012-09-11  5:01 Doug Brunner
  2012-09-11  7:44 ` Gilles Chanteperdrix
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Doug Brunner @ 2012-09-11  5:01 UTC (permalink / raw)
  To: xenomai

While running my latency testing earlier I saw some rather high 
worst-case latencies (~70us) compared to average case (~14us), so I ran 
again with I-pipe tracing enabled. However, I'm not sure what to make of 
the results.

My worst case involves an IRQ (common_interrupt appears in the trace 
with user value 0xFFFFFFC4) and the wiki page talks about being able to 
translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on 
how this correspondence works. I'm not horribly concerned since it's a 
delay of 53 us on a rather slow processor (Geode LX800) but it would be 
nice to know what interrupt is taking so long.

The trace is attached.

Thanks,

-- 
     Doug Brunner

-------------- next part --------------
I-pipe frozen back-tracing service on 3.2.21rtipc-ipipe-small-5-ipd/ipipe release #1
------------------------------------------------------------
CPU: 0, Freeze: 684744353683 cycles, Trace Points: 100 (+10)
Calibrated minimum trace-point overhead: 0.446 us

 +----- Hard IRQs ('|': locked)
 |+-- Xenomai
 ||+- Linux ('*': domain stalled, '+': current, '#': current+stalled)
 |||                          +---------- Delay flag ('+': > 1 us, '!': > 10 us)
 |||                          |        +- NMI noise ('N')
 |||                          |        |
      Type    User Val.   Time    Delay  Function (Parent)
:|  + begin   0x80000001  -138+   1.922  __ipipe_syscall_root+0x95 (sysenter_past_esp+0x55)
:   + func                -136    0.706  __ipipe_syscall_root+0x9 (sysenter_past_esp+0x55)
:   + func                -135    0.612  __ipipe_notify_syscall+0x9 (__ipipe_syscall_root+0x2e)
:|  + begin   0x80000001  -135    0.526  __ipipe_notify_syscall+0x127 (__ipipe_syscall_root+0x2e)
:|  + end     0x80000001  -134    0.702  __ipipe_notify_syscall+0xc9 (__ipipe_syscall_root+0x2e)
:   + func                -134    0.698  ipipe_syscall_hook+0x4 (__ipipe_notify_syscall+0x49)
:   + func                -133    0.914  hisyscall_event+0x9 (ipipe_syscall_hook+0x24)
:   + func                -132    0.520  __rt_task_wait_period+0x8 (hisyscall_event+0x16a)
:   + func                -132    0.634  rt_task_wait_period+0x3 (__rt_task_wait_period+0x17)
:   + func                -131    0.594  xnpod_wait_thread_period+0x8 (rt_task_wait_period+0x37)
:|  + begin   0x80000000  -130    0.902  xnpod_wait_thread_period+0xec (rt_task_wait_period+0x37)
:|  # func                -129    0.732  xnpod_suspend_thread+0x9 (xnpod_wait_thread_period+0x86)
:|  # func                -129    0.676  __xnpod_schedule+0x9 (xnpod_suspend_thread+0x22e)
:|  # [ 1588] samplin 99  -128    0.628  __xnpod_schedule+0x6b (xnpod_suspend_thread+0x22e)
:|  # func                -127+   1.534  xnsched_pick_next+0x6 (__xnpod_schedule+0xcc)
:|  # [    0] -<?>-   -1  -126    0.872  __xnpod_schedule+0x356 (xnintr_clock_handler+0xeb)
:|   +func                -125    0.744  __ipipe_do_sync_pipeline+0x4 (__ipipe_dispatch_irq_fast+0x79)
:|   +end     0xffffffcf  -124    0.870  common_interrupt+0x40 (__ipipe_halt_root+0x2d)
:    +func                -123    0.582  local_touch_nmi+0x3 (cpu_idle+0x35)
:    #func                -123    0.608  cpuidle_idle_call+0x9 (cpu_idle+0x42)
:    #func                -122    0.692  cpuidle_get_driver+0x3 (cpuidle_idle_call+0x19)
:    #func                -121    0.642  default_idle+0x8 (cpu_idle+0x4c)
:    #func                -121    0.562  __ipipe_halt_root+0x3 (default_idle+0x55)
:|   #begin   0x80000000  -120    0.738  __ipipe_halt_root+0x3a (default_idle+0x55)
:|   +end     0x8000000e  -120!  53.132  __ipipe_halt_root+0x2b (default_idle+0x55)
:|   +begin   0xffffffcf   -66    0.838  common_interrupt+0x2f (__ipipe_halt_root+0x2d)
:|   +func                 -66    0.574  __ipipe_handle_irq+0x5 (common_interrupt+0x36)
:|   +func                 -65    0.486  __ipipe_dispatch_irq+0x9 (__ipipe_handle_irq+0x31)
:|   +func                 -64    0.622  irq_to_desc+0x3 (__ipipe_dispatch_irq+0x10d)
:|   +func                 -64    0.662  irq_to_desc+0x3 (__ipipe_dispatch_irq+0x118)
:|   +func                 -63    0.518  __ipipe_ack_hrtimer_irq+0x6 (__ipipe_dispatch_irq+0x56)
:|   +func                 -63    0.508  __ipipe_ack_level_irq+0x7 (__ipipe_ack_hrtimer_irq+0x1c)
:|   +func                 -62    0.494  mask_and_ack_8259A+0x8 (__ipipe_ack_level_irq+0x1d)
:|   +func                 -62+   1.828  __ipipe_spin_lock_irqsave+0x6 (mask_and_ack_8259A+0x23)
:|   #func                 -60    0.734  __ipipe_spin_unlock_irqrestore+0x6 (mask_and_ack_8259A+0xcf)
:|   +func                 -59    0.490  __ipipe_end_level_irq+0x3 (__ipipe_ack_hrtimer_irq+0x30)
:|   +func                 -59    0.494  enable_8259A_irq+0x3 (__ipipe_end_level_irq+0x10)
:|   +func                 -58    0.496  unmask_8259A_irq+0x7 (enable_8259A_irq+0xf)
:|   +func                 -58    0.554  __ipipe_spin_lock_irqsave+0x6 (unmask_8259A_irq+0x22)
:|   #func                 -57    0.716  __ipipe_spin_unlock_irqrestore+0x6 (unmask_8259A_irq+0x63)
:|   +func                 -56    0.686  irq_to_desc+0x3 (__ipipe_dispatch_irq+0x61)
:|   +func                 -56    0.542  __ipipe_dispatch_irq_fast+0x9 (__ipipe_dispatch_irq+0xa0)
:|  # func                 -55    0.794  xnintr_clock_handler+0x4 (__ipipe_dispatch_irq_fast+0x5f)
:|  # func                 -54    0.880  xntimer_tick_aperiodic+0x9 (xnintr_clock_handler+0x61)
:|  # func                 -53    0.632  xnthread_periodic_handler+0x3 (xntimer_tick_aperiodic+0x21e)
:|  # func                 -53    0.654  xnpod_resume_thread+0x9 (xnthread_periodic_handler+0x22)
:|  # [ 1588] samplin 99   -52+   1.132  xnpod_resume_thread+0x4f (xnthread_periodic_handler+0x22)
:|  # func                 -51    0.622  xntimer_next_local_shot+0x9 (xntimer_tick_aperiodic+0x63)
:|  # event   tick@-44     -50    0.732  xntimer_next_local_shot+0x7d (xntimer_tick_aperiodic+0x63)
:|  # func                 -50    0.664  ipipe_timer_set+0x4 (xntimer_next_local_shot+0xb2)
:|  # func                 -49+   3.302  pit_next_event+0x3 (ipipe_timer_set+0x1a)
:|  # func                 -46    0.584  __xnpod_schedule+0x9 (xnintr_clock_handler+0xeb)
:|  # [    0] -<?>-   -1   -45    0.638  __xnpod_schedule+0x6b (xnintr_clock_handler+0xeb)
:|  # func                 -45+   1.826  xnsched_pick_next+0x6 (__xnpod_schedule+0xcc)
:|  # [ 1588] samplin 99   -43+   1.028  __xnpod_schedule+0x356 (xnpod_suspend_thread+0x22e)
:|  # func                 -42    0.670  xntimer_get_overruns+0x9 (xnpod_wait_thread_period+0xac)
:|  # func                 -41    0.604  __ipipe_restore_head+0x6 (xnpod_wait_thread_period+0xd8)
:|  + end     0x80000000   -40    0.980  __ipipe_restore_head+0x4b (xnpod_wait_thread_period+0xd8)
:|  + begin   0x80000001   -39    0.932  __ipipe_notify_syscall+0xdc (__ipipe_syscall_root+0x2e)
:|  + end     0x80000001   -38+   2.364  __ipipe_notify_syscall+0xf8 (__ipipe_syscall_root+0x2e)
:|  + begin   0xffffffcf   -36    0.784  common_interrupt+0x2f (__ipipe_notify_syscall+0xff)
:|  + func                 -35    0.688  __ipipe_handle_irq+0x5 (common_interrupt+0x36)
:|  + func                 -35    0.600  __ipipe_dispatch_irq+0x9 (__ipipe_handle_irq+0x31)
:|  + func                 -34    0.638  irq_to_desc+0x3 (__ipipe_dispatch_irq+0x10d)
:|  + func                 -33    0.764  irq_to_desc+0x3 (__ipipe_dispatch_irq+0x118)
:|  + func                 -33    0.634  __ipipe_ack_hrtimer_irq+0x6 (__ipipe_dispatch_irq+0x56)
:|  + func                 -32    0.616  __ipipe_ack_level_irq+0x7 (__ipipe_ack_hrtimer_irq+0x1c)
:|  + func                 -31    0.516  mask_and_ack_8259A+0x8 (__ipipe_ack_level_irq+0x1d)
:|  + func                 -31+   1.944  __ipipe_spin_lock_irqsave+0x6 (mask_and_ack_8259A+0x23)
:|  # func                 -29    0.774  __ipipe_spin_unlock_irqrestore+0x6 (mask_and_ack_8259A+0xcf)
:|  + func                 -28    0.626  __ipipe_end_level_irq+0x3 (__ipipe_ack_hrtimer_irq+0x30)
:|  + func                 -28    0.510  enable_8259A_irq+0x3 (__ipipe_end_level_irq+0x10)
:|  + func                 -27    0.596  unmask_8259A_irq+0x7 (enable_8259A_irq+0xf)
:|  + func                 -26    0.658  __ipipe_spin_lock_irqsave+0x6 (unmask_8259A_irq+0x22)
:|  # func                 -26    0.754  __ipipe_spin_unlock_irqrestore+0x6 (unmask_8259A_irq+0x63)
:|  + func                 -25    0.700  irq_to_desc+0x3 (__ipipe_dispatch_irq+0x61)
:|  + func                 -24    0.646  __ipipe_dispatch_irq_fast+0x9 (__ipipe_dispatch_irq+0xa0)
:|  # func                 -24    0.802  xnintr_clock_handler+0x4 (__ipipe_dispatch_irq_fast+0x5f)
:|  # func                 -23+   1.130  xntimer_tick_aperiodic+0x9 (xnintr_clock_handler+0x61)
:|  # func                 -22+   1.102  xnsched_watchdog_handler+0x7 (xntimer_tick_aperiodic+0x21e)
:|  # func                 -21    0.718  xntimer_next_local_shot+0x9 (xntimer_tick_aperiodic+0x63)
:|  # event   tick@24      -20    0.746  xntimer_next_local_shot+0x7d (xntimer_tick_aperiodic+0x63)
:|  # func                 -19    0.658  ipipe_timer_set+0x4 (xntimer_next_local_shot+0xb2)
:|  # func                 -18+   3.530  pit_next_event+0x3 (ipipe_timer_set+0x1a)
:|  + end     0xffffffcf   -15    0.872  common_interrupt+0x40 (__ipipe_notify_syscall+0xff)
:|  + begin   0x80000001   -14+   3.120  __ipipe_syscall_root+0x95 (sysenter_past_esp+0x55)
:   + func                 -11    0.736  __ipipe_syscall_root+0x9 (sysenter_past_esp+0x55)
:   + func                 -10    0.498  __ipipe_notify_syscall+0x9 (__ipipe_syscall_root+0x2e)
:|  + begin   0x80000001   -10    0.618  __ipipe_notify_syscall+0x127 (__ipipe_syscall_root+0x2e)
:|  + end     0x80000001    -9    0.706  __ipipe_notify_syscall+0xc9 (__ipipe_syscall_root+0x2e)
:   + func                  -8    0.748  ipipe_syscall_hook+0x4 (__ipipe_notify_syscall+0x49)
:   + func                  -8+   1.210  hisyscall_event+0x9 (ipipe_syscall_hook+0x24)
:   + func                  -6+   1.296  xnshadow_sys_trace+0x6 (hisyscall_event+0x16a)
:   + func                  -5    0.706  ipipe_trace_frozen_reset+0x4 (xnshadow_sys_trace+0xcb)
:   + func                  -4    0.614  __ipipe_global_path_lock+0x7 (ipipe_trace_frozen_reset+0xe)
:   + func                  -4    0.512  __ipipe_spin_lock_irqsave+0x6 (__ipipe_global_path_lock+0x16)
:|  + begin   0x80000001    -3+   2.214  __ipipe_spin_lock_irqsave+0x47 (__ipipe_global_path_lock+0x16)
:|  # func                  -1    0.698  __ipipe_spin_unlock_irqcomplete+0x6 (__ipipe_global_path_unlock+0x61)
:|  + end     0x80000001     0    0.920  __ipipe_spin_unlock_irqcomplete+0x36 (__ipipe_global_path_unlock+0x61)
<   + freeze  0x0000d5ef     0    0.812  xnshadow_sys_trace+0xbf (hisyscall_event+0x16a)
 |  + begin   0x80000001     0    0.738  __ipipe_notify_syscall+0xdc (__ipipe_syscall_root+0x2e)
 |  + end     0x80000001     1    0.702  __ipipe_notify_syscall+0xf8 (__ipipe_syscall_root+0x2e)
 |  + begin   0x80000001     2    1.514  __ipipe_syscall_root+0x95 (sysenter_past_esp+0x55)
    + func                   3    0.638  __ipipe_syscall_root+0x9 (sysenter_past_esp+0x55)
    + func                   4    0.512  __ipipe_notify_syscall+0x9 (__ipipe_syscall_root+0x2e)
 |  + begin   0x80000001     4    0.658  __ipipe_notify_syscall+0x127 (__ipipe_syscall_root+0x2e)
 |  + end     0x80000001     5    0.686  __ipipe_notify_syscall+0xc9 (__ipipe_syscall_root+0x2e)
    + func                   6    0.580  ipipe_syscall_hook+0x4 (__ipipe_notify_syscall+0x49)
    + func                   6    0.902  hisyscall_event+0x9 (ipipe_syscall_hook+0x24)
    + func                   7    0.000  __rt_task_wait_period+0x8 (hisyscall_event+0x16a)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Xenomai] Interpreting I-pipe trace
  2012-09-11  5:01 [Xenomai] Interpreting I-pipe trace Doug Brunner
@ 2012-09-11  7:44 ` Gilles Chanteperdrix
  2012-09-11  7:48 ` Philippe Gerum
  2012-09-11 19:21 ` Gilles Chanteperdrix
  2 siblings, 0 replies; 7+ messages in thread
From: Gilles Chanteperdrix @ 2012-09-11  7:44 UTC (permalink / raw)
  To: Doug Brunner; +Cc: xenomai

On 09/11/2012 07:01 AM, Doug Brunner wrote:

> While running my latency testing earlier I saw some rather high 
> worst-case latencies (~70us) compared to average case (~14us), so I ran 
> again with I-pipe tracing enabled. However, I'm not sure what to make of 
> the results.
> 
> My worst case involves an IRQ (common_interrupt appears in the trace 
> with user value 0xFFFFFFC4) and the wiki page talks about being able to 
> translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on 
> how this correspondence works. I'm not horribly concerned since it's a 
> delay of 53 us on a rather slow processor (Geode LX800) but it would be 
> nice to know what interrupt is taking so long.
> 
> The trace is attached.


Have you tried booting with "idle=poll" ?

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Xenomai] Interpreting I-pipe trace
  2012-09-11  5:01 [Xenomai] Interpreting I-pipe trace Doug Brunner
  2012-09-11  7:44 ` Gilles Chanteperdrix
@ 2012-09-11  7:48 ` Philippe Gerum
  2012-09-11 19:21 ` Gilles Chanteperdrix
  2 siblings, 0 replies; 7+ messages in thread
From: Philippe Gerum @ 2012-09-11  7:48 UTC (permalink / raw)
  To: xenomai

On 09/11/2012 07:01 AM, Doug Brunner wrote:
> While running my latency testing earlier I saw some rather high
> worst-case latencies (~70us) compared to average case (~14us), so I ran
> again with I-pipe tracing enabled. However, I'm not sure what to make of
> the results.
> 
> My worst case involves an IRQ (common_interrupt appears in the trace
> with user value 0xFFFFFFC4) and the wiki page talks about being able to
> translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on
> how this correspondence works.

The kernel pushes ~irq_num on top of the interrupt stack.

 I'm not horribly concerned since it's a
> delay of 53 us on a rather slow processor (Geode LX800) but it would be
> nice to know what interrupt is taking so long.
> 

Looks like a very slow wakeup from idle state.

> The trace is attached.
> 
> Thanks,
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Xenomai] Interpreting I-pipe trace
  2012-09-11  5:01 [Xenomai] Interpreting I-pipe trace Doug Brunner
  2012-09-11  7:44 ` Gilles Chanteperdrix
  2012-09-11  7:48 ` Philippe Gerum
@ 2012-09-11 19:21 ` Gilles Chanteperdrix
  2012-09-11 21:19   ` Gilles Chanteperdrix
  2 siblings, 1 reply; 7+ messages in thread
From: Gilles Chanteperdrix @ 2012-09-11 19:21 UTC (permalink / raw)
  To: Doug Brunner; +Cc: xenomai

On 09/11/2012 07:01 AM, Doug Brunner wrote:

> While running my latency testing earlier I saw some rather high 
> worst-case latencies (~70us) compared to average case (~14us), so I ran 
> again with I-pipe tracing enabled. However, I'm not sure what to make of 
> the results.
> 
> My worst case involves an IRQ (common_interrupt appears in the trace 
> with user value 0xFFFFFFC4) and the wiki page talks about being able to 
> translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on 
> how this correspondence works. I'm not horribly concerned since it's a 
> delay of 53 us on a rather slow processor (Geode LX800) but it would be 
> nice to know what interrupt is taking so long.


You may also want to apply the following patch for SMI on Geode LX, and 
enable CONFIG_XENO_HW_SMI_WORKAROUND. You can remove the '#if 0', if you
do not use PCI.

diff --git a/ksrc/arch/x86/smi.c b/ksrc/arch/x86/smi.c
index d80b14b..6d641be 100644
--- a/ksrc/arch/x86/smi.c
+++ b/ksrc/arch/x86/smi.c
@@ -31,6 +31,7 @@
 #include <linux/reboot.h>
 #include <asm-generic/xenomai/pci_ids.h>
 #include <asm/xenomai/hal.h>
+#include <asm/geode.h>
 
 static struct pci_device_id rthal_smi_pci_tbl[] = {
 	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0)},
@@ -192,6 +193,35 @@ void rthal_smi_init(void)
 	struct pci_dev *dev = NULL;
 	struct pci_device_id *id;
 
+#ifdef CONFIG_XENO_HW_SMI_WORKAROUND
+	if (is_geode_lx()) {
+		unsigned long long val;
+#define SMM_CTRL_MSR 0x00001301
+
+/* Do not clear 0x10, that is SMI_IO */
+#define SMM_CTRL_MSR_CLR 0x0000000000000020ULL
+#define GLIU0_MSR_SMI 0x10002002
+#define GLIU1_MSR_SMI 0x40002002
+#define GLIU0_ASMI 0x10000083
+#define GLIU1_ASMI 0x40000083
+#define CS5536_MSR_SMI 0x4c002002
+#define CS5536_PCI_MSR_SMI 0x50002002
+
+		printk("Geode LX found, trying SMI workaround\n");
+		rdmsrl(SMM_CTRL_MSR, val);
+		wrmsrl(SMM_CTRL_MSR, val & ~SMM_CTRL_MSR_CLR);
+		wrmsrl(GLIU0_MSR_SMI, 0x0000001800000018ULL);
+		wrmsrl(GLIU1_MSR_SMI, 0x0000001800000018ULL);
+		wrmsrl(GLIU0_ASMI, 0x000000000000ffffULL);
+		wrmsrl(GLIU1_ASMI, 0x000000000000ffffULL);
+		wrmsrl(CS5536_MSR_SMI, 0x00000000001f001fULL);
+#if 0
+	       /* PCI SMI are needed to get PCI running. */
+		wrmsrl(CS5536_PCI_MSR_SMI, 0x00000000003f003fULL);
+#endif
+	}
+#endif
+
 	/*
 	 * Do not use pci_register_driver, pci_enable_device, ...
 	 * Just register the used ports.


-- 
                                                                Gilles.


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Xenomai] Interpreting I-pipe trace
  2012-09-11 19:21 ` Gilles Chanteperdrix
@ 2012-09-11 21:19   ` Gilles Chanteperdrix
  2012-09-12  6:53     ` Gilles Chanteperdrix
       [not found]     ` <505667A8.9040409@ebus.com>
  0 siblings, 2 replies; 7+ messages in thread
From: Gilles Chanteperdrix @ 2012-09-11 21:19 UTC (permalink / raw)
  To: Doug Brunner; +Cc: xenomai

On 09/11/2012 09:21 PM, Gilles Chanteperdrix wrote:

> On 09/11/2012 07:01 AM, Doug Brunner wrote:
> 
>> While running my latency testing earlier I saw some rather high 
>> worst-case latencies (~70us) compared to average case (~14us), so I ran 
>> again with I-pipe tracing enabled. However, I'm not sure what to make of 
>> the results.
>>
>> My worst case involves an IRQ (common_interrupt appears in the trace 
>> with user value 0xFFFFFFC4) and the wiki page talks about being able to 
>> translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on 
>> how this correspondence works. I'm not horribly concerned since it's a 
>> delay of 53 us on a rather slow processor (Geode LX800) but it would be 
>> nice to know what interrupt is taking so long.
> 
> 
> You may also want to apply the following patch for SMI on Geode LX, and 
> enable CONFIG_XENO_HW_SMI_WORKAROUND. You can remove the '#if 0', if you
> do not use PCI.


You have to pass cs5536.msr=1 to avoid using PCI registers access (which
use SMIs) in the IDE driver.

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Xenomai] Interpreting I-pipe trace
  2012-09-11 21:19   ` Gilles Chanteperdrix
@ 2012-09-12  6:53     ` Gilles Chanteperdrix
       [not found]     ` <505667A8.9040409@ebus.com>
  1 sibling, 0 replies; 7+ messages in thread
From: Gilles Chanteperdrix @ 2012-09-12  6:53 UTC (permalink / raw)
  To: Doug Brunner; +Cc: xenomai

On 09/11/2012 11:19 PM, Gilles Chanteperdrix wrote:

> On 09/11/2012 09:21 PM, Gilles Chanteperdrix wrote:
> 
>> On 09/11/2012 07:01 AM, Doug Brunner wrote:
>>
>>> While running my latency testing earlier I saw some rather high 
>>> worst-case latencies (~70us) compared to average case (~14us), so I ran 
>>> again with I-pipe tracing enabled. However, I'm not sure what to make of 
>>> the results.
>>>
>>> My worst case involves an IRQ (common_interrupt appears in the trace 
>>> with user value 0xFFFFFFC4) and the wiki page talks about being able to 
>>> translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on 
>>> how this correspondence works. I'm not horribly concerned since it's a 
>>> delay of 53 us on a rather slow processor (Geode LX800) but it would be 
>>> nice to know what interrupt is taking so long.
>>
>>
>> You may also want to apply the following patch for SMI on Geode LX, and 
>> enable CONFIG_XENO_HW_SMI_WORKAROUND. You can remove the '#if 0', if you
>> do not use PCI.
> 
> 
> You have to pass cs5536.msr=1 to avoid using PCI registers access (which
> use SMIs) in the IDE driver.
> 


These two tricks seem to make a big difference here:
http://sisyphus.hd.free.fr/~gilles/core-3.4-latencies/geode.png

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Xenomai] Interpreting I-pipe trace
       [not found]     ` <505667A8.9040409@ebus.com>
@ 2012-09-17  7:01       ` Gilles Chanteperdrix
  0 siblings, 0 replies; 7+ messages in thread
From: Gilles Chanteperdrix @ 2012-09-17  7:01 UTC (permalink / raw)
  To: Doug Brunner; +Cc: Xenomai

On 09/17/2012 01:58 AM, Doug Brunner wrote:

> On 09/11/2012 02:19 PM, Gilles Chanteperdrix wrote:
>> On 09/11/2012 09:21 PM, Gilles Chanteperdrix wrote:
>>
>>> On 09/11/2012 07:01 AM, Doug Brunner wrote:
>>>
>>>> While running my latency testing earlier I saw some rather high
>>>> worst-case latencies (~70us) compared to average case (~14us), so I ran
>>>> again with I-pipe tracing enabled. However, I'm not sure what to make of
>>>> the results.
>>>>
>>>> My worst case involves an IRQ (common_interrupt appears in the trace
>>>> with user value 0xFFFFFFC4) and the wiki page talks about being able to
>>>> translate the user value 0xFFFFFFF4 into IRQ 11 but doesn't elaborate on
>>>> how this correspondence works. I'm not horribly concerned since it's a
>>>> delay of 53 us on a rather slow processor (Geode LX800) but it would be
>>>> nice to know what interrupt is taking so long.
>>>
>>> You may also want to apply the following patch for SMI on Geode LX, and
>>> enable CONFIG_XENO_HW_SMI_WORKAROUND. You can remove the '#if 0', if you
>>> do not use PCI.
>>
>> You have to pass cs5536.msr=1 to avoid using PCI registers access (which
>> use SMIs) in the IDE driver.
>>
> It doesn't appear like this patch, or using idle=poll, has any effect. I 
> tried making latency histograms with and without and they were almost 
> identical. Interestingly I don't see any output from the printk in the 
> patch, even though I have earlyprintk set up to run over my serial 
> console hookup. This persisted even when I took out the is_geode_lx() 
> check. This suggests to me that rthal_smi_init is not getting called.


Actually, after some more test, the only thing that made the difference
for me was booting with "cs5536.msr=1", as it causes the cs5536 driver
to use msrs instead of pci config register accesses and pci config
register accesses are emulated with SMIs. When doing, that there does
not seem to be any SMI on my geode, so masking the SMIs is in fact useless.

To shut other SMI off, you may try to add:
                wrmsrl(0x51000002, 0);
+               wrmsrl(0x51010002, 0);
+               wrmsrl(0x51200002, 0);
+               wrmsrl(0x51300002, 0);
+               wrmsrl(0x51400002, 0);
+               wrmsrl(0x51500002, 0);
+               wrmsrl(0x51700002, 0);

The tsc in my case is correctly configured, but if it is not correctly
configured by your bios, you can check its registers. This is all
documented in the Geode datasheet. You have to configure it so that it
does not stop when the idle task calls. You should also configure the
geode so that the geode doe not automatically go into a low power mode
when the "hlt" instruction is called (but if you boot with idle=poll,
"hlt" should never be called anyway).

In any case, the trace you posted is way to short, to actually debug a
high latencies, the trace should capture at least the timer
programmation before the tick which triggers the trace, so that you can
see what happened between the time the timer was supposed to tick and
the time when it really ticked. When you have done that, please post the
trace here, and we will try and continue the debugging.

>

> I do have CONFIG_XENO_HW_SMI_ALL set, which now that I think about it 
> seems like it should already give me the benefit of the patch. However I 
> don't see how it would stop rthal_smi_init from getting called.


This suggests a configuration issue, such as
CONFIG_XENO_HW_SMI_WORKAROUND missing. Nothing magical here.
rthal_smi_init IS called during Xenomai startup if
CONFIG_XENO_HW_SMI_WORKAROUND is enabled.

> For the benefit of my curiosity, could you explain how 0xFFFFFFC4 
> translates into a PCI related SMI?


Well, in the trace you posted, I do not see 0xFFFFFFC4, but in that case
0xFFFFFFC4 is ~0x3b, so, it corresponds to vector 3b. Now, what is
vector 3b probably depends on your setup, and probably has nothing to do
with PCI related SMI.

In any case, an SMI does not go through "common_interrupt", and SMI
jumps directly to, and is handled in BIOS code. So, it is invisible in
the I-pipe trace, except for a large hole in the time line.

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-09-17  7:01 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-11  5:01 [Xenomai] Interpreting I-pipe trace Doug Brunner
2012-09-11  7:44 ` Gilles Chanteperdrix
2012-09-11  7:48 ` Philippe Gerum
2012-09-11 19:21 ` Gilles Chanteperdrix
2012-09-11 21:19   ` Gilles Chanteperdrix
2012-09-12  6:53     ` Gilles Chanteperdrix
     [not found]     ` <505667A8.9040409@ebus.com>
2012-09-17  7:01       ` Gilles Chanteperdrix

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.