[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 98104ab792aea3f512397542b32dc569a0416351 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=98104ab792aea3f512397542b32dc569a0416351 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: eb47b60464d07604b7c9950bdbe82eafd4e8be06 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=eb47b60464d07604b7c9950bdbe82eafd4e8be06 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 45e7c8fc2cf3c367e534fc4b1fbbe5a090fae278 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=45e7c8fc2cf3c367e534fc4b1fbbe5a090fae278 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 2bee25e9d4dcdb38c8249b04455c91ae9ab9ac9b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2bee25e9d4dcdb38c8249b04455c91ae9ab9ac9b 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 3fa4fbd1fc6d8248e954c7d75f4e8fa14cc33c41 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3fa4fbd1fc6d8248e954c7d75f4e8fa14cc33c41 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 93710bdc6bb37db6a76df98fbc91d8c324145c62 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=93710bdc6bb37db6a76df98fbc91d8c324145c62 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: c4cb2e7509ce70bfd5835dd06feaca7330d9efcc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c4cb2e7509ce70bfd5835dd06feaca7330d9efcc 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 8ad1058af51494f804cbd593ae95b5c271eb470d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8ad1058af51494f804cbd593ae95b5c271eb470d 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 19253cbad899de21fc18167eecec83061fb2f91f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=19253cbad899de21fc18167eecec83061fb2f91f 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 577bcce5e33f0830885d7362ade77c3d7bb488f8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=577bcce5e33f0830885d7362ade77c3d7bb488f8 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: b436abc0f6060937e41e780cec9ee3f0adfaaeb3 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b436abc0f6060937e41e780cec9ee3f0adfaaeb3 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: e65a90c770549ad688bc56d40049d6a2c3993ded URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e65a90c770549ad688bc56d40049d6a2c3993ded 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 7d3040759614630513e580e1dbea394447fd953d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7d3040759614630513e580e1dbea394447fd953d 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 82584cf49b3780e26465a537b47b0216878360c1 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=82584cf49b3780e26465a537b47b0216878360c1 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 9d41c0ef9d49772c6aceac59031773bb75fc5bd0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9d41c0ef9d49772c6aceac59031773bb75fc5bd0 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: c6bb9126f09439d09a5838593298f4093d7f64d4 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c6bb9126f09439d09a5838593298f4093d7f64d4 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: f64931ceac4bbcceef8e05c5e12c1f6aca9f3b05 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f64931ceac4bbcceef8e05c5e12c1f6aca9f3b05 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: e072106930d31b0be709b1e27bdbb2735e2ad341 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e072106930d31b0be709b1e27bdbb2735e2ad341 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/dovetail Commit: 2e1dc6e9221201b592061a2b323a669ca1707f28 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2e1dc6e9221201b592061a2b323a669ca1707f28 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/setsched-norelax Commit: 1d7ebd9240031e3214eb55ca0d20b999f39d43bc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1d7ebd9240031e3214eb55ca0d20b999f39d43bc 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: 1d7ebd9240031e3214eb55ca0d20b999f39d43bc URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1d7ebd9240031e3214eb55ca0d20b999f39d43bc 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: 2e1dc6e9221201b592061a2b323a669ca1707f28 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2e1dc6e9221201b592061a2b323a669ca1707f28 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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..992a5ba 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(&thread->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 if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to check the eff
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: baf99f253fbd9a94b33af36cc500b4cd2c58ae61 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=baf99f253fbd9a94b33af36cc500b4cd2c58ae61 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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(&thread->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 need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: a654dd2aa0ba8b07df636ccf653b3319ae16feef URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a654dd2aa0ba8b07df636ccf653b3319ae16feef 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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(&thread->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 need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: 750901d965748695d7d4d93bbabd3960ad6d2e87 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=750901d965748695d7d4d93bbabd3960ad6d2e87 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 | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,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(&thread->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 need to check
[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 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(&thread->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 need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: 6c59b96784d9db461e3b1394d49887b1ac364f36 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6c59b96784d9db461e3b1394d49887b1ac364f36 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(&thread->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 need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: b522dab80aae1fdbdfa4cf52e3996b2fa2c4c95c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b522dab80aae1fdbdfa4cf52e3996b2fa2c4c95c 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(&thread->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 need to check
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: wip/prioceil Commit: 44e7238dd977de64c15978630be17a6b2a6c968f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=44e7238dd977de64c15978630be17a6b2a6c968f 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 | 48 ++- 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/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| 83 ++-- 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 | 622 +++- kernel/cobalt/thread.c | 117 +++--- 30 files changed, 1010 insertions(+), 474 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(&thread->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 need to check the effective priority +* level for determi