Module: xenomai-jki Branch: for-forge Commit: 9d1f441f3f155a58c2423431e01b875dfa6ef182 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=9d1f441f3f155a58c2423431e01b875dfa6ef182
Author: Jan Kiszka <jan.kis...@siemens.com> Date: Mon Sep 30 20:06:40 2013 +0200 cobalt/intr: Convert intrlock to Linux mutex Callers of xnintr_attach/detach are required to run over Linux already, and /proc output is Linux-only anyway. Moreover, ipipe_request_irq gets unhappy out us holding a primary-domain spinlock when invoking it. So convert intrlock to a Linux mutex to resolve this. Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- kernel/cobalt/intr.c | 25 +++++++++++-------------- 1 files changed, 11 insertions(+), 14 deletions(-) diff --git a/kernel/cobalt/intr.c b/kernel/cobalt/intr.c index b05aeff..7ce36a5 100644 --- a/kernel/cobalt/intr.c +++ b/kernel/cobalt/intr.c @@ -23,6 +23,8 @@ * @{ */ +#include <linux/mutex.h> + #include <cobalt/kernel/sched.h> #include <cobalt/kernel/intr.h> #include <cobalt/kernel/stat.h> @@ -31,7 +33,7 @@ #define XNINTR_MAX_UNHANDLED 1000 -DEFINE_PRIVATE_XNLOCK(intrlock); +DEFINE_MUTEX(intrlock); #ifdef CONFIG_XENO_OPT_STATS xnintr_t nktimer; /* Only for statistics */ @@ -723,7 +725,6 @@ EXPORT_SYMBOL_GPL(xnintr_destroy); int xnintr_attach(xnintr_t *intr, void *cookie) { int ret; - spl_t s; secondary_mode_only(); @@ -737,7 +738,7 @@ int xnintr_attach(xnintr_t *intr, void *cookie) ipipe_set_irq_affinity(intr->irq, nkaffinity); #endif /* CONFIG_SMP */ - xnlock_get_irqsave(&intrlock, s); + mutex_lock(&intrlock); if (intr->flags & XN_ISR_ATTACHED) { ret = -EBUSY; @@ -751,7 +752,7 @@ int xnintr_attach(xnintr_t *intr, void *cookie) intr->flags |= XN_ISR_ATTACHED; stat_counter_inc(); out: - xnlock_put_irqrestore(&intrlock, s); + mutex_unlock(&intrlock); return ret; } @@ -784,13 +785,11 @@ EXPORT_SYMBOL_GPL(xnintr_attach); */ void xnintr_detach(xnintr_t *intr) { - spl_t s; - secondary_mode_only(); trace_mark(xn_nucleus, irq_detach, "irq %u", intr->irq); - xnlock_get_irqsave(&intrlock, s); + mutex_lock(&intrlock); if (intr->flags & XN_ISR_ATTACHED) { intr->flags &= ~XN_ISR_ATTACHED; @@ -798,7 +797,7 @@ void xnintr_detach(xnintr_t *intr) stat_counter_dec(); } - xnlock_put_irqrestore(&intrlock, s); + mutex_unlock(&intrlock); } EXPORT_SYMBOL_GPL(xnintr_detach); @@ -928,7 +927,6 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) xnticks_t last_switch; int ret = 0, cpu; xnintr_t *intr; - spl_t s; for (cpu = iterator->cpu + 1; cpu < num_present_cpus(); ++cpu) { if (cpu_online(cpu)) @@ -938,7 +936,7 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) cpu = 0; iterator->cpu = cpu; - xnlock_get_irqsave(&intrlock, s); + mutex_lock(&intrlock); if (iterator->list_rev != xnintr_list_rev) { ret = -EAGAIN; @@ -980,7 +978,7 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) iterator->prev = intr; unlock_and_exit: - xnlock_put_irqrestore(&intrlock, s); + mutex_unlock(&intrlock); return ret; } @@ -994,7 +992,6 @@ static inline int format_irq_proc(unsigned int irq, struct xnvfile_regular_iterator *it) { struct xnintr *intr; - spl_t s; int cpu; for_each_realtime_cpu(cpu) @@ -1022,7 +1019,7 @@ static inline int format_irq_proc(unsigned int irq, } } - xnlock_get_irqsave(&intrlock, s); + mutex_lock(&intrlock); intr = xnintr_shirq_first(irq); if (intr) { @@ -1035,7 +1032,7 @@ static inline int format_irq_proc(unsigned int irq, } while (intr); } - xnlock_put_irqrestore(&intrlock, s); + mutex_unlock(&intrlock); return 0; } _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git