[Xenomai-git] Philippe Gerum : rtipc/bufp: fix wrong TX timeout

2016-02-27 Thread git repository hosting
Module: xenomai-2.6
Branch: master
Commit: 701cb2dac40e98551d6edcaeb15480731a0f6eba
URL:
http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=701cb2dac40e98551d6edcaeb15480731a0f6eba

Author: Philippe Gerum 
Date:   Sun Feb 28 07:54:32 2016 +0100

rtipc/bufp: fix wrong TX timeout

---

 ksrc/drivers/ipc/bufp.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ksrc/drivers/ipc/bufp.c b/ksrc/drivers/ipc/bufp.c
index d9a5b8b..ef92b8c 100644
--- a/ksrc/drivers/ipc/bufp.c
+++ b/ksrc/drivers/ipc/bufp.c
@@ -442,7 +442,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk,
 
len = bufd->b_len;
 
-   rtdm_toseq_init(, sk->rx_timeout);
+   rtdm_toseq_init(, sk->tx_timeout);
 
rtipc_enter_atomic(wait.lockctx);
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : testsuite/smokey: mutex: simplify, introduce PP tests

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: 4ba4646606fe7abb50e27bfd4ed252299e84c64c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4ba4646606fe7abb50e27bfd4ed252299e84c64c

Author: Philippe Gerum 
Date:   Wed Feb 17 09:21:27 2016 +0100

testsuite/smokey: mutex: simplify, introduce PP tests

At this chance, the lock stealing test is also fixed.

---

 testsuite/smokey/posix-mutex/posix-mutex.c | 1357 ++--
 1 file changed, 670 insertions(+), 687 deletions(-)

diff --git a/testsuite/smokey/posix-mutex/posix-mutex.c 
b/testsuite/smokey/posix-mutex/posix-mutex.c
index ac71b31..ae82fc1 100644
--- a/testsuite/smokey/posix-mutex/posix-mutex.c
+++ b/testsuite/smokey/posix-mutex/posix-mutex.c
@@ -4,6 +4,7 @@
  * Copyright (C) Gilles Chanteperdrix  ,
  *   Marion Deveaud ,
  *   Jan Kiszka 
+ *   Philippe Gerum 
  *
  * Released under the terms of GPLv2.
  */
@@ -17,8 +18,6 @@
 #include 
 #include 
 #include 
-#include 
-#include "lib/cobalt/current.h"
 #include 
 
 smokey_test_plugin(posix_mutex,
@@ -26,886 +25,870 @@ smokey_test_plugin(posix_mutex,
   "Check POSIX mutex services"
 );
 
-#define MUTEX_CREATE   1
-#define MUTEX_LOCK 2
-#define MUTEX_TRYLOCK  3
-#define MUTEX_TIMED_LOCK   4
-#define MUTEX_UNLOCK   5
-#define MUTEX_DESTROY  6
-#define COND_CREATE7
-#define COND_SIGNAL8
-#define COND_WAIT  9
-#define COND_DESTROY   10
-#define THREAD_DETACH  11
-#define THREAD_CREATE  12
-#define THREAD_JOIN13
-#define THREAD_RENICE   14
-
-#define NS_PER_MS  100
-
 static const char *reason_str[] = {
-   [SIGDEBUG_UNDEFINED] = "undefined",
+   [SIGDEBUG_UNDEFINED] = "received SIGDEBUG for unknown reason",
[SIGDEBUG_MIGRATE_SIGNAL] = "received signal",
[SIGDEBUG_MIGRATE_SYSCALL] = "invoked syscall",
[SIGDEBUG_MIGRATE_FAULT] = "triggered fault",
[SIGDEBUG_MIGRATE_PRIOINV] = "affected by priority inversion",
-   [SIGDEBUG_NOMLOCK] = "missing mlockall",
-   [SIGDEBUG_WATCHDOG] = "runaway thread",
+   [SIGDEBUG_NOMLOCK] = "process memory not locked",
+   [SIGDEBUG_WATCHDOG] = "watchdog triggered (period too short?)",
+   [SIGDEBUG_LOCK_BREAK] = "scheduler lock break",
 };
 
 static void sigdebug(int sig, siginfo_t *si, void *context)
 {
+   const char fmt[] = "%s, this is unexpected.\n"
+   "(enabling CONFIG_XENO_OPT_DEBUG_TRACE_RELAX may help)\n";
unsigned int reason = sigdebug_reason(si);
+   int n __attribute__ ((unused));
+   static char buffer[256];
 
-   smokey_trace("\nSIGDEBUG received, reason %d: %s\n", reason,
-reason <= SIGDEBUG_WATCHDOG ? reason_str[reason] : 
"");
-}
+   if (reason > SIGDEBUG_WATCHDOG)
+   reason = SIGDEBUG_UNDEFINED;
 
-static inline unsigned long long timer_get_tsc(void)
-{
-   return clockobj_get_tsc();
+   n = snprintf(buffer, sizeof(buffer), fmt, reason_str[reason]);
+   n = write(STDERR_FILENO, buffer, n);
 }
 
-static inline unsigned long long timer_tsc2ns(unsigned long long tsc)
-{
-   return clockobj_tsc_to_ns(tsc);
-}
+#define THREAD_PRIO_WEAK   0
+#define THREAD_PRIO_LOW1
+#define THREAD_PRIO_MEDIUM 2
+#define THREAD_PRIO_HIGH   3
+#define THREAD_PRIO_VERY_HIGH  4
 
-static void add_timespec(struct timespec *ts, unsigned long long value)
-{
-   ts->tv_sec += value / 10;
-   ts->tv_nsec += value % 10;
-   if (ts->tv_nsec > 10) {
-   ts->tv_sec++;
-   ts->tv_nsec -= 10;
-   }
-}
+#define MAX_100_MS  1ULL
+
+struct locker_context {
+   pthread_mutex_t *mutex;
+   struct smokey_barrier *barrier;
+   int lock_acquired;
+};
 
-static void ms_sleep(int time)
+static void sleep_ms(unsigned int ms)  /* < 1000 */
 {
struct timespec ts;
-
+   
ts.tv_sec = 0;
-   ts.tv_nsec = time*NS_PER_MS;
-
-   nanosleep(, NULL);
+   ts.tv_nsec = ms * 100;
+   clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL);
 }
 
-static void check_current_prio(int expected_prio)
+static int get_effective_prio(void) 
 {
struct cobalt_threadstat stat;
int ret;
 
ret = cobalt_thread_stat(0, );
-   if (ret) {
-   fprintf(stderr,
-   "FAILURE: cobalt_threadstat (%s)\n", strerror(-ret));
-   exit(EXIT_FAILURE);
-   }
+   if (ret)
+   return ret;
 
-   if (stat.cprio != expected_prio) {
-   fprintf(stderr,
-   "FAILURE: current prio (%d) != expected prio (%d)\n",
-   stat.cprio, expected_prio);
-   exit(EXIT_FAILURE);
-   }
+   

[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: 338b80d96db503caac5df94762112882effcbce5
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=338b80d96db503caac5df94762112882effcbce5

Author: Philippe Gerum 
Date:   Tue Feb 16 10:12:55 2016 +0100

cobalt/synch: add support for priority ceiling protocol

---

 include/cobalt/kernel/heap.h   |   11 +
 include/cobalt/kernel/sched-idle.h |   12 +-
 include/cobalt/kernel/sched-rt.h   |   55 ++-
 include/cobalt/kernel/sched.h  |   94 +++-
 include/cobalt/kernel/synch.h  |   51 ++-
 include/cobalt/kernel/thread.h |   54 ++-
 include/cobalt/uapi/asm-generic/features.h |   27 +-
 include/cobalt/uapi/kernel/synch.h |8 +-
 include/cobalt/uapi/kernel/thread.h|3 +-
 include/cobalt/uapi/kernel/types.h |5 +-
 include/cobalt/uapi/mutex.h|1 +
 include/cobalt/uapi/thread.h   |1 +
 kernel/cobalt/posix/cond.c |2 +-
 kernel/cobalt/posix/memory.h   |6 +
 kernel/cobalt/posix/monitor.c  |   29 +-
 kernel/cobalt/posix/mqueue.c   |4 +-
 kernel/cobalt/posix/mutex.c|  103 +++--
 kernel/cobalt/posix/process.c  |   21 +-
 kernel/cobalt/posix/process.h  |3 +-
 kernel/cobalt/posix/syscall.c  |6 +-
 kernel/cobalt/posix/timerfd.c  |2 +-
 kernel/cobalt/rtdm/drvlib.c|2 +-
 kernel/cobalt/sched-idle.c |   12 +-
 kernel/cobalt/sched-quota.c|   24 +-
 kernel/cobalt/sched-rt.c   |   14 +-
 kernel/cobalt/sched-sporadic.c |   35 +-
 kernel/cobalt/sched-tp.c   |   42 +-
 kernel/cobalt/sched-weak.c |   16 +-
 kernel/cobalt/sched.c  |  126 +-
 kernel/cobalt/synch.c  |  636 +++-
 kernel/cobalt/thread.c |  117 ++---
 31 files changed, 1039 insertions(+), 483 deletions(-)

diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h
index 988004f..c7282b5 100644
--- a/include/cobalt/kernel/heap.h
+++ b/include/cobalt/kernel/heap.h
@@ -143,6 +143,17 @@ void xnheap_free(struct xnheap *heap, void *block);
 
 int xnheap_check_block(struct xnheap *heap, void *block);
 
+static inline void *xnheap_zalloc(struct xnheap *heap, u32 size)
+{
+   void *p;
+
+   p = xnheap_alloc(heap, size);
+   if (p)
+   memset(p, 0, size);
+
+   return p;
+}
+
 static inline char *xnstrdup(const char *s)
 {
char *p;
diff --git a/include/cobalt/kernel/sched-idle.h 
b/include/cobalt/kernel/sched-idle.h
index 732ff84..75efdec 100644
--- a/include/cobalt/kernel/sched-idle.h
+++ b/include/cobalt/kernel/sched-idle.h
@@ -33,11 +33,11 @@
 
 extern struct xnsched_class xnsched_class_idle;
 
-static inline void __xnsched_idle_setparam(struct xnthread *thread,
+static inline bool __xnsched_idle_setparam(struct xnthread *thread,
   const union xnsched_policy_param *p)
 {
xnthread_clear_state(thread, XNWEAK);
-   thread->cprio = p->idle.prio;
+   return xnsched_set_effective_priority(thread, p->idle.prio);
 }
 
 static inline void __xnsched_idle_getparam(struct xnthread *thread,
@@ -50,11 +50,17 @@ static inline void __xnsched_idle_trackprio(struct xnthread 
*thread,
const union xnsched_policy_param *p)
 {
if (p)
-   __xnsched_idle_setparam(thread, p);
+   /* Inheriting a priority-less class makes no sense. */
+   XENO_WARN_ON_ONCE(COBALT, 1);
else
thread->cprio = XNSCHED_IDLE_PRIO;
 }
 
+static inline void __xnsched_idle_protectprio(struct xnthread *thread, int 
prio)
+{
+   XENO_WARN_ON_ONCE(COBALT, 1);
+}
+
 static inline int xnsched_idle_init_thread(struct xnthread *thread)
 {
return 0;
diff --git a/include/cobalt/kernel/sched-rt.h b/include/cobalt/kernel/sched-rt.h
index ffb7223..9049449 100644
--- a/include/cobalt/kernel/sched-rt.h
+++ b/include/cobalt/kernel/sched-rt.h
@@ -67,20 +67,33 @@ static inline void __xnsched_rt_dequeue(struct xnthread 
*thread)
xnsched_delq(>sched->rt.runnable, thread);
 }
 
-static inline void __xnsched_rt_setparam(struct xnthread *thread,
-const union xnsched_policy_param *p)
+static inline void __xnsched_rt_track_weakness(struct xnthread *thread)
 {
-   thread->cprio = p->rt.prio;
-   if (!xnthread_test_state(thread, XNBOOST)) {
-#ifdef CONFIG_XENO_OPT_SCHED_WEAK
+   /*
+* We have to track threads exiting weak scheduling, i.e. any
+* thread leaving the WEAK class code is compiled in, or
+* assigned a zero priority if weak threads are hosted by the
+* RT class.
+*
+* CAUTION: since we 

[Xenomai-git] Philippe Gerum : lib/cobalt/mutex: add support for priority ceiling protocol

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: beb369735fe405a4592c97f088457d85537d5b33
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=beb369735fe405a4592c97f088457d85537d5b33

Author: Philippe Gerum 
Date:   Tue Feb 16 10:13:03 2016 +0100

lib/cobalt/mutex: add support for priority ceiling protocol

---

 configure.ac   |2 +
 include/boilerplate/libc.h |   19 +++
 include/cobalt/pthread.h   |7 ++
 lib/cobalt/cobalt.wrappers |2 +
 lib/cobalt/init.c  |1 +
 lib/cobalt/internal.h  |8 ++
 lib/cobalt/mutex.c |  301 +++-
 lib/cobalt/sched.c |   33 -
 lib/cobalt/thread.c|7 +-
 9 files changed, 311 insertions(+), 69 deletions(-)

diff --git a/configure.ac b/configure.ac
index 8bbeeef..578327e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -504,6 +504,8 @@ save_LIBS="$LIBS"
 LIBS="$LIBS -lrt -lpthread"
 AC_CHECK_FUNCS([pthread_mutexattr_setprotocol  \
pthread_mutexattr_getprotocol   \
+   pthread_mutexattr_getprioceiling \
+   pthread_mutexattr_setprioceiling \
pthread_mutexattr_setrobust_np  \
pthread_condattr_getclock   \
pthread_condattr_setclock   \
diff --git a/include/boilerplate/libc.h b/include/boilerplate/libc.h
index 0e51b86..3a5af8c 100644
--- a/include/boilerplate/libc.h
+++ b/include/boilerplate/libc.h
@@ -108,6 +108,25 @@ int pthread_mutexattr_getprotocol(const 
pthread_mutexattr_t *
 }
 #endif /* !HAVE_PTHREAD_MUTEXATTR_GETPROTOCOL */
 
+#ifndef HAVE_PTHREAD_MUTEXATTR_SETPRIOCEILING
+static inline
+int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr,
+int prioceiling)
+{
+   return ENOSYS;
+}
+#endif /* !HAVE_PTHREAD_MUTEXATTR_SETPRIOCEILING */
+
+#ifndef HAVE_PTHREAD_MUTEXATTR_GETPRIOCEILING
+static inline
+int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *
+ __restrict attr,
+int *__restrict prioceiling)
+{
+   return ENOSYS;
+}
+#endif /* !HAVE_PTHREAD_MUTEXATTR_GETPRIOCEILING */
+
 #ifndef HAVE_PTHREAD_ATTR_SETAFFINITY_NP
 #include 
 static inline
diff --git a/include/cobalt/pthread.h b/include/cobalt/pthread.h
index 386c337..f1b1c8a 100644
--- a/include/cobalt/pthread.h
+++ b/include/cobalt/pthread.h
@@ -67,6 +67,13 @@ COBALT_DECL(int, pthread_mutex_trylock(pthread_mutex_t 
*mutex));
 
 COBALT_DECL(int, pthread_mutex_unlock(pthread_mutex_t *mutex));
 
+COBALT_DECL(int, pthread_mutex_setprioceiling(pthread_mutex_t *__restrict 
mutex,
+ int prioceiling,
+ int *__restrict old_ceiling));
+  
+COBALT_DECL(int, pthread_mutex_getprioceiling(pthread_mutex_t *__restrict 
mutex,
+ int *__restrict old_ceiling));
+
 COBALT_DECL(int, pthread_cond_init (pthread_cond_t *cond,
const pthread_condattr_t *attr));
 
diff --git a/lib/cobalt/cobalt.wrappers b/lib/cobalt/cobalt.wrappers
index 9480f34..75f29d6 100644
--- a/lib/cobalt/cobalt.wrappers
+++ b/lib/cobalt/cobalt.wrappers
@@ -32,6 +32,8 @@
 --wrap pthread_mutex_trylock
 --wrap pthread_mutex_timedlock
 --wrap pthread_mutex_unlock
+--wrap pthread_mutex_setprioceiling
+--wrap pthread_mutex_getprioceiling
 --wrap pthread_cond_init
 --wrap pthread_cond_destroy
 --wrap pthread_cond_wait
diff --git a/lib/cobalt/init.c b/lib/cobalt/init.c
index f260744..69d4763 100644
--- a/lib/cobalt/init.c
+++ b/lib/cobalt/init.c
@@ -177,6 +177,7 @@ static void __cobalt_init(void)
sizeof(struct cobalt_sem_shadow));
 
cobalt_mutex_init();
+   cobalt_sched_init();
cobalt_thread_init();
cobalt_print_init();
 }
diff --git a/lib/cobalt/internal.h b/lib/cobalt/internal.h
index 69ec7d1..cdb2eee 100644
--- a/lib/cobalt/internal.h
+++ b/lib/cobalt/internal.h
@@ -47,6 +47,8 @@ void cobalt_thread_init(void);
 
 int cobalt_thread_probe(pid_t pid);
 
+void cobalt_sched_init(void);
+
 void cobalt_print_init(void);
 
 void cobalt_print_init_atfork(void);
@@ -68,4 +70,10 @@ void cobalt_check_features(struct cobalt_featinfo *finfo);
 
 extern struct sigaction __cobalt_orig_sigdebug;
 
+extern int __cobalt_std_fifo_minpri,
+  __cobalt_std_fifo_maxpri;
+
+extern int __cobalt_std_rr_minpri,
+  __cobalt_std_rr_maxpri;
+
 #endif /* _LIB_COBALT_INTERNAL_H */
diff --git a/lib/cobalt/mutex.c b/lib/cobalt/mutex.c
index 9d8a914..1456099 100644
--- a/lib/cobalt/mutex.c
+++ b/lib/cobalt/mutex.c
@@ -99,6 +99,9 @@ void cobalt_mutex_init(void)
  *   mutex, increase CONFIG_XENO_OPT_SHARED_HEAPSZ for a process-shared
  *   mutex, or CONFIG_XENO_OPT_PRIVATE_HEAPSZ for a process-private mutex.
  * - EAGAIN, no registry slot available, check/raise 
CONFIG_XENO_OPT_REGISTRY_NRSLOTS.
+ * - ENOSYS, @a attr 

[Xenomai-git] Jan Kiszka : smokey/posix-mutex: Fix test case /wrt mutex object reuse

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: b34764448c05aa9de832114bfa0baa77b1f5c619
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b34764448c05aa9de832114bfa0baa77b1f5c619

Author: Jan Kiszka 
Date:   Thu Feb 25 11:29:00 2016 +0100

smokey/posix-mutex: Fix test case /wrt mutex object reuse

Mutex objects created on the stack must be properly destroyed after use.
Otherwise, succeeding tests that use the same stack layout will consider
them busy and refuse to recreate the mutexes.

Signed-off-by: Jan Kiszka 

---

 testsuite/smokey/posix-mutex/posix-mutex.c |   26 +-
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/testsuite/smokey/posix-mutex/posix-mutex.c 
b/testsuite/smokey/posix-mutex/posix-mutex.c
index ae82fc1..151c2f3 100644
--- a/testsuite/smokey/posix-mutex/posix-mutex.c
+++ b/testsuite/smokey/posix-mutex/posix-mutex.c
@@ -623,7 +623,10 @@ static int protect_raise(void)
 
if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM))
return -EINVAL;
-   
+
+   if (!__T(ret, pthread_mutex_destroy()))
+   return ret;
+
return 0;
 }
 
@@ -651,7 +654,10 @@ static int protect_lower(void)
 
if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM))
return -EINVAL;
-   
+
+   if (!__T(ret, pthread_mutex_destroy()))
+   return ret;
+
return 0;
 }
 
@@ -699,7 +705,10 @@ static int protect_weak(void)
if (!__T(ret, pthread_setschedparam(pthread_self(),
old_policy, _param)))
return ret;
-   
+
+   if (!__T(ret, pthread_mutex_destroy()))
+   return ret;
+
return 0;
 }
 
@@ -745,7 +754,11 @@ static int protect_nesting_protect(void)
 
if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM))
return -EINVAL;
-   
+
+   if (!__T(ret, pthread_mutex_destroy(_high)) ||
+   !__T(ret, pthread_mutex_destroy(_very_high)))
+   return ret;
+
return 0;
 }
 
@@ -782,7 +795,10 @@ static int protect_nesting_pi(void)
/* PP boost just dropped: HIGH -> MEDIUM. */
if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM))
return -EINVAL;
-   
+
+   if (!__T(ret, pthread_mutex_destroy(_pp)))
+   return ret;
+
return 0;
 }
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : drivers/testing: rtdm: add actor task device

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: 38df524a0479ae30cf1bb96e1054544eb21d7759
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=38df524a0479ae30cf1bb96e1054544eb21d7759

Author: Philippe Gerum 
Date:   Sat Feb 27 18:52:35 2016 +0100

drivers/testing: rtdm: add actor task device

This is for unit testing in task context. The actor task performs
simple test requests issued by userland.

---

 include/rtdm/uapi/testing.h   |5 ++
 kernel/drivers/testing/rtdmtest.c |  169 +++--
 2 files changed, 147 insertions(+), 27 deletions(-)

diff --git a/include/rtdm/uapi/testing.h b/include/rtdm/uapi/testing.h
index 710bea8..76da5ee 100644
--- a/include/rtdm/uapi/testing.h
+++ b/include/rtdm/uapi/testing.h
@@ -83,6 +83,7 @@ struct rttst_swtest_error {
 
 #define RTTST_RTDM_NORMAL_CLOSE0
 #define RTTST_RTDM_DEFER_CLOSE_CONTEXT 1
+#define RTTST_RTDM_START_STOP_TASK 2
 
 #define RTIOC_TYPE_TESTING RTDM_CLASS_TESTING
 
@@ -141,6 +142,10 @@ struct rttst_swtest_error {
 
 #define RTTST_RTIOC_RTDM_DEFER_CLOSE \
_IOW(RTIOC_TYPE_TESTING, 0x40, __u32)
+
+#define RTTST_RTIOC_RTDM_ACTOR_GET_CPU \
+   _IOR(RTIOC_TYPE_TESTING, 0x41, __u32)
+  
 /** @} */
 
 #endif /* !_RTDM_UAPI_TESTING_H */
diff --git a/kernel/drivers/testing/rtdmtest.c 
b/kernel/drivers/testing/rtdmtest.c
index c5224d0..5c705e6 100644
--- a/kernel/drivers/testing/rtdmtest.c
+++ b/kernel/drivers/testing/rtdmtest.c
@@ -17,7 +17,6 @@
  */
 
 #include 
-
 #include 
 #include 
 
@@ -26,28 +25,38 @@ MODULE_AUTHOR("Jan Kiszka ");
 MODULE_VERSION("0.1.0");
 MODULE_LICENSE("GPL");
 
-struct rtdm_test_context {
+struct rtdm_basic_context {
rtdm_timer_t close_timer;
unsigned long close_counter;
unsigned long close_deferral;
 };
 
+struct rtdm_actor_context {
+   rtdm_task_t actor_task;
+   unsigned int request;
+   rtdm_event_t run;
+   rtdm_event_t done;
+   union {
+   __u32 cpu;
+   } args;
+};
+
 static void close_timer_proc(rtdm_timer_t *timer)
 {
-   struct rtdm_test_context *ctx =
-   container_of(timer, struct rtdm_test_context, close_timer);
+   struct rtdm_basic_context *ctx =
+   container_of(timer, struct rtdm_basic_context, close_timer);
 
if (ctx->close_counter != 1)
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, should be 1!\n",
   __FUNCTION__, ctx->close_counter);
 
rtdm_fd_unlock(rtdm_private_to_fd(ctx));
 }
 
-static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
+static int rtdm_basic_open(struct rtdm_fd *fd, int oflags)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
rtdm_timer_init(>close_timer, close_timer_proc,
"rtdm close test");
@@ -57,16 +66,16 @@ static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
return 0;
 }
 
-static void rtdm_test_close(struct rtdm_fd *fd)
+static void rtdm_basic_close(struct rtdm_fd *fd)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
ctx->close_counter++;
 
switch (ctx->close_deferral) {
case RTTST_RTDM_DEFER_CLOSE_CONTEXT:
if (ctx->close_counter != 2) {
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, "
   "should be 2!\n",
   __FUNCTION__, ctx->close_counter);
@@ -78,10 +87,10 @@ static void rtdm_test_close(struct rtdm_fd *fd)
rtdm_timer_destroy(>close_timer);
 }
 
-static int
-rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg)
+static int rtdm_basic_ioctl(struct rtdm_fd *fd,
+   unsigned int request, void __user *arg)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
int err = 0;
 
switch (request) {
@@ -94,7 +103,6 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, 
void __user *arg)
RTDM_TIMERMODE_RELATIVE);
}
break;
-
default:
err = -ENOTTY;
}
@@ -102,30 +110,137 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int 
request, void __user *arg)
return err;
 }
 
-static struct rtdm_driver rtdmtest_driver = {
-   .profile_info   = RTDM_PROFILE_INFO(rtdmtest,
+static void actor_handler(void *arg)
+{
+   struct rtdm_actor_context *ctx = arg;
+   int ret;
+
+   for (;;) {
+   if (rtdm_task_should_stop())
+   return;
+
+   ret = 

[Xenomai-git] Philippe Gerum : testsuite/smokey: add test checking Cobalt' s cpu affinity control

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: 3973d289e7ea7b0f31054b25a74d5c68617bfd58
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3973d289e7ea7b0f31054b25a74d5c68617bfd58

Author: Philippe Gerum 
Date:   Fri Feb 26 11:44:16 2016 +0100

testsuite/smokey: add test checking Cobalt's cpu affinity control

---

 configure.ac |1 +
 testsuite/smokey/Makefile.am |1 +
 testsuite/smokey/cpu-affinity/Makefile.am|9 +
 testsuite/smokey/cpu-affinity/cpu-affinity.c |  252 ++
 4 files changed, 263 insertions(+)

diff --git a/configure.ac b/configure.ac
index 20fa0ec..8bbeeef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -900,6 +900,7 @@ AC_CONFIG_FILES([ \
testsuite/smokey/net_packet_dgram/Makefile \
testsuite/smokey/net_packet_raw/Makefile \
testsuite/smokey/net_common/Makefile \
+   testsuite/smokey/cpu-affinity/Makefile \
testsuite/clocktest/Makefile \
testsuite/xeno-test/Makefile \
utils/Makefile \
diff --git a/testsuite/smokey/Makefile.am b/testsuite/smokey/Makefile.am
index e9a0fd2..5ade58b 100644
--- a/testsuite/smokey/Makefile.am
+++ b/testsuite/smokey/Makefile.am
@@ -8,6 +8,7 @@ smokey_SOURCES = main.c
 COBALT_SUBDIRS =   \
arith   \
bufp\
+   cpu-affinity\
iddp\
leaks   \
net_packet_dgram\
diff --git a/testsuite/smokey/cpu-affinity/Makefile.am 
b/testsuite/smokey/cpu-affinity/Makefile.am
new file mode 100644
index 000..0d2e4e6
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/Makefile.am
@@ -0,0 +1,9 @@
+
+noinst_LIBRARIES = libcpu-affinity.a
+
+libcpu_affinity_a_SOURCES = cpu-affinity.c
+
+libcpu_affinity_a_CPPFLAGS =   \
+   @XENO_USER_CFLAGS@  \
+   -I$(top_srcdir) \
+   -I$(top_srcdir)/include
diff --git a/testsuite/smokey/cpu-affinity/cpu-affinity.c 
b/testsuite/smokey/cpu-affinity/cpu-affinity.c
new file mode 100644
index 000..2674f76
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/cpu-affinity.c
@@ -0,0 +1,252 @@
+/*
+ * Test CPU affinity control mechanisms.
+ *
+ * Copyright (C) Philippe Gerum 
+ *
+ * Released under the terms of GPLv2.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+smokey_test_plugin(cpu_affinity,
+  SMOKEY_NOARGS,
+  "Check CPU affinity control."
+);
+
+static cpu_set_t cpu_realtime_set, cpu_online_set;
+
+struct test_context {
+   sem_t done;
+   int status;
+   int kfd;
+   int nrt_cpu;
+};
+
+static void *test_thread(void *arg)
+{
+   int cpu, cpu_in_rt_set, status = 0, ncpu, ret;
+   struct test_context *p = arg;
+   cpu_set_t set;
+
+   cpu = get_current_cpu();
+   if (!__Fassert(cpu < 0)) {
+   status = cpu;
+   goto out;
+   }
+
+   /*
+* When emerging, we should be running on a member of the
+* real-time CPU set.
+*/
+   cpu_in_rt_set = CPU_ISSET(cpu, _realtime_set);
+   if (!__Tassert(cpu_in_rt_set)) {
+   status = -EINVAL;
+   goto out;
+   }
+
+   smokey_trace(" user thread starts on CPU%d, ok", cpu);
+
+   for (ncpu = 0; ncpu < CPU_SETSIZE; ncpu++) {
+   if (ncpu == cpu || !CPU_ISSET(ncpu, _realtime_set))
+   continue;
+   CPU_ZERO();
+   CPU_SET(ncpu, );
+   if (!__Terrno(ret, sched_setaffinity(0, sizeof(set), ))) {
+   status = ret;
+   goto out;
+   }
+   smokey_trace(" user thread moved to CPU%d, good", ncpu);
+   }
+out:
+   p->status = status;
+   __STD(sem_post(>done));
+   
+   return NULL;
+}
+
+static int load_test_module(void)
+{
+   int fd, status;
+   
+   status = system("modprobe -q xeno_rtdmtest");
+   if (status < 0 || WEXITSTATUS(status))
+   return -ENOSYS;
+
+   /* Open the RTDM actor device. */
+   fd = open("/dev/rtdm/rtdmx", O_RDWR);
+   if (fd < 0)
+   return -errno;
+
+   return fd;
+}
+
+static void unload_test_module(int fd)
+{
+   close(fd);
+   system("rmmod xeno_rtdmtest");
+}
+
+static void *__run_cpu_affinity(void *arg)
+{
+   struct test_context *context = arg;
+   struct sched_param param;
+   struct timespec ts, now;
+   pthread_attr_t thattr;
+   cpu_set_t set;
+   pthread_t tid;
+   int ret;
+
+   smokey_trace(".. control thread binding to non-RT CPU%d",
+context->nrt_cpu);
+
+   __STD(sem_init(>done, 0, 0));
+
+   /*
+* Make the child thread inherit a CPU affinity outside of the
+* valid RT set from us. Cobalt should migrate the spawned
+* threads (kernel and user) to a CPU from the RT set
+* 

[Xenomai-git] Philippe Gerum : drivers/ipc: bufp: fix wrong TX timeout

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: 452d78b2efa0ecbc1fd546045670ad79b1f6e758
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=452d78b2efa0ecbc1fd546045670ad79b1f6e758

Author: Philippe Gerum 
Date:   Sat Feb 27 19:29:22 2016 +0100

drivers/ipc: bufp: fix wrong TX timeout

---

 kernel/drivers/ipc/bufp.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 7ea8b2c..ecce4f9 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -423,7 +423,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk,
 
len = bufd->b_len;
 
-   rtdm_toseq_init(, sk->rx_timeout);
+   rtdm_toseq_init(, sk->tx_timeout);
 
cobalt_atomic_enter(s);
 redo:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : drivers/testing: rtdm: add actor task device

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 7ef97138f15a89efa19d41aa3c5a78184ddbbc1b
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7ef97138f15a89efa19d41aa3c5a78184ddbbc1b

Author: Philippe Gerum 
Date:   Sat Feb 27 18:52:35 2016 +0100

drivers/testing: rtdm: add actor task device

This is for unit testing in task context. The actor task performs
simple test requests issued by userland.

---

 include/rtdm/uapi/testing.h   |5 ++
 kernel/drivers/testing/rtdmtest.c |  169 +++--
 2 files changed, 147 insertions(+), 27 deletions(-)

diff --git a/include/rtdm/uapi/testing.h b/include/rtdm/uapi/testing.h
index 710bea8..76da5ee 100644
--- a/include/rtdm/uapi/testing.h
+++ b/include/rtdm/uapi/testing.h
@@ -83,6 +83,7 @@ struct rttst_swtest_error {
 
 #define RTTST_RTDM_NORMAL_CLOSE0
 #define RTTST_RTDM_DEFER_CLOSE_CONTEXT 1
+#define RTTST_RTDM_START_STOP_TASK 2
 
 #define RTIOC_TYPE_TESTING RTDM_CLASS_TESTING
 
@@ -141,6 +142,10 @@ struct rttst_swtest_error {
 
 #define RTTST_RTIOC_RTDM_DEFER_CLOSE \
_IOW(RTIOC_TYPE_TESTING, 0x40, __u32)
+
+#define RTTST_RTIOC_RTDM_ACTOR_GET_CPU \
+   _IOR(RTIOC_TYPE_TESTING, 0x41, __u32)
+  
 /** @} */
 
 #endif /* !_RTDM_UAPI_TESTING_H */
diff --git a/kernel/drivers/testing/rtdmtest.c 
b/kernel/drivers/testing/rtdmtest.c
index c5224d0..5c705e6 100644
--- a/kernel/drivers/testing/rtdmtest.c
+++ b/kernel/drivers/testing/rtdmtest.c
@@ -17,7 +17,6 @@
  */
 
 #include 
-
 #include 
 #include 
 
@@ -26,28 +25,38 @@ MODULE_AUTHOR("Jan Kiszka ");
 MODULE_VERSION("0.1.0");
 MODULE_LICENSE("GPL");
 
-struct rtdm_test_context {
+struct rtdm_basic_context {
rtdm_timer_t close_timer;
unsigned long close_counter;
unsigned long close_deferral;
 };
 
+struct rtdm_actor_context {
+   rtdm_task_t actor_task;
+   unsigned int request;
+   rtdm_event_t run;
+   rtdm_event_t done;
+   union {
+   __u32 cpu;
+   } args;
+};
+
 static void close_timer_proc(rtdm_timer_t *timer)
 {
-   struct rtdm_test_context *ctx =
-   container_of(timer, struct rtdm_test_context, close_timer);
+   struct rtdm_basic_context *ctx =
+   container_of(timer, struct rtdm_basic_context, close_timer);
 
if (ctx->close_counter != 1)
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, should be 1!\n",
   __FUNCTION__, ctx->close_counter);
 
rtdm_fd_unlock(rtdm_private_to_fd(ctx));
 }
 
-static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
+static int rtdm_basic_open(struct rtdm_fd *fd, int oflags)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
rtdm_timer_init(>close_timer, close_timer_proc,
"rtdm close test");
@@ -57,16 +66,16 @@ static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
return 0;
 }
 
-static void rtdm_test_close(struct rtdm_fd *fd)
+static void rtdm_basic_close(struct rtdm_fd *fd)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
ctx->close_counter++;
 
switch (ctx->close_deferral) {
case RTTST_RTDM_DEFER_CLOSE_CONTEXT:
if (ctx->close_counter != 2) {
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, "
   "should be 2!\n",
   __FUNCTION__, ctx->close_counter);
@@ -78,10 +87,10 @@ static void rtdm_test_close(struct rtdm_fd *fd)
rtdm_timer_destroy(>close_timer);
 }
 
-static int
-rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg)
+static int rtdm_basic_ioctl(struct rtdm_fd *fd,
+   unsigned int request, void __user *arg)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
int err = 0;
 
switch (request) {
@@ -94,7 +103,6 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, 
void __user *arg)
RTDM_TIMERMODE_RELATIVE);
}
break;
-
default:
err = -ENOTTY;
}
@@ -102,30 +110,137 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int 
request, void __user *arg)
return err;
 }
 
-static struct rtdm_driver rtdmtest_driver = {
-   .profile_info   = RTDM_PROFILE_INFO(rtdmtest,
+static void actor_handler(void *arg)
+{
+   struct rtdm_actor_context *ctx = arg;
+   int ret;
+
+   for (;;) {
+   if (rtdm_task_should_stop())
+   return;
+
+   ret = 

[Xenomai-git] Philippe Gerum : testsuite/smokey: add test checking Cobalt' s cpu affinity control

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: f6f82cb5a7ae024cb874f72b0167bad748c74d27
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f6f82cb5a7ae024cb874f72b0167bad748c74d27

Author: Philippe Gerum 
Date:   Fri Feb 26 11:44:16 2016 +0100

testsuite/smokey: add test checking Cobalt's cpu affinity control

---

 configure.ac |1 +
 testsuite/smokey/Makefile.am |3 +-
 testsuite/smokey/cpu-affinity/Makefile.am|9 +
 testsuite/smokey/cpu-affinity/cpu-affinity.c |  252 ++
 4 files changed, 264 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index f450673..d71aa38 100644
--- a/configure.ac
+++ b/configure.ac
@@ -909,6 +909,7 @@ AC_CONFIG_FILES([ \
testsuite/smokey/net_packet_dgram/Makefile \
testsuite/smokey/net_packet_raw/Makefile \
testsuite/smokey/net_common/Makefile \
+   testsuite/smokey/cpu-affinity/Makefile \
testsuite/clocktest/Makefile \
testsuite/xeno-test/Makefile \
utils/Makefile \
diff --git a/testsuite/smokey/Makefile.am b/testsuite/smokey/Makefile.am
index 174b393..51292f1 100644
--- a/testsuite/smokey/Makefile.am
+++ b/testsuite/smokey/Makefile.am
@@ -8,6 +8,7 @@ smokey_SOURCES = main.c
 COBALT_SUBDIRS =   \
arith   \
bufp\
+   cpu-affinity\
fpu-stress  \
iddp\
leaks   \
@@ -32,7 +33,7 @@ COBALT_SUBDIRS =  \
 MERCURY_SUBDIRS =
 
 DIST_SUBDIRS = $(COBALT_SUBDIRS) $(MERCURY_SUBDIRS)
-   
+
 if XENO_COBALT
 wrappers = $(XENO_POSIX_WRAPPERS)
 SUBDIRS = $(COBALT_SUBDIRS)
diff --git a/testsuite/smokey/cpu-affinity/Makefile.am 
b/testsuite/smokey/cpu-affinity/Makefile.am
new file mode 100644
index 000..0d2e4e6
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/Makefile.am
@@ -0,0 +1,9 @@
+
+noinst_LIBRARIES = libcpu-affinity.a
+
+libcpu_affinity_a_SOURCES = cpu-affinity.c
+
+libcpu_affinity_a_CPPFLAGS =   \
+   @XENO_USER_CFLAGS@  \
+   -I$(top_srcdir) \
+   -I$(top_srcdir)/include
diff --git a/testsuite/smokey/cpu-affinity/cpu-affinity.c 
b/testsuite/smokey/cpu-affinity/cpu-affinity.c
new file mode 100644
index 000..2674f76
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/cpu-affinity.c
@@ -0,0 +1,252 @@
+/*
+ * Test CPU affinity control mechanisms.
+ *
+ * Copyright (C) Philippe Gerum 
+ *
+ * Released under the terms of GPLv2.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+smokey_test_plugin(cpu_affinity,
+  SMOKEY_NOARGS,
+  "Check CPU affinity control."
+);
+
+static cpu_set_t cpu_realtime_set, cpu_online_set;
+
+struct test_context {
+   sem_t done;
+   int status;
+   int kfd;
+   int nrt_cpu;
+};
+
+static void *test_thread(void *arg)
+{
+   int cpu, cpu_in_rt_set, status = 0, ncpu, ret;
+   struct test_context *p = arg;
+   cpu_set_t set;
+
+   cpu = get_current_cpu();
+   if (!__Fassert(cpu < 0)) {
+   status = cpu;
+   goto out;
+   }
+
+   /*
+* When emerging, we should be running on a member of the
+* real-time CPU set.
+*/
+   cpu_in_rt_set = CPU_ISSET(cpu, _realtime_set);
+   if (!__Tassert(cpu_in_rt_set)) {
+   status = -EINVAL;
+   goto out;
+   }
+
+   smokey_trace(" user thread starts on CPU%d, ok", cpu);
+
+   for (ncpu = 0; ncpu < CPU_SETSIZE; ncpu++) {
+   if (ncpu == cpu || !CPU_ISSET(ncpu, _realtime_set))
+   continue;
+   CPU_ZERO();
+   CPU_SET(ncpu, );
+   if (!__Terrno(ret, sched_setaffinity(0, sizeof(set), ))) {
+   status = ret;
+   goto out;
+   }
+   smokey_trace(" user thread moved to CPU%d, good", ncpu);
+   }
+out:
+   p->status = status;
+   __STD(sem_post(>done));
+   
+   return NULL;
+}
+
+static int load_test_module(void)
+{
+   int fd, status;
+   
+   status = system("modprobe -q xeno_rtdmtest");
+   if (status < 0 || WEXITSTATUS(status))
+   return -ENOSYS;
+
+   /* Open the RTDM actor device. */
+   fd = open("/dev/rtdm/rtdmx", O_RDWR);
+   if (fd < 0)
+   return -errno;
+
+   return fd;
+}
+
+static void unload_test_module(int fd)
+{
+   close(fd);
+   system("rmmod xeno_rtdmtest");
+}
+
+static void *__run_cpu_affinity(void *arg)
+{
+   struct test_context *context = arg;
+   struct sched_param param;
+   struct timespec ts, now;
+   pthread_attr_t thattr;
+   cpu_set_t set;
+   pthread_t tid;
+   int ret;
+
+   smokey_trace(".. control thread binding to non-RT CPU%d",
+context->nrt_cpu);
+
+   __STD(sem_init(>done, 0, 0));
+
+   /*

[Xenomai-git] Philippe Gerum : drivers/testing: rtdm: add actor task device

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: 38df524a0479ae30cf1bb96e1054544eb21d7759
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=38df524a0479ae30cf1bb96e1054544eb21d7759

Author: Philippe Gerum 
Date:   Sat Feb 27 18:52:35 2016 +0100

drivers/testing: rtdm: add actor task device

This is for unit testing in task context. The actor task performs
simple test requests issued by userland.

---

 include/rtdm/uapi/testing.h   |5 ++
 kernel/drivers/testing/rtdmtest.c |  169 +++--
 2 files changed, 147 insertions(+), 27 deletions(-)

diff --git a/include/rtdm/uapi/testing.h b/include/rtdm/uapi/testing.h
index 710bea8..76da5ee 100644
--- a/include/rtdm/uapi/testing.h
+++ b/include/rtdm/uapi/testing.h
@@ -83,6 +83,7 @@ struct rttst_swtest_error {
 
 #define RTTST_RTDM_NORMAL_CLOSE0
 #define RTTST_RTDM_DEFER_CLOSE_CONTEXT 1
+#define RTTST_RTDM_START_STOP_TASK 2
 
 #define RTIOC_TYPE_TESTING RTDM_CLASS_TESTING
 
@@ -141,6 +142,10 @@ struct rttst_swtest_error {
 
 #define RTTST_RTIOC_RTDM_DEFER_CLOSE \
_IOW(RTIOC_TYPE_TESTING, 0x40, __u32)
+
+#define RTTST_RTIOC_RTDM_ACTOR_GET_CPU \
+   _IOR(RTIOC_TYPE_TESTING, 0x41, __u32)
+  
 /** @} */
 
 #endif /* !_RTDM_UAPI_TESTING_H */
diff --git a/kernel/drivers/testing/rtdmtest.c 
b/kernel/drivers/testing/rtdmtest.c
index c5224d0..5c705e6 100644
--- a/kernel/drivers/testing/rtdmtest.c
+++ b/kernel/drivers/testing/rtdmtest.c
@@ -17,7 +17,6 @@
  */
 
 #include 
-
 #include 
 #include 
 
@@ -26,28 +25,38 @@ MODULE_AUTHOR("Jan Kiszka ");
 MODULE_VERSION("0.1.0");
 MODULE_LICENSE("GPL");
 
-struct rtdm_test_context {
+struct rtdm_basic_context {
rtdm_timer_t close_timer;
unsigned long close_counter;
unsigned long close_deferral;
 };
 
+struct rtdm_actor_context {
+   rtdm_task_t actor_task;
+   unsigned int request;
+   rtdm_event_t run;
+   rtdm_event_t done;
+   union {
+   __u32 cpu;
+   } args;
+};
+
 static void close_timer_proc(rtdm_timer_t *timer)
 {
-   struct rtdm_test_context *ctx =
-   container_of(timer, struct rtdm_test_context, close_timer);
+   struct rtdm_basic_context *ctx =
+   container_of(timer, struct rtdm_basic_context, close_timer);
 
if (ctx->close_counter != 1)
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, should be 1!\n",
   __FUNCTION__, ctx->close_counter);
 
rtdm_fd_unlock(rtdm_private_to_fd(ctx));
 }
 
-static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
+static int rtdm_basic_open(struct rtdm_fd *fd, int oflags)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
rtdm_timer_init(>close_timer, close_timer_proc,
"rtdm close test");
@@ -57,16 +66,16 @@ static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
return 0;
 }
 
-static void rtdm_test_close(struct rtdm_fd *fd)
+static void rtdm_basic_close(struct rtdm_fd *fd)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
ctx->close_counter++;
 
switch (ctx->close_deferral) {
case RTTST_RTDM_DEFER_CLOSE_CONTEXT:
if (ctx->close_counter != 2) {
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, "
   "should be 2!\n",
   __FUNCTION__, ctx->close_counter);
@@ -78,10 +87,10 @@ static void rtdm_test_close(struct rtdm_fd *fd)
rtdm_timer_destroy(>close_timer);
 }
 
-static int
-rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg)
+static int rtdm_basic_ioctl(struct rtdm_fd *fd,
+   unsigned int request, void __user *arg)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
int err = 0;
 
switch (request) {
@@ -94,7 +103,6 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, 
void __user *arg)
RTDM_TIMERMODE_RELATIVE);
}
break;
-
default:
err = -ENOTTY;
}
@@ -102,30 +110,137 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int 
request, void __user *arg)
return err;
 }
 
-static struct rtdm_driver rtdmtest_driver = {
-   .profile_info   = RTDM_PROFILE_INFO(rtdmtest,
+static void actor_handler(void *arg)
+{
+   struct rtdm_actor_context *ctx = arg;
+   int ret;
+
+   for (;;) {
+   if (rtdm_task_should_stop())
+   return;
+
+   ret = 

[Xenomai-git] Philippe Gerum : drivers/ipc: bufp: fix wrong TX timeout

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 63de8c561e65223c5265b851d3cff57073b85bba
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=63de8c561e65223c5265b851d3cff57073b85bba

Author: Philippe Gerum 
Date:   Sat Feb 27 19:29:22 2016 +0100

drivers/ipc: bufp: fix wrong TX timeout

---

 kernel/drivers/ipc/bufp.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 7ea8b2c..ecce4f9 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -423,7 +423,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk,
 
len = bufd->b_len;
 
-   rtdm_toseq_init(, sk->rx_timeout);
+   rtdm_toseq_init(, sk->tx_timeout);
 
cobalt_atomic_enter(s);
 redo:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : testsuite/smokey: add test checking Cobalt' s cpu affinity control

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: 3973d289e7ea7b0f31054b25a74d5c68617bfd58
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3973d289e7ea7b0f31054b25a74d5c68617bfd58

Author: Philippe Gerum 
Date:   Fri Feb 26 11:44:16 2016 +0100

testsuite/smokey: add test checking Cobalt's cpu affinity control

---

 configure.ac |1 +
 testsuite/smokey/Makefile.am |1 +
 testsuite/smokey/cpu-affinity/Makefile.am|9 +
 testsuite/smokey/cpu-affinity/cpu-affinity.c |  252 ++
 4 files changed, 263 insertions(+)

diff --git a/configure.ac b/configure.ac
index 20fa0ec..8bbeeef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -900,6 +900,7 @@ AC_CONFIG_FILES([ \
testsuite/smokey/net_packet_dgram/Makefile \
testsuite/smokey/net_packet_raw/Makefile \
testsuite/smokey/net_common/Makefile \
+   testsuite/smokey/cpu-affinity/Makefile \
testsuite/clocktest/Makefile \
testsuite/xeno-test/Makefile \
utils/Makefile \
diff --git a/testsuite/smokey/Makefile.am b/testsuite/smokey/Makefile.am
index e9a0fd2..5ade58b 100644
--- a/testsuite/smokey/Makefile.am
+++ b/testsuite/smokey/Makefile.am
@@ -8,6 +8,7 @@ smokey_SOURCES = main.c
 COBALT_SUBDIRS =   \
arith   \
bufp\
+   cpu-affinity\
iddp\
leaks   \
net_packet_dgram\
diff --git a/testsuite/smokey/cpu-affinity/Makefile.am 
b/testsuite/smokey/cpu-affinity/Makefile.am
new file mode 100644
index 000..0d2e4e6
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/Makefile.am
@@ -0,0 +1,9 @@
+
+noinst_LIBRARIES = libcpu-affinity.a
+
+libcpu_affinity_a_SOURCES = cpu-affinity.c
+
+libcpu_affinity_a_CPPFLAGS =   \
+   @XENO_USER_CFLAGS@  \
+   -I$(top_srcdir) \
+   -I$(top_srcdir)/include
diff --git a/testsuite/smokey/cpu-affinity/cpu-affinity.c 
b/testsuite/smokey/cpu-affinity/cpu-affinity.c
new file mode 100644
index 000..2674f76
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/cpu-affinity.c
@@ -0,0 +1,252 @@
+/*
+ * Test CPU affinity control mechanisms.
+ *
+ * Copyright (C) Philippe Gerum 
+ *
+ * Released under the terms of GPLv2.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+smokey_test_plugin(cpu_affinity,
+  SMOKEY_NOARGS,
+  "Check CPU affinity control."
+);
+
+static cpu_set_t cpu_realtime_set, cpu_online_set;
+
+struct test_context {
+   sem_t done;
+   int status;
+   int kfd;
+   int nrt_cpu;
+};
+
+static void *test_thread(void *arg)
+{
+   int cpu, cpu_in_rt_set, status = 0, ncpu, ret;
+   struct test_context *p = arg;
+   cpu_set_t set;
+
+   cpu = get_current_cpu();
+   if (!__Fassert(cpu < 0)) {
+   status = cpu;
+   goto out;
+   }
+
+   /*
+* When emerging, we should be running on a member of the
+* real-time CPU set.
+*/
+   cpu_in_rt_set = CPU_ISSET(cpu, _realtime_set);
+   if (!__Tassert(cpu_in_rt_set)) {
+   status = -EINVAL;
+   goto out;
+   }
+
+   smokey_trace(" user thread starts on CPU%d, ok", cpu);
+
+   for (ncpu = 0; ncpu < CPU_SETSIZE; ncpu++) {
+   if (ncpu == cpu || !CPU_ISSET(ncpu, _realtime_set))
+   continue;
+   CPU_ZERO();
+   CPU_SET(ncpu, );
+   if (!__Terrno(ret, sched_setaffinity(0, sizeof(set), ))) {
+   status = ret;
+   goto out;
+   }
+   smokey_trace(" user thread moved to CPU%d, good", ncpu);
+   }
+out:
+   p->status = status;
+   __STD(sem_post(>done));
+   
+   return NULL;
+}
+
+static int load_test_module(void)
+{
+   int fd, status;
+   
+   status = system("modprobe -q xeno_rtdmtest");
+   if (status < 0 || WEXITSTATUS(status))
+   return -ENOSYS;
+
+   /* Open the RTDM actor device. */
+   fd = open("/dev/rtdm/rtdmx", O_RDWR);
+   if (fd < 0)
+   return -errno;
+
+   return fd;
+}
+
+static void unload_test_module(int fd)
+{
+   close(fd);
+   system("rmmod xeno_rtdmtest");
+}
+
+static void *__run_cpu_affinity(void *arg)
+{
+   struct test_context *context = arg;
+   struct sched_param param;
+   struct timespec ts, now;
+   pthread_attr_t thattr;
+   cpu_set_t set;
+   pthread_t tid;
+   int ret;
+
+   smokey_trace(".. control thread binding to non-RT CPU%d",
+context->nrt_cpu);
+
+   __STD(sem_init(>done, 0, 0));
+
+   /*
+* Make the child thread inherit a CPU affinity outside of the
+* valid RT set from us. Cobalt should migrate the spawned
+* threads (kernel and user) to a CPU from the RT set
+* 

[Xenomai-git] Philippe Gerum : drivers/ipc: bufp: fix wrong TX timeout

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: 452d78b2efa0ecbc1fd546045670ad79b1f6e758
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=452d78b2efa0ecbc1fd546045670ad79b1f6e758

Author: Philippe Gerum 
Date:   Sat Feb 27 19:29:22 2016 +0100

drivers/ipc: bufp: fix wrong TX timeout

---

 kernel/drivers/ipc/bufp.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 7ea8b2c..ecce4f9 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -423,7 +423,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk,
 
len = bufd->b_len;
 
-   rtdm_toseq_init(, sk->rx_timeout);
+   rtdm_toseq_init(, sk->tx_timeout);
 
cobalt_atomic_enter(s);
 redo:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : testsuite/smokey: add test checking Cobalt' s cpu affinity control

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: 78eae5786c1f31c5f8f6c1e0dc93b41f4ad35dce
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=78eae5786c1f31c5f8f6c1e0dc93b41f4ad35dce

Author: Philippe Gerum 
Date:   Fri Feb 26 11:44:16 2016 +0100

testsuite/smokey: add test checking Cobalt's cpu affinity control

---

 configure.ac |1 +
 testsuite/smokey/Makefile.am |1 +
 testsuite/smokey/cpu-affinity/Makefile.am|9 +
 testsuite/smokey/cpu-affinity/cpu-affinity.c |  246 ++
 4 files changed, 257 insertions(+)

diff --git a/configure.ac b/configure.ac
index 7aaedc2..578327e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -902,6 +902,7 @@ AC_CONFIG_FILES([ \
testsuite/smokey/net_packet_dgram/Makefile \
testsuite/smokey/net_packet_raw/Makefile \
testsuite/smokey/net_common/Makefile \
+   testsuite/smokey/cpu-affinity/Makefile \
testsuite/clocktest/Makefile \
testsuite/xeno-test/Makefile \
utils/Makefile \
diff --git a/testsuite/smokey/Makefile.am b/testsuite/smokey/Makefile.am
index e9a0fd2..5ade58b 100644
--- a/testsuite/smokey/Makefile.am
+++ b/testsuite/smokey/Makefile.am
@@ -8,6 +8,7 @@ smokey_SOURCES = main.c
 COBALT_SUBDIRS =   \
arith   \
bufp\
+   cpu-affinity\
iddp\
leaks   \
net_packet_dgram\
diff --git a/testsuite/smokey/cpu-affinity/Makefile.am 
b/testsuite/smokey/cpu-affinity/Makefile.am
new file mode 100644
index 000..0d2e4e6
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/Makefile.am
@@ -0,0 +1,9 @@
+
+noinst_LIBRARIES = libcpu-affinity.a
+
+libcpu_affinity_a_SOURCES = cpu-affinity.c
+
+libcpu_affinity_a_CPPFLAGS =   \
+   @XENO_USER_CFLAGS@  \
+   -I$(top_srcdir) \
+   -I$(top_srcdir)/include
diff --git a/testsuite/smokey/cpu-affinity/cpu-affinity.c 
b/testsuite/smokey/cpu-affinity/cpu-affinity.c
new file mode 100644
index 000..fe5865f
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/cpu-affinity.c
@@ -0,0 +1,246 @@
+/*
+ * Test CPU affinity control mechanisms.
+ *
+ * Copyright (C) Philippe Gerum 
+ *
+ * Released under the terms of GPLv2.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+smokey_test_plugin(cpu_affinity,
+  SMOKEY_NOARGS,
+  "Check CPU affinity control."
+);
+
+static cpu_set_t cpu_realtime_set, cpu_online_set;
+
+struct test_context {
+   sem_t done;
+   int status;
+   int kfd;
+   int nrt_cpu;
+};
+
+static void *test_thread(void *arg)
+{
+   int cpu, cpu_in_rt_set, status = 0, ncpu, ret;
+   struct test_context *p = arg;
+   cpu_set_t set;
+
+   cpu = get_current_cpu();
+   if (!__Fassert(cpu < 0)) {
+   status = cpu;
+   goto out;
+   }
+
+   /*
+* When emerging, we should be running on a member of the
+* real-time CPU set.
+*/
+   cpu_in_rt_set = CPU_ISSET(cpu, _realtime_set);
+   if (!__Tassert(cpu_in_rt_set)) {
+   status = -EINVAL;
+   goto out;
+   }
+
+   smokey_trace(" user thread starts on CPU%d, ok", cpu);
+
+   for (ncpu = 0; ncpu < CPU_SETSIZE; ncpu++) {
+   if (ncpu == cpu || !CPU_ISSET(ncpu, _realtime_set))
+   continue;
+   CPU_ZERO();
+   CPU_SET(ncpu, );
+   if (!__Terrno(ret, sched_setaffinity(0, sizeof(set), ))) {
+   status = ret;
+   goto out;
+   }
+   smokey_trace(" user thread moved to CPU%d, good", ncpu);
+   }
+out:
+   p->status = status;
+   __STD(sem_post(>done));
+   
+   return NULL;
+}
+
+static int load_test_module(void)
+{
+   int fd, status;
+   
+   status = system("modprobe -q xeno_rtdmtest");
+   if (status < 0 || WEXITSTATUS(status))
+   return -ENOSYS;
+
+   /* Open the RTDM actor device. */
+   fd = open("/dev/rtdm/rtdmx", O_RDWR);
+   if (fd < 0)
+   return -errno;
+
+   return fd;
+}
+
+static void unload_test_module(int fd)
+{
+   close(fd);
+   system("rmmod xeno_rtdmtest");
+}
+
+static void *__run_cpu_affinity(void *arg)
+{
+   struct test_context *context = arg;
+   struct sched_param param;
+   struct timespec ts, now;
+   pthread_attr_t thattr;
+   cpu_set_t set;
+   pthread_t tid;
+   int ret;
+
+   smokey_trace(".. control thread binding to non-RT CPU%d",
+context->nrt_cpu);
+
+   __STD(sem_init(>done, 0, 0));
+
+   /*
+* Make the child thread inherit a CPU affinity outside of the
+* valid RT set from us. Cobalt should migrate the spawned
+* threads (kernel and user) to a CPU from the RT set
+* automatically.

[Xenomai-git] Philippe Gerum : drivers/testing: rtdm: add actor task device

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: c974cb4b95f6c0ceeddbbf9b40429bdfc9c3307c
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c974cb4b95f6c0ceeddbbf9b40429bdfc9c3307c

Author: Philippe Gerum 
Date:   Sat Feb 27 18:52:35 2016 +0100

drivers/testing: rtdm: add actor task device

This is for unit testing in task context. The actor task performs
simple test requests issued by userland.

---

 include/rtdm/uapi/testing.h   |5 ++
 kernel/drivers/ipc/bufp.c |2 +-
 kernel/drivers/testing/rtdmtest.c |  169 +++--
 3 files changed, 148 insertions(+), 28 deletions(-)

diff --git a/include/rtdm/uapi/testing.h b/include/rtdm/uapi/testing.h
index 710bea8..76da5ee 100644
--- a/include/rtdm/uapi/testing.h
+++ b/include/rtdm/uapi/testing.h
@@ -83,6 +83,7 @@ struct rttst_swtest_error {
 
 #define RTTST_RTDM_NORMAL_CLOSE0
 #define RTTST_RTDM_DEFER_CLOSE_CONTEXT 1
+#define RTTST_RTDM_START_STOP_TASK 2
 
 #define RTIOC_TYPE_TESTING RTDM_CLASS_TESTING
 
@@ -141,6 +142,10 @@ struct rttst_swtest_error {
 
 #define RTTST_RTIOC_RTDM_DEFER_CLOSE \
_IOW(RTIOC_TYPE_TESTING, 0x40, __u32)
+
+#define RTTST_RTIOC_RTDM_ACTOR_GET_CPU \
+   _IOR(RTIOC_TYPE_TESTING, 0x41, __u32)
+  
 /** @} */
 
 #endif /* !_RTDM_UAPI_TESTING_H */
diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 7ea8b2c..ecce4f9 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -423,7 +423,7 @@ static ssize_t __bufp_writebuf(struct bufp_socket *rsk,
 
len = bufd->b_len;
 
-   rtdm_toseq_init(, sk->rx_timeout);
+   rtdm_toseq_init(, sk->tx_timeout);
 
cobalt_atomic_enter(s);
 redo:
diff --git a/kernel/drivers/testing/rtdmtest.c 
b/kernel/drivers/testing/rtdmtest.c
index c5224d0..5c705e6 100644
--- a/kernel/drivers/testing/rtdmtest.c
+++ b/kernel/drivers/testing/rtdmtest.c
@@ -17,7 +17,6 @@
  */
 
 #include 
-
 #include 
 #include 
 
@@ -26,28 +25,38 @@ MODULE_AUTHOR("Jan Kiszka ");
 MODULE_VERSION("0.1.0");
 MODULE_LICENSE("GPL");
 
-struct rtdm_test_context {
+struct rtdm_basic_context {
rtdm_timer_t close_timer;
unsigned long close_counter;
unsigned long close_deferral;
 };
 
+struct rtdm_actor_context {
+   rtdm_task_t actor_task;
+   unsigned int request;
+   rtdm_event_t run;
+   rtdm_event_t done;
+   union {
+   __u32 cpu;
+   } args;
+};
+
 static void close_timer_proc(rtdm_timer_t *timer)
 {
-   struct rtdm_test_context *ctx =
-   container_of(timer, struct rtdm_test_context, close_timer);
+   struct rtdm_basic_context *ctx =
+   container_of(timer, struct rtdm_basic_context, close_timer);
 
if (ctx->close_counter != 1)
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, should be 1!\n",
   __FUNCTION__, ctx->close_counter);
 
rtdm_fd_unlock(rtdm_private_to_fd(ctx));
 }
 
-static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
+static int rtdm_basic_open(struct rtdm_fd *fd, int oflags)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
rtdm_timer_init(>close_timer, close_timer_proc,
"rtdm close test");
@@ -57,16 +66,16 @@ static int rtdm_test_open(struct rtdm_fd *fd, int oflags)
return 0;
 }
 
-static void rtdm_test_close(struct rtdm_fd *fd)
+static void rtdm_basic_close(struct rtdm_fd *fd)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
 
ctx->close_counter++;
 
switch (ctx->close_deferral) {
case RTTST_RTDM_DEFER_CLOSE_CONTEXT:
if (ctx->close_counter != 2) {
-   printk(KERN_ERR
+   printk(XENO_ERR
   "rtdmtest: %s: close_counter is %lu, "
   "should be 2!\n",
   __FUNCTION__, ctx->close_counter);
@@ -78,10 +87,10 @@ static void rtdm_test_close(struct rtdm_fd *fd)
rtdm_timer_destroy(>close_timer);
 }
 
-static int
-rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg)
+static int rtdm_basic_ioctl(struct rtdm_fd *fd,
+   unsigned int request, void __user *arg)
 {
-   struct rtdm_test_context *ctx = rtdm_fd_to_private(fd);
+   struct rtdm_basic_context *ctx = rtdm_fd_to_private(fd);
int err = 0;
 
switch (request) {
@@ -94,7 +103,6 @@ rtdm_test_ioctl(struct rtdm_fd *fd, unsigned int request, 
void __user *arg)
RTDM_TIMERMODE_RELATIVE);
}
break;
-
default:
err = -ENOTTY;
}
@@ -102,30 +110,137 @@ 

[Xenomai-git] Philippe Gerum : testsuite/smokey: add test checking Cobalt' s cpu affinity control

2016-02-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/prioceil
Commit: ec0776f69aa3d3f4fadf3e31dc43b9c8779400da
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ec0776f69aa3d3f4fadf3e31dc43b9c8779400da

Author: Philippe Gerum 
Date:   Fri Feb 26 11:44:16 2016 +0100

testsuite/smokey: add test checking Cobalt's cpu affinity control

---

 configure.ac |1 +
 testsuite/smokey/Makefile.am |1 +
 testsuite/smokey/cpu-affinity/Makefile.am|9 ++
 testsuite/smokey/cpu-affinity/cpu-affinity.c |  180 ++
 4 files changed, 191 insertions(+)

diff --git a/configure.ac b/configure.ac
index 7aaedc2..578327e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -902,6 +902,7 @@ AC_CONFIG_FILES([ \
testsuite/smokey/net_packet_dgram/Makefile \
testsuite/smokey/net_packet_raw/Makefile \
testsuite/smokey/net_common/Makefile \
+   testsuite/smokey/cpu-affinity/Makefile \
testsuite/clocktest/Makefile \
testsuite/xeno-test/Makefile \
utils/Makefile \
diff --git a/testsuite/smokey/Makefile.am b/testsuite/smokey/Makefile.am
index e9a0fd2..5ade58b 100644
--- a/testsuite/smokey/Makefile.am
+++ b/testsuite/smokey/Makefile.am
@@ -8,6 +8,7 @@ smokey_SOURCES = main.c
 COBALT_SUBDIRS =   \
arith   \
bufp\
+   cpu-affinity\
iddp\
leaks   \
net_packet_dgram\
diff --git a/testsuite/smokey/cpu-affinity/Makefile.am 
b/testsuite/smokey/cpu-affinity/Makefile.am
new file mode 100644
index 000..0d2e4e6
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/Makefile.am
@@ -0,0 +1,9 @@
+
+noinst_LIBRARIES = libcpu-affinity.a
+
+libcpu_affinity_a_SOURCES = cpu-affinity.c
+
+libcpu_affinity_a_CPPFLAGS =   \
+   @XENO_USER_CFLAGS@  \
+   -I$(top_srcdir) \
+   -I$(top_srcdir)/include
diff --git a/testsuite/smokey/cpu-affinity/cpu-affinity.c 
b/testsuite/smokey/cpu-affinity/cpu-affinity.c
new file mode 100644
index 000..edb285e
--- /dev/null
+++ b/testsuite/smokey/cpu-affinity/cpu-affinity.c
@@ -0,0 +1,180 @@
+/*
+ * Test CPU affinity control mechanisms.
+ *
+ * Copyright (C) Philippe Gerum 
+ *
+ * Released under the terms of GPLv2.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+smokey_test_plugin(cpu_affinity,
+  SMOKEY_NOARGS,
+  "Check CPU affinity control."
+);
+
+static cpu_set_t cpu_realtime_set, cpu_online_set;
+
+struct test_context {
+   sem_t done;
+   int status;
+};
+
+static void *test_thread(void *arg)
+{
+   int cpu, cpu_in_rt_set, status = 0, ncpu, ret;
+   struct test_context *p = arg;
+   cpu_set_t set;
+
+   cpu = get_current_cpu();
+   if (!__Fassert(cpu < 0)) {
+   status = cpu;
+   goto out;
+   }
+
+   smokey_trace(".. child thread starts on CPU%d", cpu);
+
+   /*
+* When emerging, we should be running on a member of the
+* real-time CPU set.
+*/
+   cpu_in_rt_set = CPU_ISSET(cpu, _realtime_set);
+   if (!__Tassert(cpu_in_rt_set)) {
+   status = -EINVAL;
+   goto out;
+   }
+
+   for (ncpu = 0; ncpu < CPU_SETSIZE; ncpu++) {
+   if (ncpu == cpu || !CPU_ISSET(ncpu, _realtime_set))
+   continue;
+   smokey_trace(".. child moving to CPU%d", ncpu);
+   CPU_ZERO();
+   CPU_SET(ncpu, );
+   if (!__Terrno(ret, sched_setaffinity(0, sizeof(set), ))) {
+   status = ret;
+   goto out;
+   }
+   }
+out:
+   p->status = status;
+   __STD(sem_post(>done));
+   
+   return NULL;
+}
+
+static void *__run_cpu_affinity(void *arg)
+{
+   struct test_context context;
+   struct sched_param param;
+   struct timespec ts, now;
+   pthread_attr_t thattr;
+   cpu_set_t set;
+   pthread_t tid;
+   int cpu, ret;
+
+   cpu = *(int *)arg;
+   smokey_trace(".. parent binding to non-RT CPU%d", cpu);
+
+   context.status = 0;
+   __STD(sem_init(, 0, 0));
+
+   /*
+* Make the child thread inherit a CPU affinity outside of the
+* valid RT set from us. Cobalt should migrate the spawned
+* thread to a CPU from the RT set automatically.
+*/
+   CPU_ZERO();
+   CPU_SET(cpu, );
+   if (!__Terrno(ret, sched_setaffinity(0, sizeof(set), ))) {
+   context.status = ret;
+   goto out;
+   }
+
+   pthread_attr_init();
+   param.sched_priority = 1;
+   pthread_attr_setdetachstate(, PTHREAD_CREATE_DETACHED);
+   pthread_attr_setschedpolicy(, SCHED_FIFO);
+   pthread_attr_setschedparam(, );
+   pthread_attr_setinheritsched(, PTHREAD_EXPLICIT_SCHED);
+
+   if (!__T(ret, pthread_create(, , test_thread, ))) {
+