[Xenomai-git] Jan Kiszka : cobalt/kernel: Provide uninterruptible xnthread_join for RTDM use cases
Module: xenomai-jki Branch: for-upstream Commit: af0687ceac0fabf06b0d067a218239d837724964 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=af0687ceac0fabf06b0d067a218239d837724964 Author: Jan Kiszka jan.kis...@siemens.com Date: Wed Nov 20 19:49:38 2013 +0100 cobalt/kernel: Provide uninterruptible xnthread_join for RTDM use cases The semantics of rtdm_task_destroy and rtdm_task_join mandate that the specified task is truly history by the time these functions return. And that has to include the case that the caller has a Linux signal pending. Thus, we need a variant of xnthread_join that waits unconditionally for thread termination. This fixes rare crashes when terminating switchtest early. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- include/cobalt/kernel/thread.h |2 +- include/rtdm/rtdm_driver.h |2 +- kernel/cobalt/posix/thread.c |2 +- kernel/cobalt/rtdm/drvlib.c|2 +- kernel/cobalt/thread.c |7 +-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h index aa2fd46..6328049 100644 --- a/include/cobalt/kernel/thread.h +++ b/include/cobalt/kernel/thread.h @@ -417,7 +417,7 @@ int xnthread_set_slice(struct xnthread *thread, void xnthread_cancel(struct xnthread *thread); -int xnthread_join(struct xnthread *thread); +int xnthread_join(struct xnthread *thread, bool uninterruptible); #ifdef CONFIG_SMP int xnthread_migrate(int cpu); diff --git a/include/rtdm/rtdm_driver.h b/include/rtdm/rtdm_driver.h index 3c8c270..71a03ab 100644 --- a/include/rtdm/rtdm_driver.h +++ b/include/rtdm/rtdm_driver.h @@ -1094,7 +1094,7 @@ void rtdm_task_busy_sleep(nanosecs_rel_t delay); static inline void rtdm_task_destroy(rtdm_task_t *task) { xnthread_cancel(task); - xnthread_join(task); + xnthread_join(task, true); } static inline int rtdm_task_should_stop(void) diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c index 7ba91fc..75fc1f1 100644 --- a/kernel/cobalt/posix/thread.c +++ b/kernel/cobalt/posix/thread.c @@ -1108,7 +1108,7 @@ int cobalt_thread_join(unsigned long pth) if (thread == NULL) return -ESRCH; - return xnthread_join(thread-threadbase); + return xnthread_join(thread-threadbase, false); } int cobalt_thread_stat(pid_t pid, diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c index 30ea6a3..bd35f9a 100644 --- a/kernel/cobalt/rtdm/drvlib.c +++ b/kernel/cobalt/rtdm/drvlib.c @@ -445,7 +445,7 @@ void rtdm_task_join_nrt(rtdm_task_t *task, unsigned int poll_delay) trace_mark(xn_rtdm, task_joinnrt, thread %p poll_delay %u, task, poll_delay); - xnthread_join(task); + xnthread_join(task, true); } EXPORT_SYMBOL_GPL(rtdm_task_join_nrt); diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c index a6cb852..76a2443 100644 --- a/kernel/cobalt/thread.c +++ b/kernel/cobalt/thread.c @@ -1583,7 +1583,7 @@ EXPORT_SYMBOL_GPL(xnthread_cancel); * Rescheduling: always if @a thread did not terminate yet at the time * of the call. */ -int xnthread_join(struct xnthread *thread) +int xnthread_join(struct xnthread *thread, bool uninterruptible) { unsigned int tag; spl_t s; @@ -1616,7 +1616,10 @@ int xnthread_join(struct xnthread *thread) * wait queue is quite unlikely. In any case, we run in * secondary mode. */ - if (wait_event_interruptible(nkjoinq, thread-idtag != tag)) { + if (uninterruptible) + wait_event(nkjoinq, thread-idtag != tag); + else if (wait_event_interruptible(nkjoinq, + thread-idtag != tag)) { xnlock_get_irqsave(nklock, s); if (thread-idtag == tag) xnthread_clear_state(thread, XNJOINED); ___ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : switchtest: Bail out early from rtswitch_ktask on termination
Module: xenomai-jki Branch: for-upstream Commit: a9b06c6aab1d599a08c0a41b3963d062b7836f25 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=a9b06c6aab1d599a08c0a41b3963d062b7836f25 Author: Jan Kiszka jan.kis...@siemens.com Date: Mon Nov 18 19:08:11 2013 +0100 switchtest: Bail out early from rtswitch_ktask on termination rtswitch_pend_rt may have been interrupted if the task is supposed to stop. Reorder the test for this in order to avoid starting to run on invalid data. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- kernel/drivers/testing/switchtest.c |5 + 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/kernel/drivers/testing/switchtest.c b/kernel/drivers/testing/switchtest.c index 6f77ee9..8850962 100644 --- a/kernel/drivers/testing/switchtest.c +++ b/kernel/drivers/testing/switchtest.c @@ -400,7 +400,7 @@ static void rtswitch_ktask(void *cookie) rtswitch_pend_rt(ctx, task-base.index); - for(;;) { + while (!rtdm_task_should_stop()) { if (task-base.flags RTTST_SWTEST_USE_FPU) fp_regs_set(fp_features, task-base.index + i * 1000); @@ -433,9 +433,6 @@ static void rtswitch_ktask(void *cookie) } } - if (rtdm_task_should_stop()) - break; - if (++i == 400) i = 0; } ___ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : cobalt/kernel: clean up timers on __xnthread_init errors
Module: xenomai-jki Branch: for-upstream Commit: 6bcd7cf354306bbcc35439b6090c02eb522bd6e6 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=6bcd7cf354306bbcc35439b6090c02eb522bd6e6 Author: Jan Kiszka jan.kis...@siemens.com Date: Mon Nov 18 18:50:54 2013 +0100 cobalt/kernel: clean up timers on __xnthread_init errors Initializes timers may have been registered for statistical purposes, so we must not leave them hanging around if __xnthread_init fails. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- kernel/cobalt/thread.c | 15 --- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c index 00d6c41..a6cb852 100644 --- a/kernel/cobalt/thread.c +++ b/kernel/cobalt/thread.c @@ -197,14 +197,23 @@ int __xnthread_init(struct xnthread *thread, thread-init_schedparam = *sched_param; ret = xnsched_init_thread(thread); if (ret) - return ret; + goto err_out; ret = xnsched_set_policy(thread, sched_class, sched_param); if (ret) - return ret; + goto err_out; - if ((flags (XNUSER|XNROOT)) == 0) + if ((flags (XNUSER|XNROOT)) == 0) { ret = spawn_kthread(thread); + if (ret) + goto err_out; + } + + return 0; + +err_out: + xntimer_destroy(thread-rtimer); + xntimer_destroy(thread-ptimer); return ret; } ___ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : switchtest: Avoid clashes RTSWITCH_* vs. RTTST_SWTEST_* constants
Module: xenomai-jki Branch: for-upstream Commit: b17667d52d3da2e6e8271a54a157d2d6b4796934 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=b17667d52d3da2e6e8271a54a157d2d6b4796934 Author: Jan Kiszka jan.kis...@siemens.com Date: Wed Nov 20 19:53:12 2013 +0100 switchtest: Avoid clashes RTSWITCH_* vs. RTTST_SWTEST_* constants Namely RTTST_SWTEST_FREEZE and RTSWITCH_RT were using the same value. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- kernel/drivers/testing/switchtest.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/drivers/testing/switchtest.c b/kernel/drivers/testing/switchtest.c index 8850962..836194b 100644 --- a/kernel/drivers/testing/switchtest.c +++ b/kernel/drivers/testing/switchtest.c @@ -8,9 +8,9 @@ #include rtdm/rtdm_driver.h #include asm/xenomai/fptest.h -#define RTSWITCH_RT 0x4 +#define RTSWITCH_RT 0x1 #define RTSWITCH_NRT 0 -#define RTSWITCH_KERNEL 0x8 +#define RTSWITCH_KERNEL 0x2 typedef struct { struct rttst_swtest_task base; ___ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Gernot Hillier : Silence unused_result warning from write()
Module: xenomai-jki Branch: for-upstream Commit: 18343ac81a85e0d6123024729bbe520ac257ebd2 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=18343ac81a85e0d6123024729bbe520ac257ebd2 Author: Gernot Hillier gernot.hill...@siemens.com Date: Mon Nov 11 11:23:29 2013 +0100 Silence unused_result warning from write() Some glibc versions mark write() with attribute warn_unused_result (found in Ubuntu 12.04 / eglibc 2.15 / gcc 4.6.3), so we need to silence this warning, especially because we're building with -Werror. Signed-off-by: Gernot Hillier gernot.hill...@siemens.com Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- lib/cobalt/init.c |3 ++- testsuite/latency/latency.c |2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/cobalt/init.c b/lib/cobalt/init.c index 101a2bd..11c2a3a 100644 --- a/lib/cobalt/init.c +++ b/lib/cobalt/init.c @@ -53,7 +53,8 @@ int __rtdm_fd_start = INT_MAX; static void sigill_handler(int sig) { const char m[] = no Xenomai support in kernel?\n; - write(2, m, sizeof(m) - 1); + ssize_t rc __attribute__ ((unused)); + rc = write(2, m, sizeof(m) - 1); exit(EXIT_FAILURE); } diff --git a/testsuite/latency/latency.c b/testsuite/latency/latency.c index 7c5099b..32e59b5 100644 --- a/testsuite/latency/latency.c +++ b/testsuite/latency/latency.c @@ -507,7 +507,7 @@ static void sigdebug(int sig, siginfo_t *si, void *context) case SIGDEBUG_WATCHDOG: n = snprintf(buffer, sizeof(buffer), %s\n, reason_str[reason]); - write(STDERR_FILENO, buffer, n); + n = write(STDERR_FILENO, buffer, n); exit(EXIT_FAILURE); } ___ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git