* [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.