[Xenomai-git] Philippe Gerum : rtipc/bufp: fix wrong TX timeout
Module: xenomai-2.6 Branch: master Commit: 701cb2dac40e98551d6edcaeb15480731a0f6eba URL: http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=701cb2dac40e98551d6edcaeb15480731a0f6eba Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: 4ba4646606fe7abb50e27bfd4ed252299e84c64c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4ba4646606fe7abb50e27bfd4ed252299e84c64c Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: 338b80d96db503caac5df94762112882effcbce5 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=338b80d96db503caac5df94762112882effcbce5 Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: beb369735fe405a4592c97f088457d85537d5b33 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=beb369735fe405a4592c97f088457d85537d5b33 Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: b34764448c05aa9de832114bfa0baa77b1f5c619 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b34764448c05aa9de832114bfa0baa77b1f5c619 Author: Jan KiszkaDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: 38df524a0479ae30cf1bb96e1054544eb21d7759 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=38df524a0479ae30cf1bb96e1054544eb21d7759 Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: 3973d289e7ea7b0f31054b25a74d5c68617bfd58 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3973d289e7ea7b0f31054b25a74d5c68617bfd58 Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: 452d78b2efa0ecbc1fd546045670ad79b1f6e758 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=452d78b2efa0ecbc1fd546045670ad79b1f6e758 Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: next Commit: 7ef97138f15a89efa19d41aa3c5a78184ddbbc1b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7ef97138f15a89efa19d41aa3c5a78184ddbbc1b Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: next Commit: f6f82cb5a7ae024cb874f72b0167bad748c74d27 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f6f82cb5a7ae024cb874f72b0167bad748c74d27 Author: Philippe GerumDate: 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
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 GerumDate: 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
Module: xenomai-3 Branch: next Commit: 63de8c561e65223c5265b851d3cff57073b85bba URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=63de8c561e65223c5265b851d3cff57073b85bba Author: Philippe GerumDate: 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
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 GerumDate: 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
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 GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: 78eae5786c1f31c5f8f6c1e0dc93b41f4ad35dce URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=78eae5786c1f31c5f8f6c1e0dc93b41f4ad35dce Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: c974cb4b95f6c0ceeddbbf9b40429bdfc9c3307c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c974cb4b95f6c0ceeddbbf9b40429bdfc9c3307c Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/prioceil Commit: ec0776f69aa3d3f4fadf3e31dc43b9c8779400da URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ec0776f69aa3d3f4fadf3e31dc43b9c8779400da Author: Philippe GerumDate: 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, ))) { +