Module: xenomai-3
Branch: stable-3.0.x
Commit: 7d2d5b81f7aafb87458f2fc77b32eb68ebdba010
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7d2d5b81f7aafb87458f2fc77b32eb68ebdba010

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Mar  2 12:08:32 2016 +0100

cobalt/timer: allow binding core timers to passive CPUs

Some timers initialized by the Cobalt core may have a valid reason to
live on CPUs excluded from the real-time set. A typical example would
be the host timer from the scheduler slot, which relays ticks to the
regular kernel. Other core timers are just better dealt with when
created and left passive on those CPUs.

Mark all core timers specifically, and exclude them from the LART
detection code in __xntimer_init(). This fixes a spurious Cobalt debug
assertion seen on SMP at boot, when the real-time CPU set is
restricted to a subset of the online CPU set.

---

 include/cobalt/kernel/timer.h |    4 +++-
 kernel/cobalt/sched.c         |    6 +++---
 kernel/cobalt/thread.c        |    2 ++
 kernel/cobalt/timer.c         |    9 ++++++---
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/include/cobalt/kernel/timer.h b/include/cobalt/kernel/timer.h
index 00aa411..5868fcb 100644
--- a/include/cobalt/kernel/timer.h
+++ b/include/cobalt/kernel/timer.h
@@ -51,11 +51,13 @@ typedef enum xntmode {
 #define XNTIMER_RUNNING   0x00000040
 #define XNTIMER_KGRAVITY  0x00000080
 #define XNTIMER_UGRAVITY  0x00000100
-#define XNTIMER_IGRAVITY  0    /* most conservative */
+#define XNTIMER_IGRAVITY  0         /* most conservative */
 
 #define XNTIMER_GRAVITY_MASK   (XNTIMER_KGRAVITY|XNTIMER_UGRAVITY)
 #define XNTIMER_INIT_MASK      (XNTIMER_GRAVITY_MASK|XNTIMER_NOBLCK)
 
+#define __XNTIMER_CORE    0x10000000
+
 /* These flags are available to the real-time interfaces */
 #define XNTIMER_SPARE0  0x01000000
 #define XNTIMER_SPARE1  0x02000000
diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index d8c594c..033b124 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -193,11 +193,11 @@ void xnsched_init(struct xnsched *sched, int cpu)
         * exit code.
         */
        xntimer_init(&sched->htimer, &nkclock, NULL,
-                    sched, XNTIMER_IGRAVITY);
+                    sched, XNTIMER_IGRAVITY|__XNTIMER_CORE);
        xntimer_set_priority(&sched->htimer, XNTIMER_LOPRIO);
        xntimer_set_name(&sched->htimer, htimer_name);
        xntimer_init(&sched->rrbtimer, &nkclock, roundrobin_handler,
-                    sched, XNTIMER_IGRAVITY);
+                    sched, XNTIMER_IGRAVITY|__XNTIMER_CORE);
        xntimer_set_name(&sched->rrbtimer, rrbtimer_name);
        xntimer_set_priority(&sched->rrbtimer, XNTIMER_LOPRIO);
 
@@ -212,7 +212,7 @@ void xnsched_init(struct xnsched *sched, int cpu)
 
 #ifdef CONFIG_XENO_OPT_WATCHDOG
        xntimer_init(&sched->wdtimer, &nkclock, watchdog_handler,
-                    sched, XNTIMER_NOBLCK|XNTIMER_IGRAVITY);
+                    sched, XNTIMER_NOBLCK|XNTIMER_IGRAVITY|__XNTIMER_CORE);
        xntimer_set_name(&sched->wdtimer, "[watchdog]");
        xntimer_set_priority(&sched->wdtimer, XNTIMER_LOPRIO);
 #endif /* CONFIG_XENO_OPT_WATCHDOG */
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index aaf868a..3e29b3e 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -202,6 +202,8 @@ int __xnthread_init(struct xnthread *thread,
        init_completion(&thread->exited);
 
        gravity = flags & XNUSER ? XNTIMER_UGRAVITY : XNTIMER_KGRAVITY;
+       if (flags & XNROOT)
+               gravity |= __XNTIMER_CORE;
        xntimer_init(&thread->rtimer, &nkclock, timeout_handler,
                     sched, gravity);
        xntimer_set_name(&thread->rtimer, thread->name);
diff --git a/kernel/cobalt/timer.c b/kernel/cobalt/timer.c
index 3e85a53..ee16198 100644
--- a/kernel/cobalt/timer.c
+++ b/kernel/cobalt/timer.c
@@ -363,10 +363,13 @@ void __xntimer_init(struct xntimer *timer,
                 * clock device on the CPU served by the specified
                 * scheduler slot. This reveals a CPU affinity
                 * mismatch between the clock hardware and the client
-                * code initializing the timer.
+                * code initializing the timer. This check excludes
+                * core timers which may have their own reason to bind
+                * to a passive CPU (e.g. host timer).
                 */
-               XENO_WARN_ON_SMP(COBALT, !cpumask_test_cpu(xnsched_cpu(sched),
-                                              &clock->affinity));
+               XENO_WARN_ON_SMP(COBALT, !(flags & __XNTIMER_CORE) &&
+                                !cpumask_test_cpu(xnsched_cpu(sched),
+                                                  &clock->affinity));
                timer->sched = sched;
        } else {
                cpu = xnclock_get_default_cpu(clock, 0);


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to