All users of this lock are supposed to run over Linux context already.
Moreover, latest I-pipe patches complain that ipipe_virtualize_irq is
called with the Xenomai domain stalled. So convert this lock to a
sleeping Linux variant to avoid that alarm.

Signed-off-by: Jan Kiszka <[email protected]>
---
 ksrc/nucleus/intr.c |   22 +++++++++-------------
 1 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/ksrc/nucleus/intr.c b/ksrc/nucleus/intr.c
index c75fcac..4747de1 100644
--- a/ksrc/nucleus/intr.c
+++ b/ksrc/nucleus/intr.c
@@ -39,7 +39,7 @@
 
 #define XNINTR_MAX_UNHANDLED   1000
 
-DEFINE_PRIVATE_XNLOCK(intrlock);
+static DEFINE_BINARY_SEMAPHORE(intrlock);
 
 #ifdef CONFIG_XENO_OPT_STATS
 xnintr_t nkclock;           /* Only for statistics */
@@ -709,7 +709,6 @@ EXPORT_SYMBOL_GPL(xnintr_destroy);
 int xnintr_attach(xnintr_t *intr, void *cookie)
 {
        int ret;
-       spl_t s;
 
        trace_mark(xn_nucleus, irq_attach, "irq %u name %s",
                   intr->irq, intr->name);
@@ -721,7 +720,7 @@ int xnintr_attach(xnintr_t *intr, void *cookie)
        xnarch_set_irq_affinity(intr->irq, nkaffinity);
 #endif /* CONFIG_SMP */
 
-       xnlock_get_irqsave(&intrlock, s);
+       down(&intrlock);
 
        if (__testbits(intr->flags, XN_ISR_ATTACHED)) {
                ret = -EBUSY;
@@ -735,7 +734,7 @@ int xnintr_attach(xnintr_t *intr, void *cookie)
        __setbits(intr->flags, XN_ISR_ATTACHED);
        xnintr_stat_counter_inc();
 out:
-       xnlock_put_irqrestore(&intrlock, s);
+       up(&intrlock);
 
        return ret;
 }
@@ -775,11 +774,10 @@ EXPORT_SYMBOL_GPL(xnintr_attach);
 int xnintr_detach(xnintr_t *intr)
 {
        int ret;
-       spl_t s;
 
        trace_mark(xn_nucleus, irq_detach, "irq %u", intr->irq);
 
-       xnlock_get_irqsave(&intrlock, s);
+       down(&intrlock);
 
        if (!__testbits(intr->flags, XN_ISR_ATTACHED)) {
                ret = -EINVAL;
@@ -794,7 +792,7 @@ int xnintr_detach(xnintr_t *intr)
 
        xnintr_stat_counter_dec();
  out:
-       xnlock_put_irqrestore(&intrlock, s);
+       up(&intrlock);
 
        return ret;
 }
@@ -920,13 +918,12 @@ int xnintr_query_next(int irq, xnintr_iterator_t 
*iterator, char *name_buf)
        xnticks_t last_switch;
        int cpu_no = iterator->cpu + 1;
        int err = 0;
-       spl_t s;
 
        if (cpu_no == xnarch_num_online_cpus())
                cpu_no = 0;
        iterator->cpu = cpu_no;
 
-       xnlock_get_irqsave(&intrlock, s);
+       down(&intrlock);
 
        if (iterator->list_rev != xnintr_list_rev) {
                err = -EAGAIN;
@@ -969,7 +966,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);
+       up(&intrlock);
 
        return err;
 }
@@ -983,7 +980,6 @@ static inline int format_irq_proc(unsigned int irq,
                                  struct xnvfile_regular_iterator *it)
 {
        struct xnintr *intr;
-       spl_t s;
 
        if (irq == XNARCH_TIMER_IRQ) {
                xnvfile_puts(it, "         [timer]");
@@ -1005,7 +1001,7 @@ static inline int format_irq_proc(unsigned int irq,
                return 0;
        }
 
-       xnlock_get_irqsave(&intrlock, s);
+       down(&intrlock);
 
        intr = xnintr_shirq_first(irq);
        if (intr) {
@@ -1018,7 +1014,7 @@ static inline int format_irq_proc(unsigned int irq,
                } while (intr);
        }
 
-       xnlock_put_irqrestore(&intrlock, s);
+       up(&intrlock);
 
        return 0;
 }
-- 
1.7.3.4

_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai

Reply via email to