Gilles Chanteperdrix wrote:
Gilles Chanteperdrix wrote:
Jan Kiszka wrote:
Am 05.11.2010 00:25, Gilles Chanteperdrix wrote:
Jan Kiszka wrote:
Am 04.11.2010 23:08, Gilles Chanteperdrix wrote:
Jan Kiszka wrote:
rework. Safer for now is likely to revert 56ff4329ff, keeping nucleus
debugging off.
That is not enough.
It is, I've reviewed the code today.
The fallouts I am talking about are:
47dac49c71e89b684203e854d1b0172ecacbc555
Not related.

38f2ca83a8e63cc94eaa911ff1c0940c884b5078
An optimization.

5e7cfa5c25672e4478a721eadbd6f6c5b4f88a2f
That fall out of that commit is fixed in my series.

This commit was followed by several others to "fix
the fix". You know how things are, someone proposes a fix, which fixes
things for him, but it breaks in the other people configurations (one of
the fallouts was a complete revamp of include/asm-arm/atomic.h for
instance).

I've pushed a series that reverts that commit, then fixes and cleans up
on top of it. Just pushed if you want to take a look. We can find some
alternative debugging mechanism independently (though I'm curious to see
it - it still makes no sense to me).
Since the fix is simply a modification to what we have currently. I
would prefer if we did not remove it. In fact, I think it would be
simpler if we started from what we currently have than reverting past
patches.
Look at the series, it goes step by step to an IMHO clean state. We can
pull out the debugging check removal, though, if you prefer to work on
top of the existing code.
From my point of view, Anders looks for something that works, so following the rules that the minimal set of changes minimize the chances of introducing new bugs while cleaning, I would go for the minimal set of changes, such as:

The tested one (on SMP, and UP with and without unlocked ctx switch):

diff --git a/include/nucleus/sched.h b/include/nucleus/sched.h
index df56417..8888cf4 100644
--- a/include/nucleus/sched.h
+++ b/include/nucleus/sched.h
@@ -165,28 +165,27 @@ struct xnsched_class {
 #endif /* CONFIG_SMP */
/* Test all resched flags from the given scheduler mask. */
-static inline int xnsched_resched_p(struct xnsched *sched)
+static inline int xnsched_remote_resched_p(struct xnsched *sched)
 {
-       return testbits(sched->status, XNRESCHED);
+       return !xnarch_cpus_empty(sched->resched);
 }
-static inline int xnsched_self_resched_p(struct xnsched *sched)
+static inline int xnsched_resched_p(struct xnsched *sched)
 {
        return testbits(sched->status, XNRESCHED);
 }
/* Set self resched flag for the given scheduler. */
 #define xnsched_set_self_resched(__sched__) do {               \
-  setbits((__sched__)->status, XNRESCHED);                  \
+  __setbits((__sched__)->status, XNRESCHED);                        \
 } while (0)
/* Set specific resched flag into the local scheduler mask. */
 #define xnsched_set_resched(__sched__) do {                            \
   xnsched_t *current_sched = xnpod_current_sched();                    \
-  setbits(current_sched->status, XNRESCHED);                                \
+  __setbits(current_sched->status, XNRESCHED);                              \
   if (current_sched != (__sched__))    {                               \
       xnarch_cpu_set(xnsched_cpu(__sched__), current_sched->resched);       \
-      setbits((__sched__)->status, XNRESCHED);                              \
   }                                                                    \
 } while (0)
diff --git a/ksrc/nucleus/pod.c b/ksrc/nucleus/pod.c
index 862838c..4cb707a 100644
--- a/ksrc/nucleus/pod.c
+++ b/ksrc/nucleus/pod.c
@@ -276,18 +276,16 @@ EXPORT_SYMBOL_GPL(xnpod_fatal_helper);
void xnpod_schedule_handler(void) /* Called with hw interrupts off. */
 {
-       xnsched_t *sched;
+       xnsched_t *sched = xnpod_current_sched();
trace_mark(xn_nucleus, sched_remote, MARK_NOARGS);
 #if defined(CONFIG_SMP) && defined(CONFIG_XENO_OPT_PRIOCPL)
-       sched = xnpod_current_sched();
        if (testbits(sched->status, XNRPICK)) {
                clrbits(sched->status, XNRPICK);
                xnshadow_rpi_check();
        }
-#else
-       (void)sched;
 #endif /* CONFIG_SMP && CONFIG_XENO_OPT_PRIOCPL */
+       xnsched_set_self_resched(sched);
        xnpod_schedule();
 }
@@ -2174,7 +2172,7 @@ static inline int __xnpod_test_resched(struct xnsched *sched)
        int resched = testbits(sched->status, XNRESCHED);
 #ifdef CONFIG_SMP
        /* Send resched IPI to remote CPU(s). */
-       if (unlikely(xnsched_resched_p(sched))) {
+       if (unlikely(xnsched_remote_resched_p(sched))) {
                xnarch_send_ipi(sched->resched);
                xnarch_cpus_clear(sched->resched);
        }
diff --git a/ksrc/nucleus/timer.c b/ksrc/nucleus/timer.c
index 1fe3331..a0ac627 100644
--- a/ksrc/nucleus/timer.c
+++ b/ksrc/nucleus/timer.c
@@ -97,7 +97,7 @@ void xntimer_next_local_shot(xnsched_t *sched)
        __clrbits(sched->status, XNHDEFER);
        timer = aplink2timer(h);
        if (unlikely(timer == &sched->htimer)) {
-               if (xnsched_self_resched_p(sched) ||
+               if (xnsched_resched_p(sched) ||
                    !xnthread_test_state(sched->curr, XNROOT)) {
                        h = xntimerq_it_next(&sched->timerqueue, &it, h);
                        if (h) {


Looks very similar to what I have succesfully been running on top of 2.5.5.2 (aka 2.5.5.3 beta :-) ), except that I didn't change any names (changes makes perfect sense).

/Anders

diff -ur xenomai-2.5.5.2/include/nucleus/sched.h 
xenomai-2.5.5.2.new/include/nucleus/sched.h
--- xenomai-2.5.5.2/include/nucleus/sched.h     2010-10-03 14:35:17.000000000 
+0200
+++ xenomai-2.5.5.2.new/include/nucleus/sched.h 2010-11-04 15:58:48.000000000 
+0100
@@ -185,7 +185,6 @@
   setbits(current_sched->status, XNRESCHED);                           \
   if (current_sched != (__sched__))    {                               \
       xnarch_cpu_set(xnsched_cpu(__sched__), current_sched->resched);  \
-      setbits((__sched__)->status, XNRESCHED);                         \
   }                                                                    \
 } while (0)
 
diff -ur xenomai-2.5.5.2/ksrc/nucleus/pod.c 
xenomai-2.5.5.2.new/ksrc/nucleus/pod.c
--- xenomai-2.5.5.2/ksrc/nucleus/pod.c  2010-10-03 14:35:17.000000000 +0200
+++ xenomai-2.5.5.2.new/ksrc/nucleus/pod.c      2010-11-04 16:01:37.000000000 
+0100
@@ -279,15 +279,14 @@
        xnsched_t *sched;
 
        trace_mark(xn_nucleus, sched_remote, MARK_NOARGS);
-#if defined(CONFIG_SMP) && defined(CONFIG_XENO_OPT_PRIOCPL)
        sched = xnpod_current_sched();
+#if defined(CONFIG_SMP) && defined(CONFIG_XENO_OPT_PRIOCPL)
        if (testbits(sched->status, XNRPICK)) {
                clrbits(sched->status, XNRPICK);
                xnshadow_rpi_check();
        }
-#else
-       (void)sched;
 #endif /* CONFIG_SMP && CONFIG_XENO_OPT_PRIOCPL */
+       xnsched_set_resched(sched);
        xnpod_schedule();
 }
 
_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to