All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai] rtdm_nrtsig_pend FAQ
@ 2014-11-12  8:47 Johann Obermayr
  2014-11-12  9:10 ` Philippe Gerum
  2014-11-12 16:44 ` Gilles Chanteperdrix
  0 siblings, 2 replies; 15+ messages in thread
From: Johann Obermayr @ 2014-11-12  8:47 UTC (permalink / raw)
  To: Xenomai@xenomai.org

Hello,

we use rtdm_nrtsig_pend follow.

static rtdm_nrtsig_t wait_domain_nrt;
static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);

void period_update()
{
         wait_domain_pend_count++;
         rtdm_nrtsig_pend(&wait_domain_nrt);
}

static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
{
     wait_domain_call_count++;
     //wakeup wait_domain
     wait_domain_wakeup = 1;
     wake_up_interruptible(&wait_domain_wq);
}


period_update is called every millisecond.
this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.

Why wait_domain_call_count can be smaller that wait_domain_pend_count.
The difference between the counters is growing.

Why ?

Best Regards
   Johann



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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12  8:47 [Xenomai] rtdm_nrtsig_pend FAQ Johann Obermayr
@ 2014-11-12  9:10 ` Philippe Gerum
  2014-11-12  9:20   ` Johann Obermayr
  2014-11-12 16:44 ` Gilles Chanteperdrix
  1 sibling, 1 reply; 15+ messages in thread
From: Philippe Gerum @ 2014-11-12  9:10 UTC (permalink / raw)
  To: johann.obermayr, Xenomai@xenomai.org

On 11/12/2014 09:47 AM, Johann Obermayr wrote:
> Hello,
> 
> we use rtdm_nrtsig_pend follow.
> 
> static rtdm_nrtsig_t wait_domain_nrt;
> static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
> 
> void period_update()
> {
>         wait_domain_pend_count++;
>         rtdm_nrtsig_pend(&wait_domain_nrt);
> }
> 
> static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
> {
>     wait_domain_call_count++;
>     //wakeup wait_domain
>     wait_domain_wakeup = 1;
>     wake_up_interruptible(&wait_domain_wq);
> }
> 
> 
> period_update is called every millisecond.
> this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
> 
> Why wait_domain_call_count can be smaller that wait_domain_pend_count.
> The difference between the counters is growing.
> 
> Why ?
> 

nrt signals are based on I-pipe virtual irqs, which do not pile up:
there is a single signal pending until the irq can be delivered to the
handler, regardless of how many times it has been triggered.

-- 
Philippe.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12  9:10 ` Philippe Gerum
@ 2014-11-12  9:20   ` Johann Obermayr
  2014-11-12  9:50     ` Philippe Gerum
  0 siblings, 1 reply; 15+ messages in thread
From: Johann Obermayr @ 2014-11-12  9:20 UTC (permalink / raw)
  To: xenomai@xenomai.org

Am 12.11.2014 um 10:10 schrieb Philippe Gerum:
> nrt signals are based on I-pipe virtual irqs, which do not pile up:
> there is a single signal pending until the irq can be delivered to the
> handler, regardless of how many times it has been triggered.
i know, if there is a big cpu load some virtual irqs can be lost, but we 
have cpu load smaller that 10 percent.





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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12  9:20   ` Johann Obermayr
@ 2014-11-12  9:50     ` Philippe Gerum
  2014-11-12 10:53       ` Johann Obermayr
  0 siblings, 1 reply; 15+ messages in thread
From: Philippe Gerum @ 2014-11-12  9:50 UTC (permalink / raw)
  To: johann.obermayr, xenomai@xenomai.org

On 11/12/2014 10:20 AM, Johann Obermayr wrote:
> Am 12.11.2014 um 10:10 schrieb Philippe Gerum:
>> nrt signals are based on I-pipe virtual irqs, which do not pile up:
>> there is a single signal pending until the irq can be delivered to the
>> handler, regardless of how many times it has been triggered.
> i know, if there is a big cpu load some virtual irqs can be lost, but we
> have cpu load smaller that 10 percent.
> 

Did you try running vmstat with a one second delay while your
application runs?

-- 
Philippe.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12  9:50     ` Philippe Gerum
@ 2014-11-12 10:53       ` Johann Obermayr
  2014-11-12 11:30         ` Philippe Gerum
  0 siblings, 1 reply; 15+ messages in thread
From: Johann Obermayr @ 2014-11-12 10:53 UTC (permalink / raw)
  To: xenomai

Am 12.11.2014 um 10:50 schrieb Philippe Gerum:
> On 11/12/2014 10:20 AM, Johann Obermayr wrote:
>> Am 12.11.2014 um 10:10 schrieb Philippe Gerum:
>>> nrt signals are based on I-pipe virtual irqs, which do not pile up:
>>> there is a single signal pending until the irq can be delivered to the
>>> handler, regardless of how many times it has been triggered.
>> i know, if there is a big cpu load some virtual irqs can be lost, but we
>> have cpu load smaller that 10 percent.
>>
> Did you try running vmstat with a one second delay while your
> application runs?
>
vmstat is not running.
we have a own proc_create("company/lrtdrv_timing", 0, NULL, &proc_fops); 
to show
the counters.



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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12 10:53       ` Johann Obermayr
@ 2014-11-12 11:30         ` Philippe Gerum
  0 siblings, 0 replies; 15+ messages in thread
From: Philippe Gerum @ 2014-11-12 11:30 UTC (permalink / raw)
  To: johann.obermayr, xenomai

On 11/12/2014 11:53 AM, Johann Obermayr wrote:
> Am 12.11.2014 um 10:50 schrieb Philippe Gerum:
>> On 11/12/2014 10:20 AM, Johann Obermayr wrote:
>>> Am 12.11.2014 um 10:10 schrieb Philippe Gerum:
>>>> nrt signals are based on I-pipe virtual irqs, which do not pile up:
>>>> there is a single signal pending until the irq can be delivered to the
>>>> handler, regardless of how many times it has been triggered.
>>> i know, if there is a big cpu load some virtual irqs can be lost, but we
>>> have cpu load smaller that 10 percent.
>>>
>> Did you try running vmstat with a one second delay while your
>> application runs?
>>
> vmstat is not running.
> we have a own proc_create("company/lrtdrv_timing", 0, NULL, &proc_fops);
> to show
> the counters.
> 
> 

I mean that relying on the load average won't get you much information
about potential high load spikes occurring regularly, but on large
intervals. Since your reasoning seems to be based on the load average
for assuming that virqs might be lost, I would recommend to check this
assumption first. Analyzing a vmstat log would give you a finer information.

Bottom line is that either the regular kernel is starved from IRQs long
enough to make a sequence of several virq triggers appear as a single
shot, or some virqs get lost in space.

Since virqs on the root domain are no different from regular linux IRQs
with respect to the way the pipeline handles them, option #2 would also
mean that device IRQs could be lost the same way, which is not the most
likely outcome. FWIW, a quick look at the legacy pipeline code for
kernel 3.0 did not reveal any arm-specific issue that might cause a virq
trigger to be lost.

Typically, I would inspect the system status when
(wait_domain_pend_count - wait_domain_call_count) >= 1, on entry to
period_update(). For this you can trigger a pipeline trace with a
backlog large enough to find out what the regular kernel was doing prior
to being preempted by the rt activity which called period_update().

-- 
Philippe.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12  8:47 [Xenomai] rtdm_nrtsig_pend FAQ Johann Obermayr
  2014-11-12  9:10 ` Philippe Gerum
@ 2014-11-12 16:44 ` Gilles Chanteperdrix
  2014-11-13 16:30   ` Johann Obermayr
  1 sibling, 1 reply; 15+ messages in thread
From: Gilles Chanteperdrix @ 2014-11-12 16:44 UTC (permalink / raw)
  To: Johann Obermayr; +Cc: Xenomai@xenomai.org

On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
> Hello,
> 
> we use rtdm_nrtsig_pend follow.
> 
> static rtdm_nrtsig_t wait_domain_nrt;
> static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
> 
> void period_update()
> {
>         wait_domain_pend_count++;
>         rtdm_nrtsig_pend(&wait_domain_nrt);
> }
> 
> static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
> {
>     wait_domain_call_count++;
>     //wakeup wait_domain
>     wait_domain_wakeup = 1;
>     wake_up_interruptible(&wait_domain_wq);
> }
> 
> 
> period_update is called every millisecond.
> this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.

>From what Thierry said, I suspect the patch for this kernel has a
missing call to irq_exit. So, I would ask you to do the same as
Thierry, please enable the I-pipe tracer, set a sufficient number of
back trace points such as 10000, and trigger a trace when you detect
that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)

Then send the trace to the mailing list.

-- 
					    Gilles.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-12 16:44 ` Gilles Chanteperdrix
@ 2014-11-13 16:30   ` Johann Obermayr
  2014-11-13 16:33     ` Gilles Chanteperdrix
  0 siblings, 1 reply; 15+ messages in thread
From: Johann Obermayr @ 2014-11-13 16:30 UTC (permalink / raw)
  Cc: Xenomai@xenomai.org

Am 12.11.2014 um 17:44 schrieb Gilles Chanteperdrix:
> On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
>> Hello,
>>
>> we use rtdm_nrtsig_pend follow.
>>
>> static rtdm_nrtsig_t wait_domain_nrt;
>> static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
>>
>> void period_update()
>> {
>>          wait_domain_pend_count++;
>>          rtdm_nrtsig_pend(&wait_domain_nrt);
>> }
>>
>> static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
>> {
>>      wait_domain_call_count++;
>>      //wakeup wait_domain
>>      wait_domain_wakeup = 1;
>>      wake_up_interruptible(&wait_domain_wq);
>> }
>>
>>
>> period_update is called every millisecond.
>> this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
> >From what Thierry said, I suspect the patch for this kernel has a
> missing call to irq_exit. So, I would ask you to do the same as
> Thierry, please enable the I-pipe tracer, set a sufficient number of
> back trace points such as 10000, and trigger a trace when you detect
> that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)
>
> Then send the trace to the mailing list.
>
Hi,

witch function i must use to make a i-pipe trace ?
here i am in a xenomai irq handle

void period_update()
{
     ......
     else if (wait_domain_pend_count > 100000 && wait_domain_pend_count 
!= wait_domain_call_count) {
             // dotrace

      }
}

Thanks for help
  Johann


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-13 16:30   ` Johann Obermayr
@ 2014-11-13 16:33     ` Gilles Chanteperdrix
  2014-11-14  9:53       ` Johann Obermayr
  0 siblings, 1 reply; 15+ messages in thread
From: Gilles Chanteperdrix @ 2014-11-13 16:33 UTC (permalink / raw)
  To: Johann Obermayr; +Cc: Xenomai@xenomai.org

On Thu, Nov 13, 2014 at 05:30:34PM +0100, Johann Obermayr wrote:
> Am 12.11.2014 um 17:44 schrieb Gilles Chanteperdrix:
> >On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
> >>Hello,
> >>
> >>we use rtdm_nrtsig_pend follow.
> >>
> >>static rtdm_nrtsig_t wait_domain_nrt;
> >>static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
> >>
> >>void period_update()
> >>{
> >>         wait_domain_pend_count++;
> >>         rtdm_nrtsig_pend(&wait_domain_nrt);
> >>}
> >>
> >>static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
> >>{
> >>     wait_domain_call_count++;
> >>     //wakeup wait_domain
> >>     wait_domain_wakeup = 1;
> >>     wake_up_interruptible(&wait_domain_wq);
> >>}
> >>
> >>
> >>period_update is called every millisecond.
> >>this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
> >>From what Thierry said, I suspect the patch for this kernel has a
> >missing call to irq_exit. So, I would ask you to do the same as
> >Thierry, please enable the I-pipe tracer, set a sufficient number of
> >back trace points such as 10000, and trigger a trace when you detect
> >that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)
> >
> >Then send the trace to the mailing list.
> >
> Hi,
> 
> witch function i must use to make a i-pipe trace ?
> here i am in a xenomai irq handle
> 
> void period_update()
> {
>     ......
>     else if (wait_domain_pend_count > 100000 &&
> wait_domain_pend_count != wait_domain_call_count) {
>             // dotrace
> 
>      }
> }

ipipe_trace_freeze. Requires a numeric argument, which has no
particular meaning, it just gets printed in the trace.

The I-pipe tracer is documented here:
http://xenomai.org/2014/06/using-the-i-pipe-tracer/

-- 
					    Gilles.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-13 16:33     ` Gilles Chanteperdrix
@ 2014-11-14  9:53       ` Johann Obermayr
  2014-11-14 10:20         ` Gilles Chanteperdrix
  0 siblings, 1 reply; 15+ messages in thread
From: Johann Obermayr @ 2014-11-14  9:53 UTC (permalink / raw)
  Cc: Xenomai@xenomai.org

Am 13.11.2014 um 17:33 schrieb Gilles Chanteperdrix:
> On Thu, Nov 13, 2014 at 05:30:34PM +0100, Johann Obermayr wrote:
>> Am 12.11.2014 um 17:44 schrieb Gilles Chanteperdrix:
>>> On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
>>>> Hello,
>>>>
>>>> we use rtdm_nrtsig_pend follow.
>>>>
>>>> static rtdm_nrtsig_t wait_domain_nrt;
>>>> static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
>>>>
>>>> void period_update()
>>>> {
>>>>          wait_domain_pend_count++;
>>>>          rtdm_nrtsig_pend(&wait_domain_nrt);
>>>> }
>>>>
>>>> static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
>>>> {
>>>>      wait_domain_call_count++;
>>>>      //wakeup wait_domain
>>>>      wait_domain_wakeup = 1;
>>>>      wake_up_interruptible(&wait_domain_wq);
>>>> }
>>>>
>>>>
>>>> period_update is called every millisecond.
>>>> this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
>>> >From what Thierry said, I suspect the patch for this kernel has a
>>> missing call to irq_exit. So, I would ask you to do the same as
>>> Thierry, please enable the I-pipe tracer, set a sufficient number of
>>> back trace points such as 10000, and trigger a trace when you detect
>>> that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)
>>>
>>> Then send the trace to the mailing list.
>>>
>> Hi,
>>
>> witch function i must use to make a i-pipe trace ?
>> here i am in a xenomai irq handle
>>
>> void period_update()
>> {
>>      ......
>>      else if (wait_domain_pend_count > 100000 &&
>> wait_domain_pend_count != wait_domain_call_count) {
>>              // dotrace
>>
>>       }
>> }
> ipipe_trace_freeze. Requires a numeric argument, which has no
> particular meaning, it just gets printed in the trace.
>
> The I-pipe tracer is documented here:
> http://xenomai.org/2014/06/using-the-i-pipe-tracer/
>
Hello,

here is the trace

-------------- next part --------------
A non-text attachment was scrubbed...
Name: frozen.zip
Type: application/zip
Size: 10590 bytes
Desc: not available
URL: <http://www.xenomai.org/pipermail/xenomai/attachments/20141114/36700ef8/attachment.zip>

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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-14  9:53       ` Johann Obermayr
@ 2014-11-14 10:20         ` Gilles Chanteperdrix
  2014-11-14 12:37           ` Johann Obermayr
  0 siblings, 1 reply; 15+ messages in thread
From: Gilles Chanteperdrix @ 2014-11-14 10:20 UTC (permalink / raw)
  To: Johann Obermayr; +Cc: Xenomai@xenomai.org

On Fri, Nov 14, 2014 at 10:53:31AM +0100, Johann Obermayr wrote:
> Am 13.11.2014 um 17:33 schrieb Gilles Chanteperdrix:
> >On Thu, Nov 13, 2014 at 05:30:34PM +0100, Johann Obermayr wrote:
> >>Am 12.11.2014 um 17:44 schrieb Gilles Chanteperdrix:
> >>>On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
> >>>>Hello,
> >>>>
> >>>>we use rtdm_nrtsig_pend follow.
> >>>>
> >>>>static rtdm_nrtsig_t wait_domain_nrt;
> >>>>static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
> >>>>
> >>>>void period_update()
> >>>>{
> >>>>         wait_domain_pend_count++;
> >>>>         rtdm_nrtsig_pend(&wait_domain_nrt);
> >>>>}
> >>>>
> >>>>static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
> >>>>{
> >>>>     wait_domain_call_count++;
> >>>>     //wakeup wait_domain
> >>>>     wait_domain_wakeup = 1;
> >>>>     wake_up_interruptible(&wait_domain_wq);
> >>>>}
> >>>>
> >>>>
> >>>>period_update is called every millisecond.
> >>>>this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
> >>>>From what Thierry said, I suspect the patch for this kernel has a
> >>>missing call to irq_exit. So, I would ask you to do the same as
> >>>Thierry, please enable the I-pipe tracer, set a sufficient number of
> >>>back trace points such as 10000, and trigger a trace when you detect
> >>>that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)
> >>>
> >>>Then send the trace to the mailing list.
> >>>
> >>Hi,
> >>
> >>witch function i must use to make a i-pipe trace ?
> >>here i am in a xenomai irq handle
> >>
> >>void period_update()
> >>{
> >>     ......
> >>     else if (wait_domain_pend_count > 100000 &&
> >>wait_domain_pend_count != wait_domain_call_count) {
> >>             // dotrace
> >>
> >>      }
> >>}
> >ipipe_trace_freeze. Requires a numeric argument, which has no
> >particular meaning, it just gets printed in the trace.
> >
> >The I-pipe tracer is documented here:
> >http://xenomai.org/2014/06/using-the-i-pipe-tracer/
> >
> Hello,
> 
> here is the trace

Your trace show several things: 
- period_update in your program does not correspond to the sources
you showed:

:   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
:   +*func                -759    1.000  lrtdrv_monitoring_start_timed+0x10 [sigmatek_lrt] (period_update+0x34 [sigmatek_lrt])
:   +*func                -758    0.750  rtdm_event_signal+0x10 (period_update+0x180 [sigmatek_lrt])
:|  #*func                -757    0.500  xnsynch_flush+0x10 (rtdm_event_signal+0x50)
:|  #*func                -756    0.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_signal+0xa8)
:   +*func                -756    0.500  __rtdm_synch_flush+0x10 (period_update+0x18c [sigmatek_lrt])
:|  #*func                -755    0.500  xnsynch_flush+0x10 (__rtdm_synch_flush+0x54)
:|  #*func                -755    0.750  __ipipe_restore_pipeline_head+0x10 (__rtdm_synch_flush+0xc8)
:   +*func                -754    0.500  rtdm_event_signal+0x10 (period_update+0x180 [sigmatek_lrt])
:|  #*func                -754    0.500  xnsynch_flush+0x10 (rtdm_event_signal+0x50)
:|  #*func                -753    0.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_signal+0xa8)
:   +*func                -753    0.250  __rtdm_synch_flush+0x10 (period_update+0x18c [sigmatek_lrt])
:|  #*func                -752    1.000  xnsynch_flush+0x10 (__rtdm_synch_flush+0x54)
:|  #*func                -751    0.250  xnpod_resume_thread+0x10 (xnsynch_flush+0xa4)
:|  #*[ 1065] WD-Trigg 1  -751    0.750  xnpod_resume_thread+0x54 (xnsynch_flush+0xa4)
:|  #*func                -750    0.500  __xnpod_schedule+0x14 (__rtdm_synch_flush+0x84)
:|  #*[   -1] -<?>-   99  -750    0.250  __xnpod_schedule+0x50 (__rtdm_synch_flush+0x84)
:|  #*func                -750    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
:|  #*func                -749    0.500  __ipipe_restore_pipeline_head+0x10 (__rtdm_synch_flush+0xc8)
:   +*func                -748    0.750  ipipe_trigger_irq+0x10 (period_update+0x224 [sigmatek_lrt])
:|  +*func                -748    0.500  __ipipe_handle_irq+0x14 (ipipe_trigger_irq+0x64)


Before calling nrt_pend, period_update calls rtdm_event_signal,
which could reschedule and cause the nrt_pend to be delayed (but
that does not happen in that case).

- period update is called more often than every millisecond:

:   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])

:   +*func                 -16    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
<   +*freeze  0x00023b12     0    0.750  period_update+0x1f4 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])

- you have a massive latency, which is causing your real-time job to
occupy the CPU all the time, and never let Linux run.

:|  #*[ 1065] WD-Trigg 1  -722    0.500  __xnpod_schedule+0x50 (xnpod_suspend_thread+0x220)
:|  #*func                -722    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
:|  #*func                -721    0.250  ipipe_unmute_pic+0x10 (__xnpod_schedule+0x1e4)
:|  #*func                -721    1.000  gic_unmute+0x10 (ipipe_unmute_pic+0x18)
:|  #*func                -720+   1.250  ipipe_unstall_pipeline_head+0x10 (__xnpod_schedule+0x270)
:   +*func                -719    0.500  xnsched_finish_unlocked_switch+0x10 (__xnpod_schedule+0x38c)
:|  #*[  700] mmcqd/0 -1  -718    0.750  __xnpod_schedule+0x3b0 (xnintr_clock_handler+0x118)
:|  #*func                -717    0.500  xnpod_fire_callouts+0x10 (__xnpod_schedule+0x5fc)
:|  #*func                -717    0.750  taskSwitchXenomai+0x14 [sigmatek_lrt] (xnpod_fire_callouts+0x54)
:|  #*func                -716    0.750  measureIdleTime+0x10 [sigmatek_lrt] (taskSwitchXenomai+0x6c [sigmatek_lrt])
:|  #*func                -715    1.000  xnarch_tsc_to_ns+0x10 (measureIdleTime+0xac [sigmatek_lrt])
:|   #func                -714    0.750  __ipipe_walk_pipeline+0x10 (__ipipe_dispatch_wired_nocheck+0xa4)
:|   #func                -714! 674.750  __ipipe_exit_irq+0x10 (__ipipe_grab_irq+0x60)
:|   #func                 -39    0.500  __ipipe_grab_irq+0x10 (__irq_svc+0x40)

I believe this latency issue is due to the L2 cache write-allocate
bit that was fixed in the latest I-pipe patch. Please upgrade the
I-pipe patch, check/fix the issues above, and post another trace if
you still have the issue.

-- 
					    Gilles.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-14 10:20         ` Gilles Chanteperdrix
@ 2014-11-14 12:37           ` Johann Obermayr
  2014-11-14 12:47             ` Gilles Chanteperdrix
                               ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: Johann Obermayr @ 2014-11-14 12:37 UTC (permalink / raw)
  Cc: Xenomai@xenomai.org

Am 14.11.2014 um 11:20 schrieb Gilles Chanteperdrix:
> On Fri, Nov 14, 2014 at 10:53:31AM +0100, Johann Obermayr wrote:
>> Am 13.11.2014 um 17:33 schrieb Gilles Chanteperdrix:
>>> On Thu, Nov 13, 2014 at 05:30:34PM +0100, Johann Obermayr wrote:
>>>> Am 12.11.2014 um 17:44 schrieb Gilles Chanteperdrix:
>>>>> On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
>>>>>> Hello,
>>>>>>
>>>>>> we use rtdm_nrtsig_pend follow.
>>>>>>
>>>>>> static rtdm_nrtsig_t wait_domain_nrt;
>>>>>> static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
>>>>>>
>>>>>> void period_update()
>>>>>> {
>>>>>>          wait_domain_pend_count++;
>>>>>>          rtdm_nrtsig_pend(&wait_domain_nrt);
>>>>>> }
>>>>>>
>>>>>> static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
>>>>>> {
>>>>>>      wait_domain_call_count++;
>>>>>>      //wakeup wait_domain
>>>>>>      wait_domain_wakeup = 1;
>>>>>>      wake_up_interruptible(&wait_domain_wq);
>>>>>> }
>>>>>>
>>>>>>
>>>>>> period_update is called every millisecond.
>>>>>> this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
>>>>> >From what Thierry said, I suspect the patch for this kernel has a
>>>>> missing call to irq_exit. So, I would ask you to do the same as
>>>>> Thierry, please enable the I-pipe tracer, set a sufficient number of
>>>>> back trace points such as 10000, and trigger a trace when you detect
>>>>> that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)
>>>>>
>>>>> Then send the trace to the mailing list.
>>>>>
>>>> Hi,
>>>>
>>>> witch function i must use to make a i-pipe trace ?
>>>> here i am in a xenomai irq handle
>>>>
>>>> void period_update()
>>>> {
>>>>      ......
>>>>      else if (wait_domain_pend_count > 100000 &&
>>>> wait_domain_pend_count != wait_domain_call_count) {
>>>>              // dotrace
>>>>
>>>>       }
>>>> }
>>> ipipe_trace_freeze. Requires a numeric argument, which has no
>>> particular meaning, it just gets printed in the trace.
>>>
>>> The I-pipe tracer is documented here:
>>> http://xenomai.org/2014/06/using-the-i-pipe-tracer/
>>>
>> Hello,
>>
>> here is the trace
> Your trace show several things:
> - period_update in your program does not correspond to the sources
> you showed:
>
> :   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> :   +*func                -759    1.000  lrtdrv_monitoring_start_timed+0x10 [sigmatek_lrt] (period_update+0x34 [sigmatek_lrt])
> :   +*func                -758    0.750  rtdm_event_signal+0x10 (period_update+0x180 [sigmatek_lrt])
> :|  #*func                -757    0.500  xnsynch_flush+0x10 (rtdm_event_signal+0x50)
> :|  #*func                -756    0.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_signal+0xa8)
> :   +*func                -756    0.500  __rtdm_synch_flush+0x10 (period_update+0x18c [sigmatek_lrt])
> :|  #*func                -755    0.500  xnsynch_flush+0x10 (__rtdm_synch_flush+0x54)
> :|  #*func                -755    0.750  __ipipe_restore_pipeline_head+0x10 (__rtdm_synch_flush+0xc8)
> :   +*func                -754    0.500  rtdm_event_signal+0x10 (period_update+0x180 [sigmatek_lrt])
> :|  #*func                -754    0.500  xnsynch_flush+0x10 (rtdm_event_signal+0x50)
> :|  #*func                -753    0.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_signal+0xa8)
> :   +*func                -753    0.250  __rtdm_synch_flush+0x10 (period_update+0x18c [sigmatek_lrt])
> :|  #*func                -752    1.000  xnsynch_flush+0x10 (__rtdm_synch_flush+0x54)
> :|  #*func                -751    0.250  xnpod_resume_thread+0x10 (xnsynch_flush+0xa4)
> :|  #*[ 1065] WD-Trigg 1  -751    0.750  xnpod_resume_thread+0x54 (xnsynch_flush+0xa4)
> :|  #*func                -750    0.500  __xnpod_schedule+0x14 (__rtdm_synch_flush+0x84)
> :|  #*[   -1] -<?>-   99  -750    0.250  __xnpod_schedule+0x50 (__rtdm_synch_flush+0x84)
> :|  #*func                -750    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
> :|  #*func                -749    0.500  __ipipe_restore_pipeline_head+0x10 (__rtdm_synch_flush+0xc8)
> :   +*func                -748    0.750  ipipe_trigger_irq+0x10 (period_update+0x224 [sigmatek_lrt])
> :|  +*func                -748    0.500  __ipipe_handle_irq+0x14 (ipipe_trigger_irq+0x64)
>
>
> Before calling nrt_pend, period_update calls rtdm_event_signal,
> which could reschedule and cause the nrt_pend to be delayed (but
> that does not happen in that case).
Yes, it starts some RT tasks. This tasks need 30-100 us.

> - period update is called more often than every millisecond:
>
> :   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
>
> :   +*func                 -16    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> <   +*freeze  0x00023b12     0    0.750  period_update+0x1f4 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])

which can not be, because it is triggerd by a FPGA hardware IRQ every 
millisecond.

> - you have a massive latency, which is causing your real-time job to
> occupy the CPU all the time, and never let Linux run.
It looks as if a mmcqd task (micro SD card) will stop calling software irq.

> :|  #*[ 1065] WD-Trigg 1  -722    0.500  __xnpod_schedule+0x50 (xnpod_suspend_thread+0x220)
> :|  #*func                -722    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
> :|  #*func                -721    0.250  ipipe_unmute_pic+0x10 (__xnpod_schedule+0x1e4)
> :|  #*func                -721    1.000  gic_unmute+0x10 (ipipe_unmute_pic+0x18)
> :|  #*func                -720+   1.250  ipipe_unstall_pipeline_head+0x10 (__xnpod_schedule+0x270)
> :   +*func                -719    0.500  xnsched_finish_unlocked_switch+0x10 (__xnpod_schedule+0x38c)
> :|  #*[  700] mmcqd/0 -1  -718    0.750  __xnpod_schedule+0x3b0 (xnintr_clock_handler+0x118)
> :|  #*func                -717    0.500  xnpod_fire_callouts+0x10 (__xnpod_schedule+0x5fc)
> :|  #*func                -717    0.750  taskSwitchXenomai+0x14 [sigmatek_lrt] (xnpod_fire_callouts+0x54)
> :|  #*func                -716    0.750  measureIdleTime+0x10 [sigmatek_lrt] (taskSwitchXenomai+0x6c [sigmatek_lrt])
> :|  #*func                -715    1.000  xnarch_tsc_to_ns+0x10 (measureIdleTime+0xac [sigmatek_lrt])
> :|   #func                -714    0.750  __ipipe_walk_pipeline+0x10 (__ipipe_dispatch_wired_nocheck+0xa4)
> :|   #func                -714! 674.750  __ipipe_exit_irq+0x10 (__ipipe_grab_irq+0x60)
> :|   #func                 -39    0.500  __ipipe_grab_irq+0x10 (__irq_svc+0x40)
>
> I believe this latency issue is due to the L2 cache write-allocate
> bit that was fixed in the latest I-pipe patch. Please upgrade the
> I-pipe patch, check/fix the issues above, and post another trace if
> you still have the issue.
>

i test it with the new patches.



Here is the period_update function

void period_update(unsigned long ovr)
{
     struct list_head *lh;

     timer_overruns += ovr;
     timer_ticks++;

     lrtdrv_monitoring_start_timed(timer_ticks);

     /* we don't need to lock the list, we are the highest priority task
      * and if other ctx are added to/removed from the list, the list is 
locked there
      */
     list_for_each(lh, &lrtdrv_opendev_list) {
         lrtdrv_context_t *ctx = list_entry(lh, lrtdrv_context_t, 
opendev_entry);

         if (WATCHDOG_CHECK(ctx, 0) || WATCHDOG_CHECK(ctx, 1)) {
             // Watch DOG aufgetretten, also brauch ich nichts mehr machen
         } else {
             rtdm_event_signal(&ctx->rtt_timer_wait);
             rtdm_event_pulse(&ctx->timer_wait);
         }
     }
     if (wait_domain_pend_count == 100000)
         wait_domain_call_count = wait_domain_pend_count;
     else if (wait_domain_pend_count > 100000 && wait_domain_pend_count 
!= wait_domain_call_count) {
static int trace_count = 0;
         if (trace_count == 0) {
             trace_count++;
             // dotrace
             printk(KERN_INFO "IPIPE-Trace");
             ipipe_trace_freeze(wait_domain_pend_count);
         }
     }
     // NRT IRQ - start background
     if(wait_domain_nrt_setup) {
         wait_domain_pend_count++;
         rtdm_nrtsig_pend(&wait_domain_nrt);
     } else {
         wait_domain_nopend_count++;
     }
}

best regards
  Johann



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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-14 12:37           ` Johann Obermayr
@ 2014-11-14 12:47             ` Gilles Chanteperdrix
  2014-11-14 13:05             ` Gilles Chanteperdrix
  2014-11-14 13:45             ` Gilles Chanteperdrix
  2 siblings, 0 replies; 15+ messages in thread
From: Gilles Chanteperdrix @ 2014-11-14 12:47 UTC (permalink / raw)
  To: Johann Obermayr; +Cc: Xenomai@xenomai.org

On Fri, Nov 14, 2014 at 01:37:46PM +0100, Johann Obermayr wrote:
> Am 14.11.2014 um 11:20 schrieb Gilles Chanteperdrix:
> >On Fri, Nov 14, 2014 at 10:53:31AM +0100, Johann Obermayr wrote:
> >>Am 13.11.2014 um 17:33 schrieb Gilles Chanteperdrix:
> >>>On Thu, Nov 13, 2014 at 05:30:34PM +0100, Johann Obermayr wrote:
> >>>>Am 12.11.2014 um 17:44 schrieb Gilles Chanteperdrix:
> >>>>>On Wed, Nov 12, 2014 at 09:47:45AM +0100, Johann Obermayr wrote:
> >>>>>>Hello,
> >>>>>>
> >>>>>>we use rtdm_nrtsig_pend follow.
> >>>>>>
> >>>>>>static rtdm_nrtsig_t wait_domain_nrt;
> >>>>>>static DECLARE_WAIT_QUEUE_HEAD(wait_domain_wq);
> >>>>>>
> >>>>>>void period_update()
> >>>>>>{
> >>>>>>         wait_domain_pend_count++;
> >>>>>>         rtdm_nrtsig_pend(&wait_domain_nrt);
> >>>>>>}
> >>>>>>
> >>>>>>static void wait_domain_nrt_handler(rtdm_nrtsig_t nrt_sig, void *arg)
> >>>>>>{
> >>>>>>     wait_domain_call_count++;
> >>>>>>     //wakeup wait_domain
> >>>>>>     wait_domain_wakeup = 1;
> >>>>>>     wake_up_interruptible(&wait_domain_wq);
> >>>>>>}
> >>>>>>
> >>>>>>
> >>>>>>period_update is called every millisecond.
> >>>>>>this is on imx6 hardware with kernel 3.0.x and xenomai 2.6.2.1.
> >>>>>>From what Thierry said, I suspect the patch for this kernel has a
> >>>>>missing call to irq_exit. So, I would ask you to do the same as
> >>>>>Thierry, please enable the I-pipe tracer, set a sufficient number of
> >>>>>back trace points such as 10000, and trigger a trace when you detect
> >>>>>that you have "lost" a notification (wait_dommain_pend_count > wait_domain_call_count + 1)
> >>>>>
> >>>>>Then send the trace to the mailing list.
> >>>>>
> >>>>Hi,
> >>>>
> >>>>witch function i must use to make a i-pipe trace ?
> >>>>here i am in a xenomai irq handle
> >>>>
> >>>>void period_update()
> >>>>{
> >>>>     ......
> >>>>     else if (wait_domain_pend_count > 100000 &&
> >>>>wait_domain_pend_count != wait_domain_call_count) {
> >>>>             // dotrace
> >>>>
> >>>>      }
> >>>>}
> >>>ipipe_trace_freeze. Requires a numeric argument, which has no
> >>>particular meaning, it just gets printed in the trace.
> >>>
> >>>The I-pipe tracer is documented here:
> >>>http://xenomai.org/2014/06/using-the-i-pipe-tracer/
> >>>
> >>Hello,
> >>
> >>here is the trace
> >Your trace show several things:
> >- period_update in your program does not correspond to the sources
> >you showed:
> >
> >:   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> >:   +*func                -759    1.000  lrtdrv_monitoring_start_timed+0x10 [sigmatek_lrt] (period_update+0x34 [sigmatek_lrt])
> >:   +*func                -758    0.750  rtdm_event_signal+0x10 (period_update+0x180 [sigmatek_lrt])
> >:|  #*func                -757    0.500  xnsynch_flush+0x10 (rtdm_event_signal+0x50)
> >:|  #*func                -756    0.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_signal+0xa8)
> >:   +*func                -756    0.500  __rtdm_synch_flush+0x10 (period_update+0x18c [sigmatek_lrt])
> >:|  #*func                -755    0.500  xnsynch_flush+0x10 (__rtdm_synch_flush+0x54)
> >:|  #*func                -755    0.750  __ipipe_restore_pipeline_head+0x10 (__rtdm_synch_flush+0xc8)
> >:   +*func                -754    0.500  rtdm_event_signal+0x10 (period_update+0x180 [sigmatek_lrt])
> >:|  #*func                -754    0.500  xnsynch_flush+0x10 (rtdm_event_signal+0x50)
> >:|  #*func                -753    0.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_signal+0xa8)
> >:   +*func                -753    0.250  __rtdm_synch_flush+0x10 (period_update+0x18c [sigmatek_lrt])
> >:|  #*func                -752    1.000  xnsynch_flush+0x10 (__rtdm_synch_flush+0x54)
> >:|  #*func                -751    0.250  xnpod_resume_thread+0x10 (xnsynch_flush+0xa4)
> >:|  #*[ 1065] WD-Trigg 1  -751    0.750  xnpod_resume_thread+0x54 (xnsynch_flush+0xa4)
> >:|  #*func                -750    0.500  __xnpod_schedule+0x14 (__rtdm_synch_flush+0x84)
> >:|  #*[   -1] -<?>-   99  -750    0.250  __xnpod_schedule+0x50 (__rtdm_synch_flush+0x84)
> >:|  #*func                -750    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
> >:|  #*func                -749    0.500  __ipipe_restore_pipeline_head+0x10 (__rtdm_synch_flush+0xc8)
> >:   +*func                -748    0.750  ipipe_trigger_irq+0x10 (period_update+0x224 [sigmatek_lrt])
> >:|  +*func                -748    0.500  __ipipe_handle_irq+0x14 (ipipe_trigger_irq+0x64)
> >
> >
> >Before calling nrt_pend, period_update calls rtdm_event_signal,
> >which could reschedule and cause the nrt_pend to be delayed (but
> >that does not happen in that case).
> Yes, it starts some RT tasks. This tasks need 30-100 us.
> 
> >- period update is called more often than every millisecond:
> >
> >:   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> >
> >:   +*func                 -16    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> ><   +*freeze  0x00023b12     0    0.750  period_update+0x1f4 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> 
> which can not be, because it is triggerd by a FPGA hardware IRQ
> every millisecond.
> 
> >- you have a massive latency, which is causing your real-time job to
> >occupy the CPU all the time, and never let Linux run.
> It looks as if a mmcqd task (micro SD card) will stop calling software irq.
> 
> >:|  #*[ 1065] WD-Trigg 1  -722    0.500  __xnpod_schedule+0x50 (xnpod_suspend_thread+0x220)
> >:|  #*func                -722    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
> >:|  #*func                -721    0.250  ipipe_unmute_pic+0x10 (__xnpod_schedule+0x1e4)
> >:|  #*func                -721    1.000  gic_unmute+0x10 (ipipe_unmute_pic+0x18)
> >:|  #*func                -720+   1.250  ipipe_unstall_pipeline_head+0x10 (__xnpod_schedule+0x270)
> >:   +*func                -719    0.500  xnsched_finish_unlocked_switch+0x10 (__xnpod_schedule+0x38c)
> >:|  #*[  700] mmcqd/0 -1  -718    0.750  __xnpod_schedule+0x3b0 (xnintr_clock_handler+0x118)
> >:|  #*func                -717    0.500  xnpod_fire_callouts+0x10 (__xnpod_schedule+0x5fc)
> >:|  #*func                -717    0.750  taskSwitchXenomai+0x14 [sigmatek_lrt] (xnpod_fire_callouts+0x54)
> >:|  #*func                -716    0.750  measureIdleTime+0x10 [sigmatek_lrt] (taskSwitchXenomai+0x6c [sigmatek_lrt])
> >:|  #*func                -715    1.000  xnarch_tsc_to_ns+0x10 (measureIdleTime+0xac [sigmatek_lrt])
> >:|   #func                -714    0.750  __ipipe_walk_pipeline+0x10 (__ipipe_dispatch_wired_nocheck+0xa4)
> >:|   #func                -714! 674.750  __ipipe_exit_irq+0x10 (__ipipe_grab_irq+0x60)
> >:|   #func                 -39    0.500  __ipipe_grab_irq+0x10 (__irq_svc+0x40)
> >
> >I believe this latency issue is due to the L2 cache write-allocate
> >bit that was fixed in the latest I-pipe patch. Please upgrade the
> >I-pipe patch, check/fix the issues above, and post another trace if
> >you still have the issue.
> >
> 
> i test it with the new patches.
> 
> 
> 
> Here is the period_update function

This does not help much. This does not show how period_update is
activated, and notably, you do not answer my question of how
period_update can be called 3 times in the same millisecond whereas
it is supposed to be called only once. We do not see your complete
application sources, which can make us doubt about it.

So, please write a simple example, doing what your original
period_update did, triggered by a periodic thread, or a kernel
timer. A simple example that we can run on our machines if need be,
without any reference to code we do not have.

Run only that, and only that on the system, and tell us if you still
observe the problem. 

-- 
					    Gilles.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-14 12:37           ` Johann Obermayr
  2014-11-14 12:47             ` Gilles Chanteperdrix
@ 2014-11-14 13:05             ` Gilles Chanteperdrix
  2014-11-14 13:45             ` Gilles Chanteperdrix
  2 siblings, 0 replies; 15+ messages in thread
From: Gilles Chanteperdrix @ 2014-11-14 13:05 UTC (permalink / raw)
  To: Johann Obermayr; +Cc: Xenomai@xenomai.org

On Fri, Nov 14, 2014 at 01:37:46PM +0100, Johann Obermayr wrote:
> >- period update is called more often than every millisecond:
> >
> >:   +*func                -759    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> >
> >:   +*func                 -16    0.500  period_update+0x10 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> ><   +*freeze  0x00023b12     0    0.750  period_update+0x1f4 [sigmatek_lrt] (timer+0xb0 [sigmatek_lrt])
> 
> which can not be, because it is triggerd by a FPGA hardware IRQ
> every millisecond.

So, bugs in FPGA never happen? As far as I know the P in
FPGA means "programmable". I do not see how the trace could be wrong
on this. You can read a counter in your FPGA every time
period_update is called, if you do not trust the processor clock.

> 
> >- you have a massive latency, which is causing your real-time job to
> >occupy the CPU all the time, and never let Linux run.
> It looks as if a mmcqd task (micro SD card) will stop calling software irq.

I am not sure there is a big latency here, the system maybe just
returns to user-space which does its job, and the time spent in
user-space gets accounted before the last function which was called
before the return to user-space. I need to read this part of the
trace again to see where the virq should have been triggered.

> 
> >:|  #*[ 1065] WD-Trigg 1  -722    0.500  __xnpod_schedule+0x50 (xnpod_suspend_thread+0x220)
> >:|  #*func                -722    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
> >:|  #*func                -721    0.250  ipipe_unmute_pic+0x10 (__xnpod_schedule+0x1e4)
> >:|  #*func                -721    1.000  gic_unmute+0x10 (ipipe_unmute_pic+0x18)
> >:|  #*func                -720+   1.250  ipipe_unstall_pipeline_head+0x10 (__xnpod_schedule+0x270)
> >:   +*func                -719    0.500  xnsched_finish_unlocked_switch+0x10 (__xnpod_schedule+0x38c)
> >:|  #*[  700] mmcqd/0 -1  -718    0.750  __xnpod_schedule+0x3b0 (xnintr_clock_handler+0x118)
> >:|  #*func                -717    0.500  xnpod_fire_callouts+0x10 (__xnpod_schedule+0x5fc)
> >:|  #*func                -717    0.750  taskSwitchXenomai+0x14 [sigmatek_lrt] (xnpod_fire_callouts+0x54)
> >:|  #*func                -716    0.750  measureIdleTime+0x10 [sigmatek_lrt] (taskSwitchXenomai+0x6c [sigmatek_lrt])
> >:|  #*func                -715    1.000  xnarch_tsc_to_ns+0x10 (measureIdleTime+0xac [sigmatek_lrt])
> >:|   #func                -714    0.750  __ipipe_walk_pipeline+0x10 (__ipipe_dispatch_wired_nocheck+0xa4)
> >:|   #func                -714! 674.750  __ipipe_exit_irq+0x10 (__ipipe_grab_irq+0x60)
> >:|   #func                 -39    0.500  __ipipe_grab_irq+0x10 (__irq_svc+0x40)

> _______________________________________________
> Xenomai mailing list
> Xenomai@xenomai.org
> http://www.xenomai.org/mailman/listinfo/xenomai

-- 
					    Gilles.


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

* Re: [Xenomai] rtdm_nrtsig_pend FAQ
  2014-11-14 12:37           ` Johann Obermayr
  2014-11-14 12:47             ` Gilles Chanteperdrix
  2014-11-14 13:05             ` Gilles Chanteperdrix
@ 2014-11-14 13:45             ` Gilles Chanteperdrix
  2 siblings, 0 replies; 15+ messages in thread
From: Gilles Chanteperdrix @ 2014-11-14 13:45 UTC (permalink / raw)
  To: Johann Obermayr; +Cc: Xenomai@xenomai.org


Ok, we leave root here:

:    #func                -864    0.500  esdhc_readl_le+0x10 (esdhc_set_clock+0x178)
:    #func                -863    0.500  esdhc_writel_le+0x10 (esdhc_set_clock+0x1b8)
:    #func                -863    0.500  l2x0_cache_sync+0x10 (esdhc_writel_le+0x188)
:    #func                -862    0.500  __ipipe_spin_lock_irqsave+0x10 (l2x0_cache_sync+0x24)
:|   #func                -862!  74.000  __ipipe_spin_unlock_irqrestore+0x10 (l2x0_cache_sync+0x3c)
:|   #func                -788    0.750  __ipipe_grab_irq+0x10 (__irq_svc+0x40)

The timer used (imx timer and not cortex a9 local timer) seem
consistent with the fact that this is an uniprocessor.

period_update does not seem to be triggered by an external IRQ, but
by the timer. A periodic task using rt_task_wait_period in fact.

We can see that the root domain is stalled, so a function is in a
loop, probably in the SD card driver, doing some polling, with local
irqs off. With a masking section of about 74us. Eeek.

In later versions of the I-pipe patch, I have added code to entry.S,
to trace the function which __irq_svc interrupted, if you want, I
can backport these changes. This should be easy.

The complete sequence corresponding to the execution of
period_update can be seen here:

:   +*func                -748    0.750  ipipe_trigger_irq+0x10 (period_update+0x224 [sigmatek_lrt])
:|  +*func                -748    0.500  __ipipe_handle_irq+0x14 (ipipe_trigger_irq+0x64)
:|  +*func                -747    1.000  __ipipe_set_irq_pending+0x10 (__ipipe_handle_irq+0x138)
:   +*func                -746    0.500  rt_task_wait_period+0x10 (timer+0x3c [sigmatek_lrt])
:   +*func                -746    0.750  xnpod_wait_thread_period+0x14 (rt_task_wait_period+0x48)
:|  #*func                -745    0.750  xnpod_suspend_thread+0x14 (xnpod_wait_thread_period+0x94)
:|  #*func                -744    0.500  __xnpod_schedule+0x14 (xnpod_suspend_thread+0x220)
:|  #*[   -1] -<?>-   99  -744    0.250  __xnpod_schedule+0x50 (xnpod_suspend_thread+0x220)
:|  #*func                -743+   1.250  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
:|  #*func                -742    1.000  ipipe_unstall_pipeline_head+0x10 (__xnpod_schedule+0x270)
:   +*func                -741    0.500  xnsched_finish_unlocked_switch+0x10 (__xnpod_schedule+0x38c)
:|  #*[ 1065] WD-Trigg 1  -741+   1.500  __xnpod_schedule+0x3b0 (xnpod_suspend_thread+0x220)
:|  #*func                -739    0.500  xnpod_fire_callouts+0x10 (__xnpod_schedule+0x5fc)
:|  #*func                -739    0.500  taskSwitchXenomai+0x14 [sigmatek_lrt] (xnpod_fire_callouts+0x54)
:|  #*func                -738+   1.250  measureIdleTime+0x10 [sigmatek_lrt] (taskSwitchXenomai+0x6c [sigmatek_lrt])
:|  #*func                -737+   4.500  __ipipe_restore_pipeline_head+0x10 (rtdm_event_timedwait+0x15c)
:   +*func                -732    0.750  __ipipe_syscall_root+0x10 (vector_swi+0x44)
:   +*func                -732    0.500  __ipipe_dispatch_event+0x14 (__ipipe_syscall_root+0xdc)
:|  +*func                -731    1.000  lrtdrv_exception_handler+0x14 [sigmatek_lrt] (__ipipe_dispatch_event+0x40)
:   +*func                -730+   1.250  hisyscall_event+0x14 (__ipipe_dispatch_event+0x110)
:   +*func                -729    0.500  sys_rtdm_ioctl+0x10 (hisyscall_event+0x178)
:   +*func                -728    0.500  __rt_dev_ioctl+0x18 (sys_rtdm_ioctl+0x30)
:   +*func                -728    0.500  rtdm_context_get+0x10 (__rt_dev_ioctl+0x38)
:|  #*func                -727    0.750  __ipipe_restore_pipeline_head+0x10 (rtdm_context_get+0xd8)
:   +*func                -727    0.250  lrt_ioctl+0x10 [sigmatek_lrt] (__rt_dev_ioctl+0x6c)
:   +*func                -726    1.000  lrt_ioctl_work+0x14 [sigmatek_lrt] (lrt_ioctl+0x18 [sigmatek_lrt])
:   +*func                -725    0.500  lrtdrv_timing_wait+0x10 [sigmatek_lrt] (lrt_ioctl_work+0x45c [sigmatek_lrt])
:   +*func                -725    0.500  rtdm_event_wait+0x14 (lrtdrv_timing_wait+0x8c [sigmatek_lrt])
:   +*func                -724    0.500  rtdm_event_timedwait+0x14 (rtdm_event_wait+0x2c)
:|  #*func                -724    0.500  xnsynch_sleep_on+0x14 (rtdm_event_timedwait+0xc4)
:|  #*func                -723    0.500  xnpod_suspend_thread+0x14 (xnsynch_sleep_on+0xd4)
:|  #*func                -723    0.500  __xnpod_schedule+0x14 (xnpod_suspend_thread+0x220)
:|  #*[ 1065] WD-Trigg 1  -722    0.500  __xnpod_schedule+0x50 (xnpod_suspend_thread+0x220)
:|  #*func                -722    0.750  xnsched_pick_next+0x10 (__xnpod_schedule+0xa0)
:|  #*func                -721    0.250  ipipe_unmute_pic+0x10 (__xnpod_schedule+0x1e4)
:|  #*func                -721    1.000  gic_unmute+0x10 (ipipe_unmute_pic+0x18)
:|  #*func                -720+   1.250  ipipe_unstall_pipeline_head+0x10 (__xnpod_schedule+0x270)
:   +*func                -719    0.500  xnsched_finish_unlocked_switch+0x10 (__xnpod_schedule+0x38c)
:|  #*[  700] mmcqd/0 -1  -718    0.750  __xnpod_schedule+0x3b0 (xnintr_clock_handler+0x118)
:|  #*func                -717    0.500  xnpod_fire_callouts+0x10 (__xnpod_schedule+0x5fc)
:|  #*func                -717    0.750  taskSwitchXenomai+0x14 [sigmatek_lrt] (xnpod_fire_callouts+0x54)
:|  #*func                -716    0.750  measureIdleTime+0x10 [sigmatek_lrt] (taskSwitchXenomai+0x6c [sigmatek_lrt])
:|  #*func                -715    1.000  xnarch_tsc_to_ns+0x10 (measureIdleTime+0xac [sigmatek_lrt])
:|   #func                -714    0.750  __ipipe_walk_pipeline+0x10 (__ipipe_dispatch_wired_nocheck+0xa4)
:|   #func                -714! 674.750  __ipipe_exit_irq+0x10 (__ipipe_grab_irq+0x60)
:|   #func                 -39    0.500  __ipipe_grab_irq+0x10 (__irq_svc+0x40)

And here we finally return to root, which continues its polling,
with local irqs off for 674us!. No wonder why  the virq can not be
executed, Linux irqs are disabled. There is no I-pipe bug involved.

-- 
					    Gilles.


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

end of thread, other threads:[~2014-11-14 13:45 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-12  8:47 [Xenomai] rtdm_nrtsig_pend FAQ Johann Obermayr
2014-11-12  9:10 ` Philippe Gerum
2014-11-12  9:20   ` Johann Obermayr
2014-11-12  9:50     ` Philippe Gerum
2014-11-12 10:53       ` Johann Obermayr
2014-11-12 11:30         ` Philippe Gerum
2014-11-12 16:44 ` Gilles Chanteperdrix
2014-11-13 16:30   ` Johann Obermayr
2014-11-13 16:33     ` Gilles Chanteperdrix
2014-11-14  9:53       ` Johann Obermayr
2014-11-14 10:20         ` Gilles Chanteperdrix
2014-11-14 12:37           ` Johann Obermayr
2014-11-14 12:47             ` Gilles Chanteperdrix
2014-11-14 13:05             ` Gilles Chanteperdrix
2014-11-14 13:45             ` 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.