Re: [Xenomai-core] [PATCH] Revert broken edge_shirq optimisation

2007-07-31 Thread Philippe Gerum
On Tue, 2007-07-31 at 20:17 +0200, Jan Kiszka wrote:
> Jan Kiszka wrote:
> > Oh my dear. The ground may open and swallow me. This crappy piece of
> > optimisation in xnintr_edge_shirq_handler() I introduced both to 2.4 and
> > (sadly) the 2.3.x stable series cannot work. It must stay as it used to:
> > 
> > --- ksrc/nucleus/intr.c (revision 2871)
> > +++ ksrc/nucleus/intr.c (working copy)
> > @@ -296,15 +296,15 @@ static void xnintr_edge_shirq_handler(un
> > s |= ret;
> > 
> > if (code == XN_ISR_HANDLED) {
> > -   if (!(end = (intr->next)))
> > -   end = shirq->handlers;
> > +   end = NULL;
> > xnstat_counter_inc(
> > &intr->stat[xnsched_cpu(sched)].hits);
> > xnstat_runtime_lazy_switch(sched,
> > &intr->stat[xnsched_cpu(sched)].account,
> > start);
> > start = xnstat_runtime_now();
> > -   }
> > +   } else if (code == XN_ISR_NONE && end == NULL)
> > +   end = intr;
> > 
> > if (counter++ > MAX_EDGEIRQ_COUNTER)
> > break;
> > (that's for 2.3.x)
> 
> For 2.4, one may consider to assume now that "code != XN_ISR_HANDLE =>
> code == XN_ISR_NONE":
> 

Merged, thanks.

> --- ksrc/nucleus/intr.c   (revision 2871)
> +++ ksrc/nucleus/intr.c   (working copy)
> @@ -251,15 +251,15 @@ static void xnintr_edge_shirq_handler(un
>   s |= ret;
> 
>   if (code == XN_ISR_HANDLED) {
> - if (!(end = (intr->next)))
> - end = shirq->handlers;
> + end = NULL;
>   xnstat_counter_inc(
>   &intr->stat[xnsched_cpu(sched)].hits);
>   xnstat_exectime_lazy_switch(sched,
>   &intr->stat[xnsched_cpu(sched)].account,
>   start);
>   start = xnstat_exectime_now();
> - }
> + } else if (end == NULL)
> + end = intr;
> 
>   if (counter++ > MAX_EDGEIRQ_COUNTER)
>   break;
> 
> Jan
> 
-- 
Philippe.



___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core


Re: [Xenomai-core] [PATCH] Revert broken edge_shirq optimisation

2007-07-31 Thread Philippe Gerum
On Tue, 2007-07-31 at 20:05 +0200, Jan Kiszka wrote:
> Oh my dear. The ground may open and swallow me. This crappy piece of
> optimisation in xnintr_edge_shirq_handler() I introduced both to 2.4 and
> (sadly) the 2.3.x stable series cannot work. It must stay as it used to:
> 
> --- ksrc/nucleus/intr.c   (revision 2871)
> +++ ksrc/nucleus/intr.c   (working copy)
> @@ -296,15 +296,15 @@ static void xnintr_edge_shirq_handler(un
>   s |= ret;
> 
>   if (code == XN_ISR_HANDLED) {
> - if (!(end = (intr->next)))
> - end = shirq->handlers;
> + end = NULL;
>   xnstat_counter_inc(
>   &intr->stat[xnsched_cpu(sched)].hits);
>   xnstat_runtime_lazy_switch(sched,
>   &intr->stat[xnsched_cpu(sched)].account,
>   start);
>   start = xnstat_runtime_now();
> - }
> + } else if (code == XN_ISR_NONE && end == NULL)
> + end = intr;
> 
>   if (counter++ > MAX_EDGEIRQ_COUNTER)
>   break;
> (that's for 2.3.x)
> 
> Once "end" is moved forward to the next handler in the chain, the loop
> termination condition "intr==end" will trigger on the immediately
> following round, even if there are still events pending. Utterly broken.
> 
> Philippe, please quickly apply -- and don't tell anyone who did this.
> 

No problem. Nobody will know, outside of the Internet, that is.

> Jan
> 
-- 
Philippe.



___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core


Re: [Xenomai-core] [PATCH] Revert broken edge_shirq optimisation

2007-07-31 Thread Jan Kiszka
Jan Kiszka wrote:
> Oh my dear. The ground may open and swallow me. This crappy piece of
> optimisation in xnintr_edge_shirq_handler() I introduced both to 2.4 and
> (sadly) the 2.3.x stable series cannot work. It must stay as it used to:
> 
> --- ksrc/nucleus/intr.c   (revision 2871)
> +++ ksrc/nucleus/intr.c   (working copy)
> @@ -296,15 +296,15 @@ static void xnintr_edge_shirq_handler(un
>   s |= ret;
> 
>   if (code == XN_ISR_HANDLED) {
> - if (!(end = (intr->next)))
> - end = shirq->handlers;
> + end = NULL;
>   xnstat_counter_inc(
>   &intr->stat[xnsched_cpu(sched)].hits);
>   xnstat_runtime_lazy_switch(sched,
>   &intr->stat[xnsched_cpu(sched)].account,
>   start);
>   start = xnstat_runtime_now();
> - }
> + } else if (code == XN_ISR_NONE && end == NULL)
> + end = intr;
> 
>   if (counter++ > MAX_EDGEIRQ_COUNTER)
>   break;
> (that's for 2.3.x)

For 2.4, one may consider to assume now that "code != XN_ISR_HANDLE =>
code == XN_ISR_NONE":

--- ksrc/nucleus/intr.c (revision 2871)
+++ ksrc/nucleus/intr.c (working copy)
@@ -251,15 +251,15 @@ static void xnintr_edge_shirq_handler(un
s |= ret;

if (code == XN_ISR_HANDLED) {
-   if (!(end = (intr->next)))
-   end = shirq->handlers;
+   end = NULL;
xnstat_counter_inc(
&intr->stat[xnsched_cpu(sched)].hits);
xnstat_exectime_lazy_switch(sched,
&intr->stat[xnsched_cpu(sched)].account,
start);
start = xnstat_exectime_now();
-   }
+   } else if (end == NULL)
+   end = intr;

if (counter++ > MAX_EDGEIRQ_COUNTER)
break;

Jan



signature.asc
Description: OpenPGP digital signature
___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core


[Xenomai-core] [PATCH] Revert broken edge_shirq optimisation

2007-07-31 Thread Jan Kiszka
Oh my dear. The ground may open and swallow me. This crappy piece of
optimisation in xnintr_edge_shirq_handler() I introduced both to 2.4 and
(sadly) the 2.3.x stable series cannot work. It must stay as it used to:

--- ksrc/nucleus/intr.c (revision 2871)
+++ ksrc/nucleus/intr.c (working copy)
@@ -296,15 +296,15 @@ static void xnintr_edge_shirq_handler(un
s |= ret;

if (code == XN_ISR_HANDLED) {
-   if (!(end = (intr->next)))
-   end = shirq->handlers;
+   end = NULL;
xnstat_counter_inc(
&intr->stat[xnsched_cpu(sched)].hits);
xnstat_runtime_lazy_switch(sched,
&intr->stat[xnsched_cpu(sched)].account,
start);
start = xnstat_runtime_now();
-   }
+   } else if (code == XN_ISR_NONE && end == NULL)
+   end = intr;

if (counter++ > MAX_EDGEIRQ_COUNTER)
break;
(that's for 2.3.x)

Once "end" is moved forward to the next handler in the chain, the loop
termination condition "intr==end" will trigger on the immediately
following round, even if there are still events pending. Utterly broken.

Philippe, please quickly apply -- and don't tell anyone who did this.

Jan



signature.asc
Description: OpenPGP digital signature
___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core