Module: xenomai-gch
Branch: for-forge
Commit: 84005b6114645befb4a8c0ae0263b428bc5d313f
URL:    
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=84005b6114645befb4a8c0ae0263b428bc5d313f

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Sun Oct 11 19:10:23 2015 +0200

cobalt/sched: bypass scheduler lock in irq

---

 kernel/cobalt/sched.c |   20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index 56014e0..47474f7 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -322,7 +322,14 @@ struct xnsched *xnsched_finish_unlocked_switch(struct 
xnsched *sched)
 
 void xnsched_lock(void)
 {
-       struct xnthread *curr = xnthread_current();
+       struct xnsched *sched = xnsched_current();
+       struct xnthread *curr = sched->curr;
+
+       /*
+        * In IRQ: scheduler already locked
+        */
+       if (sched->lflags & XNINIRQ)
+               return;
 
        /*
         * CAUTION: The fast xnthread_current() accessor carries the
@@ -334,7 +341,7 @@ void xnsched_lock(void)
         */
        if (unlikely(curr == NULL || xnthread_test_state(curr, XNRELAX))) {
                irqoff_only();
-               curr = &xnsched_current()->rootcb;
+               curr = &sched->rootcb;
                XENO_BUG_ON(COBALT, xnsched_current()->curr != curr);
        }
 
@@ -344,7 +351,14 @@ EXPORT_SYMBOL_GPL(xnsched_lock);
 
 void xnsched_unlock(void)
 {
-       struct xnthread *curr = xnthread_current();
+       struct xnsched *sched = xnsched_current();
+       struct xnthread *curr = sched->curr;
+
+       /*
+        * In IRQ
+        */
+       if (sched->lflags & XNINIRQ)
+               return;
 
        if (unlikely(curr == NULL || xnthread_test_state(curr, XNRELAX))) {
                irqoff_only();


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

Reply via email to