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