We need policy-specific scheduling parameters to be checked early and unconditionally before applying them in xnsched_setparam(), even if the current scheduling policy does not change for the target thread (i.e. sched_declare() is not called).
Signed-off-by: Philippe Gerum <r...@xenomai.org> --- include/cobalt/kernel/sched.h | 12 ++++++++++++ kernel/cobalt/sched.c | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/include/cobalt/kernel/sched.h b/include/cobalt/kernel/sched.h index d2b3d0c63..3b0825d67 100644 --- a/include/cobalt/kernel/sched.h +++ b/include/cobalt/kernel/sched.h @@ -138,6 +138,8 @@ struct xnsched_class { const union xnsched_policy_param *p); void (*sched_migrate)(struct xnthread *thread, struct xnsched *sched); + int (*sched_chkparam)(struct xnthread *thread, + const union xnsched_policy_param *p); /** * Set base scheduling parameters. This routine is indirectly * called upon a change of base scheduling settings through @@ -513,6 +515,16 @@ static inline void xnsched_tick(struct xnsched *sched) sched_class->sched_tick(sched); } +static inline int xnsched_chkparam(struct xnsched_class *sched_class, + struct xnthread *thread, + const union xnsched_policy_param *p) +{ + if (sched_class->sched_chkparam) + return sched_class->sched_chkparam(thread, p); + + return 0; +} + static inline int xnsched_declare(struct xnsched_class *sched_class, struct xnthread *thread, const union xnsched_policy_param *p) diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c index a3c963bfe..f7d16fa37 100644 --- a/kernel/cobalt/sched.c +++ b/kernel/cobalt/sched.c @@ -434,6 +434,10 @@ int xnsched_set_policy(struct xnthread *thread, bool effective; int ret; + ret = xnsched_chkparam(sched_class, thread, p); + if (ret) + return ret; + /* * Declaring a thread to a new scheduling class may fail, so * we do that early, while the thread is still a member of the -- 2.17.2