[PATCH] score: Indroduce cancel job scheduler operation

Gedare Bloom gedare at rtems.org
Wed Aug 3 14:00:50 UTC 2016


good.

On Wed, Aug 3, 2016 at 9:43 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Do not use a deadline value of zero to indicate a job cancellation.  Use
> a dedicated scheduler operation for this.
> ---
>  cpukit/rtems/src/ratemoncancel.c                   |  2 +-
>  cpukit/score/include/rtems/score/scheduler.h       | 17 ++++++++
>  cpukit/score/include/rtems/score/schedulercbs.h    |  1 +
>  cpukit/score/include/rtems/score/scheduleredf.h    |  8 +++-
>  cpukit/score/include/rtems/score/schedulerimpl.h   | 14 +++++++
>  .../score/include/rtems/score/schedulerpriority.h  |  1 +
>  .../rtems/score/schedulerpriorityaffinitysmp.h     |  1 +
>  .../include/rtems/score/schedulerprioritysmp.h     |  1 +
>  cpukit/score/include/rtems/score/schedulersimple.h |  1 +
>  .../score/include/rtems/score/schedulersimplesmp.h |  1 +
>  .../score/include/rtems/score/schedulerstrongapa.h |  1 +
>  cpukit/score/src/schedulerdefaultreleasejob.c      |  9 +++++
>  cpukit/score/src/scheduleredfreleasejob.c          | 46 ++++++++++++++++++----
>  13 files changed, 94 insertions(+), 9 deletions(-)
>
> diff --git a/cpukit/rtems/src/ratemoncancel.c b/cpukit/rtems/src/ratemoncancel.c
> index af6b1ec..41ba488 100644
> --- a/cpukit/rtems/src/ratemoncancel.c
> +++ b/cpukit/rtems/src/ratemoncancel.c
> @@ -38,7 +38,7 @@ void _Rate_monotonic_Cancel(
>    cpu_self = _Thread_Dispatch_disable_critical( lock_context );
>    _Rate_monotonic_Release( owner, lock_context );
>
> -  _Scheduler_Release_job( owner, 0 );
> +  _Scheduler_Cancel_job( owner );
>
>    _Thread_Dispatch_enable( cpu_self );
>  }
> diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h
> index c20e68c..20615a2 100644
> --- a/cpukit/score/include/rtems/score/scheduler.h
> +++ b/cpukit/score/include/rtems/score/scheduler.h
> @@ -141,6 +141,12 @@ typedef struct {
>      uint64_t
>    );
>
> +  /** @see _Scheduler_Cancel_job() */
> +  void ( *cancel_job ) (
> +    const Scheduler_Control *,
> +    Thread_Control *
> +  );
> +
>    /** @see _Scheduler_Tick() */
>    void ( *tick )( const Scheduler_Control *, Thread_Control * );
>
> @@ -376,6 +382,17 @@ void _Scheduler_default_Release_job(
>  );
>
>  /**
> + * @brief Does nothing.
> + *
> + * @param[in] scheduler Unused.
> + * @param[in] the_thread Unused.
> + */
> +void _Scheduler_default_Cancel_job(
> +  const Scheduler_Control *scheduler,
> +  Thread_Control          *the_thread
> +);
> +
> +/**
>   * @brief Performs tick operations depending on the CPU budget algorithm for
>   * each executing thread.
>   *
> diff --git a/cpukit/score/include/rtems/score/schedulercbs.h b/cpukit/score/include/rtems/score/schedulercbs.h
> index a46314c..bfad633 100644
> --- a/cpukit/score/include/rtems/score/schedulercbs.h
> +++ b/cpukit/score/include/rtems/score/schedulercbs.h
> @@ -61,6 +61,7 @@ extern "C" {
>      _Scheduler_CBS_Node_initialize,  /* node initialize entry point */ \
>      _Scheduler_default_Node_destroy, /* node destroy entry point */ \
>      _Scheduler_CBS_Release_job,      /* new period of task */ \
> +    _Scheduler_EDF_Cancel_job,       /* cancel period of task */ \
>      _Scheduler_default_Tick,         /* tick entry point */ \
>      _Scheduler_default_Start_idle    /* start idle entry point */ \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> diff --git a/cpukit/score/include/rtems/score/scheduleredf.h b/cpukit/score/include/rtems/score/scheduleredf.h
> index de06344..5d9b435 100644
> --- a/cpukit/score/include/rtems/score/scheduleredf.h
> +++ b/cpukit/score/include/rtems/score/scheduleredf.h
> @@ -61,6 +61,7 @@ extern "C" {
>      _Scheduler_EDF_Node_initialize,  /* node initialize entry point */ \
>      _Scheduler_default_Node_destroy, /* node destroy entry point */ \
>      _Scheduler_EDF_Release_job,      /* new period of task */ \
> +    _Scheduler_EDF_Cancel_job,       /* cancel period of task */ \
>      _Scheduler_default_Tick,         /* tick entry point */ \
>      _Scheduler_default_Start_idle    /* start idle entry point */ \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> @@ -227,12 +228,17 @@ Scheduler_Void_or_thread _Scheduler_EDF_Yield(
>   *             the job was cancelled or deleted, thus a running task
>   *             has to be suspended.
>   */
> -void _Scheduler_EDF_Release_job (
> +void _Scheduler_EDF_Release_job(
>    const Scheduler_Control *scheduler,
>    Thread_Control          *the_thread,
>    uint64_t                 deadline
>  );
>
> +void _Scheduler_EDF_Cancel_job(
> +  const Scheduler_Control *scheduler,
> +  Thread_Control          *the_thread
> +);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
> index dd7fa28..23b73f0 100644
> --- a/cpukit/score/include/rtems/score/schedulerimpl.h
> +++ b/cpukit/score/include/rtems/score/schedulerimpl.h
> @@ -499,6 +499,20 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Release_job(
>  }
>
>  /**
> + * @brief Cancels a job of a thread with respect to the scheduler.
> + *
> + * @param[in] the_thread The thread.
> + */
> +RTEMS_INLINE_ROUTINE void _Scheduler_Cancel_job(
> +  Thread_Control *the_thread
> +)
> +{
> +  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
> +
> +  ( *scheduler->Operations.cancel_job )( scheduler, the_thread );
> +}
> +
> +/**
>   * @brief Scheduler method invoked at each clock tick.
>   *
>   * This method is invoked at each clock tick to allow the scheduler
> diff --git a/cpukit/score/include/rtems/score/schedulerpriority.h b/cpukit/score/include/rtems/score/schedulerpriority.h
> index 9501e3d..f3e805a 100644
> --- a/cpukit/score/include/rtems/score/schedulerpriority.h
> +++ b/cpukit/score/include/rtems/score/schedulerpriority.h
> @@ -51,6 +51,7 @@ extern "C" {
>      _Scheduler_priority_Node_initialize,  /* node initialize entry point */ \
>      _Scheduler_default_Node_destroy,      /* node destroy entry point */ \
>      _Scheduler_default_Release_job,       /* new period of task */ \
> +    _Scheduler_default_Cancel_job,        /* cancel period of task */ \
>      _Scheduler_default_Tick,              /* tick entry point */ \
>      _Scheduler_default_Start_idle         /* start idle entry point */ \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> diff --git a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> index 763523a..317411a 100644
> --- a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> +++ b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> @@ -61,6 +61,7 @@ extern "C" {
>      _Scheduler_priority_affinity_SMP_Node_initialize, \
>      _Scheduler_default_Node_destroy, \
>      _Scheduler_default_Release_job, \
> +    _Scheduler_default_Cancel_job, \
>      _Scheduler_default_Tick, \
>      _Scheduler_SMP_Start_idle, \
>      _Scheduler_priority_affinity_SMP_Get_affinity, \
> diff --git a/cpukit/score/include/rtems/score/schedulerprioritysmp.h b/cpukit/score/include/rtems/score/schedulerprioritysmp.h
> index 97370ac..6ae933f 100644
> --- a/cpukit/score/include/rtems/score/schedulerprioritysmp.h
> +++ b/cpukit/score/include/rtems/score/schedulerprioritysmp.h
> @@ -90,6 +90,7 @@ typedef struct {
>      _Scheduler_priority_SMP_Node_initialize, \
>      _Scheduler_default_Node_destroy, \
>      _Scheduler_default_Release_job, \
> +    _Scheduler_default_Cancel_job, \
>      _Scheduler_default_Tick, \
>      _Scheduler_SMP_Start_idle \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> diff --git a/cpukit/score/include/rtems/score/schedulersimple.h b/cpukit/score/include/rtems/score/schedulersimple.h
> index 3fa4b33..2239379 100644
> --- a/cpukit/score/include/rtems/score/schedulersimple.h
> +++ b/cpukit/score/include/rtems/score/schedulersimple.h
> @@ -51,6 +51,7 @@ extern "C" {
>      _Scheduler_default_Node_initialize,   /* node initialize entry point */ \
>      _Scheduler_default_Node_destroy,      /* node destroy entry point */ \
>      _Scheduler_default_Release_job,       /* new period of task */ \
> +    _Scheduler_default_Cancel_job,        /* cancel period of task */ \
>      _Scheduler_default_Tick,              /* tick entry point */ \
>      _Scheduler_default_Start_idle         /* start idle entry point */ \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> diff --git a/cpukit/score/include/rtems/score/schedulersimplesmp.h b/cpukit/score/include/rtems/score/schedulersimplesmp.h
> index bbcdbdb..95176dc 100644
> --- a/cpukit/score/include/rtems/score/schedulersimplesmp.h
> +++ b/cpukit/score/include/rtems/score/schedulersimplesmp.h
> @@ -73,6 +73,7 @@ typedef struct {
>      _Scheduler_simple_SMP_Node_initialize, \
>      _Scheduler_default_Node_destroy, \
>      _Scheduler_default_Release_job, \
> +    _Scheduler_default_Cancel_job, \
>      _Scheduler_default_Tick, \
>      _Scheduler_SMP_Start_idle \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> diff --git a/cpukit/score/include/rtems/score/schedulerstrongapa.h b/cpukit/score/include/rtems/score/schedulerstrongapa.h
> index 8390c2d..2cc9183 100644
> --- a/cpukit/score/include/rtems/score/schedulerstrongapa.h
> +++ b/cpukit/score/include/rtems/score/schedulerstrongapa.h
> @@ -90,6 +90,7 @@ typedef struct {
>      _Scheduler_strong_APA_Node_initialize, \
>      _Scheduler_default_Node_destroy, \
>      _Scheduler_default_Release_job, \
> +    _Scheduler_default_Cancel_job, \
>      _Scheduler_default_Tick, \
>      _Scheduler_SMP_Start_idle \
>      SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
> diff --git a/cpukit/score/src/schedulerdefaultreleasejob.c b/cpukit/score/src/schedulerdefaultreleasejob.c
> index db4ab0e..439f6b2 100644
> --- a/cpukit/score/src/schedulerdefaultreleasejob.c
> +++ b/cpukit/score/src/schedulerdefaultreleasejob.c
> @@ -31,3 +31,12 @@ void _Scheduler_default_Release_job(
>    (void) the_thread;
>    (void) deadline;
>  }
> +
> +void _Scheduler_default_Cancel_job(
> +  const Scheduler_Control *scheduler,
> +  Thread_Control          *the_thread
> +)
> +{
> +  (void) scheduler;
> +  (void) the_thread;
> +}
> diff --git a/cpukit/score/src/scheduleredfreleasejob.c b/cpukit/score/src/scheduleredfreleasejob.c
> index 76c08e0..f2ee75b 100644
> --- a/cpukit/score/src/scheduleredfreleasejob.c
> +++ b/cpukit/score/src/scheduleredfreleasejob.c
> @@ -20,7 +20,7 @@
>
>  #include <rtems/score/scheduleredfimpl.h>
>
> -static bool _Scheduler_EDF_Priority_filter(
> +static bool _Scheduler_EDF_Release_job_filter(
>    Thread_Control   *the_thread,
>    Priority_Control *new_priority_p,
>    void             *arg
> @@ -35,10 +35,6 @@ static bool _Scheduler_EDF_Priority_filter(
>    current_priority = _Thread_Get_priority( the_thread );
>    new_priority = *new_priority_p;
>
> -  if ( new_priority == 0 ) {
> -    new_priority = node->background_priority;
> -  }
> -
>    node->current_priority = new_priority;
>    the_thread->real_priority = new_priority;
>
> @@ -54,9 +50,45 @@ void _Scheduler_EDF_Release_job(
>  {
>    _Thread_Change_priority(
>      the_thread,
> -    (Priority_Control) deadline,
> +    deadline,
> +    NULL,
> +    _Scheduler_EDF_Release_job_filter,
> +    true
> +  );
> +}
> +
> +static bool _Scheduler_EDF_Cancel_job_filter(
> +  Thread_Control   *the_thread,
> +  Priority_Control *new_priority_p,
> +  void             *arg
> +)
> +{
> +  Scheduler_EDF_Node *node;
> +  Priority_Control    current_priority;
> +  Priority_Control    new_priority;
> +
> +  node = _Scheduler_EDF_Thread_get_node( the_thread );
> +
> +  current_priority = _Thread_Get_priority( the_thread );
> +  new_priority = node->background_priority;
> +
> +  node->current_priority = new_priority;
> +  the_thread->real_priority = new_priority;
> +
> +  return _Thread_Priority_less_than( current_priority, new_priority )
> +    || !_Thread_Owns_resources( the_thread );
> +}
> +
> +void _Scheduler_EDF_Cancel_job(
> +  const Scheduler_Control *scheduler,
> +  Thread_Control          *the_thread
> +)
> +{
> +  _Thread_Change_priority(
> +    the_thread,
> +    0,
>      NULL,
> -    _Scheduler_EDF_Priority_filter,
> +    _Scheduler_EDF_Cancel_job_filter,
>      true
>    );
>  }
> --
> 1.8.4.5
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list