[Xenomai-git] Jan Kiszka : cobalt/kernel: Provide uninterruptible xnthread_join for RTDM use cases

2013-11-20 Thread git repository hosting
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

2013-11-20 Thread git repository hosting
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

2013-11-20 Thread git repository hosting
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

2013-11-20 Thread git repository hosting
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()

2013-11-20 Thread git repository hosting
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