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

Reply via email to