[Xenomai-git] Jan Kiszka : nucleus: Convert intrlock to a sleeping Linux lock
Module: xenomai-jki Branch: for-upstream Commit: 64b368afe840b8b79afffccc5d199748c7675999 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=64b368afe840b8b79afffccc5d199748c7675999 Author: Jan Kiszka jan.kis...@siemens.com Date: Wed Oct 17 12:49:51 2012 +0200 nucleus: Convert intrlock to a sleeping Linux lock Conceptually, 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 which invalidates that useful internal bug check. So rework the locking for dumping scheduling statistics and convert intrlock to a sleeping Linux variant to avoid the alarm. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- include/nucleus/intr.h |4 ksrc/nucleus/intr.c| 45 + ksrc/nucleus/sched.c | 25 + 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/include/nucleus/intr.h b/include/nucleus/intr.h index 20a625d..8f84f2d 100644 --- a/include/nucleus/intr.h +++ b/include/nucleus/intr.h @@ -131,6 +131,10 @@ void xnintr_affinity(xnintr_t *intr, int xnintr_query_init(xnintr_iterator_t *iterator); +int xnintr_get_query_lock(void); + +void xnintr_put_query_lock(void); + int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf); diff --git a/ksrc/nucleus/intr.c b/ksrc/nucleus/intr.c index 603ae22..09ac71f 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; } @@ -908,6 +906,16 @@ static bool xnintr_is_timer_irq(int irq) } #ifdef CONFIG_XENO_OPT_STATS +int xnintr_get_query_lock(void) +{ + return down_interruptible(intrlock) ? -ERESTARTSYS : 0; +} + +void xnintr_put_query_lock(void) +{ + up(intrlock); +} + int xnintr_query_init(xnintr_iterator_t *iterator) { iterator-cpu = -1; @@ -933,19 +941,13 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) xnintr_t *intr; 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); - - if (iterator-list_rev != xnintr_list_rev) { - err = -EAGAIN; - goto unlock_and_exit; - } + if (iterator-list_rev != xnintr_list_rev) + return -EAGAIN; if (!iterator-prev) { if (xnintr_is_timer_irq(irq)) @@ -958,8 +960,7 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) if (!intr) { cpu_no = -1; iterator-prev = NULL; - err = -ENODEV; - goto unlock_and_exit; + return -ENODEV; } snprintf(name_buf, XNOBJECT_NAME_LEN, IRQ%d: %s, irq, intr-name); @@ -982,10 +983,7 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) if (cpu_no + 1 == xnarch_num_online_cpus()) iterator-prev = intr; - unlock_and_exit: - xnlock_put_irqrestore(intrlock, s); - - return err; + return 0; } #endif /* CONFIG_XENO_OPT_STATS */ @@ -993,7 +991,6 @@ static inline int format_irq_proc(unsigned int irq, struct xnvfile_regular_iterator *it) {
[Xenomai-git] Jan Kiszka : nucleus: Convert intrlock to a sleeping Linux lock
Module: xenomai-jki Branch: for-upstream Commit: 70f89d709aed63eaecc84d56468d8672d16fe784 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=70f89d709aed63eaecc84d56468d8672d16fe784 Author: Jan Kiszka jan.kis...@siemens.com Date: Wed Oct 17 12:49:51 2012 +0200 nucleus: Convert intrlock to a sleeping Linux lock Conceptually, 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 which invalidates that useful internal bug check. So rework the locking for dumping scheduling statistics and convert intrlock to a sleeping Linux variant to avoid the alarm. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- include/nucleus/intr.h |4 ksrc/nucleus/intr.c| 45 + ksrc/nucleus/sched.c | 25 + 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/include/nucleus/intr.h b/include/nucleus/intr.h index 20a625d..8f84f2d 100644 --- a/include/nucleus/intr.h +++ b/include/nucleus/intr.h @@ -131,6 +131,10 @@ void xnintr_affinity(xnintr_t *intr, int xnintr_query_init(xnintr_iterator_t *iterator); +int xnintr_get_query_lock(void); + +void xnintr_put_query_lock(void); + int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf); diff --git a/ksrc/nucleus/intr.c b/ksrc/nucleus/intr.c index 603ae22..09ac71f 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; } @@ -908,6 +906,16 @@ static bool xnintr_is_timer_irq(int irq) } #ifdef CONFIG_XENO_OPT_STATS +int xnintr_get_query_lock(void) +{ + return down_interruptible(intrlock) ? -ERESTARTSYS : 0; +} + +void xnintr_put_query_lock(void) +{ + up(intrlock); +} + int xnintr_query_init(xnintr_iterator_t *iterator) { iterator-cpu = -1; @@ -933,19 +941,13 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) xnintr_t *intr; 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); - - if (iterator-list_rev != xnintr_list_rev) { - err = -EAGAIN; - goto unlock_and_exit; - } + if (iterator-list_rev != xnintr_list_rev) + return -EAGAIN; if (!iterator-prev) { if (xnintr_is_timer_irq(irq)) @@ -958,8 +960,7 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) if (!intr) { cpu_no = -1; iterator-prev = NULL; - err = -ENODEV; - goto unlock_and_exit; + return -ENODEV; } snprintf(name_buf, XNOBJECT_NAME_LEN, IRQ%d: %s, irq, intr-name); @@ -982,10 +983,7 @@ int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) if (cpu_no + 1 == xnarch_num_online_cpus()) iterator-prev = intr; - unlock_and_exit: - xnlock_put_irqrestore(intrlock, s); - - return err; + return 0; } #endif /* CONFIG_XENO_OPT_STATS */ @@ -993,7 +991,6 @@ static inline int format_irq_proc(unsigned int irq, struct xnvfile_regular_iterator *it) {