[PATCH] score: Add Thread_Configuration::cpu_time_budget

Gedare Bloom gedare at rtems.org
Mon Mar 15 20:24:53 UTC 2021


looks good

On Fri, Mar 12, 2021 at 12:34 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> Move the CPU time budget to the thread configuration.  This simplifies
> _Thread_Initialize().
> ---
>  cpukit/include/rtems/posix/pthreadimpl.h | 26 +++++++-------
>  cpukit/include/rtems/score/threadimpl.h  |  5 +++
>  cpukit/posix/src/psxtransschedparam.c    | 23 +++++++------
>  cpukit/posix/src/pthreadcreate.c         |  3 +-
>  cpukit/posix/src/pthreadsetschedparam.c  | 44 +++++++++---------------
>  cpukit/score/src/threadinitialize.c      | 18 +---------
>  6 files changed, 49 insertions(+), 70 deletions(-)
>
> diff --git a/cpukit/include/rtems/posix/pthreadimpl.h b/cpukit/include/rtems/posix/pthreadimpl.h
> index 52d462ab6f..723b20e8d2 100644
> --- a/cpukit/include/rtems/posix/pthreadimpl.h
> +++ b/cpukit/include/rtems/posix/pthreadimpl.h
> @@ -77,24 +77,24 @@ int _POSIX_Thread_Translate_to_sched_policy(
>  );
>
>  /**
> - * @brief Translate sched_param into SuperCore terms.
> + * @brief Translates the POSIX scheduling policy and parameters to parts of the
> + *   thread configuration.
>   *
> - * This method translates the POSIX API sched_param into the corresponding
> - * SuperCore settings.
> + * @param policy is the POSIX scheduling policy.
>   *
> - * @param[in] policy is the POSIX scheduling policy
> - * @param[in] param points to the scheduling parameter structure
> - * @param[in] budget_algorithm points to the output CPU Budget algorithm
> - * @param[in] budget_callout points to the output CPU Callout
> + * @param param is the pointer to the POSIX scheduling parameters.
>   *
> - * @retval 0 Indicates success.
> - * @retval error_code POSIX error code indicating failure.
> + * @param[out] config is the pointer to a thread configuration to set the
> + *   budget algorithm, callout, and CPU time budget.
> + *
> + * @retval 0 The operation was successful.
> + *
> + * @retval EINVAL The POSIX scheduling policy or parameters were invalid.
>   */
>  int _POSIX_Thread_Translate_sched_param(
> -  int                                  policy,
> -  const struct sched_param            *param,
> -  Thread_CPU_budget_algorithms        *budget_algorithm,
> -  Thread_CPU_budget_algorithm_callout *budget_callout
> +  int                       policy,
> +  const struct sched_param *param,
> +  Thread_Configuration     *config
>  );
>
>  RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate(void)
> diff --git a/cpukit/include/rtems/score/threadimpl.h b/cpukit/include/rtems/score/threadimpl.h
> index 1e7d58609f..d9c0779b08 100644
> --- a/cpukit/include/rtems/score/threadimpl.h
> +++ b/cpukit/include/rtems/score/threadimpl.h
> @@ -163,6 +163,11 @@ typedef struct {
>     */
>    Thread_CPU_budget_algorithm_callout budget_callout;
>
> +  /**
> +   * @brief The thread's initial CPU time budget.
> +   */
> +  uint32_t cpu_time_budget;
> +
>    /**
>     * @brief 32-bit unsigned integer name of the object for the thread.
>     */
> diff --git a/cpukit/posix/src/psxtransschedparam.c b/cpukit/posix/src/psxtransschedparam.c
> index 6fa7a43886..eba26d4932 100644
> --- a/cpukit/posix/src/psxtransschedparam.c
> +++ b/cpukit/posix/src/psxtransschedparam.c
> @@ -42,27 +42,28 @@ int _POSIX_Thread_Translate_to_sched_policy(
>  }
>
>  int _POSIX_Thread_Translate_sched_param(
> -  int                                  policy,
> -  const struct sched_param            *param,
> -  Thread_CPU_budget_algorithms        *budget_algorithm,
> -  Thread_CPU_budget_algorithm_callout *budget_callout
> +  int                       policy,
> +  const struct sched_param *param,
> +  Thread_Configuration     *config
>  )
>  {
> -  *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
> -  *budget_callout = NULL;
> +  config->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
> +  config->budget_callout = NULL;
> +  config->cpu_time_budget = 0;
>
>    if ( policy == SCHED_OTHER ) {
> -    *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
> +    config->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
>      return 0;
>    }
>
>    if ( policy == SCHED_FIFO ) {
> -    *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
> +    config->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
>      return 0;
>    }
>
>    if ( policy == SCHED_RR ) {
> -    *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
> +    config->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
> +    config->cpu_time_budget = rtems_configuration_get_ticks_per_timeslice();
>      return 0;
>    }
>
> @@ -80,8 +81,8 @@ int _POSIX_Thread_Translate_sched_param(
>          _Timespec_To_ticks( &param->sched_ss_init_budget ) )
>        return EINVAL;
>
> -    *budget_algorithm  = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
> -    *budget_callout = _POSIX_Threads_Sporadic_budget_callout;
> +    config->budget_algorithm  = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
> +    config->budget_callout = _POSIX_Threads_Sporadic_budget_callout;
>      return 0;
>    }
>  #endif
> diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c
> index 55ba73c8b4..75d3c64676 100644
> --- a/cpukit/posix/src/pthreadcreate.c
> +++ b/cpukit/posix/src/pthreadcreate.c
> @@ -171,8 +171,7 @@ int pthread_create(
>    error = _POSIX_Thread_Translate_sched_param(
>      schedpolicy,
>      &schedparam,
> -    &config.budget_algorithm,
> -    &config.budget_callout
> +    &config
>    );
>    if ( error != 0 ) {
>      return error;
> diff --git a/cpukit/posix/src/pthreadsetschedparam.c b/cpukit/posix/src/pthreadsetschedparam.c
> index 9ab543cd31..e9be24b417 100644
> --- a/cpukit/posix/src/pthreadsetschedparam.c
> +++ b/cpukit/posix/src/pthreadsetschedparam.c
> @@ -24,6 +24,7 @@
>  #endif
>
>  #include <pthread.h>
> +#include <string.h>
>  #include <errno.h>
>
>  #include <rtems/posix/pthreadimpl.h>
> @@ -32,12 +33,11 @@
>  #include <rtems/score/schedulerimpl.h>
>
>  static int _POSIX_Set_sched_param(
> -  Thread_Control                       *the_thread,
> -  int                                   policy,
> -  const struct sched_param             *param,
> -  Thread_CPU_budget_algorithms          budget_algorithm,
> -  Thread_CPU_budget_algorithm_callout   budget_callout,
> -  Thread_queue_Context                 *queue_context
> +  Thread_Control             *the_thread,
> +  int                         policy,
> +  const struct sched_param   *param,
> +  const Thread_Configuration *config,
> +  Thread_queue_Context       *queue_context
>  )
>  {
>    const Scheduler_Control *scheduler;
> @@ -103,8 +103,9 @@ static int _POSIX_Set_sched_param(
>    }
>  #endif
>
> -  the_thread->budget_algorithm = budget_algorithm;
> -  the_thread->budget_callout   = budget_callout;
> +  the_thread->cpu_time_budget  = config->cpu_time_budget;
> +  the_thread->budget_algorithm = config->budget_algorithm;
> +  the_thread->budget_callout   = config->budget_callout;
>
>  #if defined(RTEMS_POSIX_API)
>    _Priority_Node_set_priority( &api->Sporadic.Low_priority, core_low_prio );
> @@ -114,11 +115,6 @@ static int _POSIX_Set_sched_param(
>
>    if ( policy == SCHED_SPORADIC ) {
>      _POSIX_Threads_Sporadic_timer_insert( the_thread, api );
> -  } else {
> -#endif
> -    the_thread->cpu_time_budget =
> -      rtems_configuration_get_ticks_per_timeslice();
> -#if defined(RTEMS_POSIX_API)
>    }
>  #endif
>
> @@ -135,23 +131,18 @@ int pthread_setschedparam(
>  #endif
>  )
>  {
> -  Thread_CPU_budget_algorithms         budget_algorithm;
> -  Thread_CPU_budget_algorithm_callout  budget_callout;
> -  Thread_Control                      *the_thread;
> -  Per_CPU_Control                     *cpu_self;
> -  Thread_queue_Context                 queue_context;
> -  int                                  error;
> +  Thread_Configuration config;
> +  Thread_Control      *the_thread;
> +  Per_CPU_Control     *cpu_self;
> +  Thread_queue_Context queue_context;
> +  int                  error;
>
>    if ( param == NULL ) {
>      return EINVAL;
>    }
>
> -  error = _POSIX_Thread_Translate_sched_param(
> -    policy,
> -    param,
> -    &budget_algorithm,
> -    &budget_callout
> -  );
> +  memset( &config, 0, sizeof( config ) );
> +  error = _POSIX_Thread_Translate_sched_param( policy, param, &config );
>    if ( error != 0 ) {
>      return error;
>    }
> @@ -169,8 +160,7 @@ int pthread_setschedparam(
>      the_thread,
>      policy,
>      param,
> -    budget_algorithm,
> -    budget_callout,
> +    &config,
>      &queue_context
>    );
>    cpu_self = _Thread_queue_Dispatch_disable( &queue_context );
> diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
> index f11e35dcf3..18c98c6995 100644
> --- a/cpukit/score/src/threadinitialize.c
> +++ b/cpukit/score/src/threadinitialize.c
> @@ -27,7 +27,6 @@
>  #include <rtems/score/tls.h>
>  #include <rtems/score/userextimpl.h>
>  #include <rtems/score/watchdogimpl.h>
> -#include <rtems/config.h>
>
>  void _Thread_Free(
>    Thread_Information *information,
> @@ -176,6 +175,7 @@ static bool _Thread_Try_initialize(
>     */
>
>    the_thread->is_fp                  = config->is_fp;
> +  the_thread->cpu_time_budget        = config->cpu_time_budget;
>    the_thread->Start.isr_level        = config->isr_level;
>    the_thread->Start.is_preemptible   = config->is_preemptible;
>    the_thread->Start.budget_algorithm = config->budget_algorithm;
> @@ -184,22 +184,6 @@ static bool _Thread_Try_initialize(
>
>    _Thread_Timer_initialize( &the_thread->Timer, cpu );
>
> -  switch ( config->budget_algorithm ) {
> -    case THREAD_CPU_BUDGET_ALGORITHM_NONE:
> -    case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
> -      break;
> -    #if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
> -      case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
> -        the_thread->cpu_time_budget =
> -          rtems_configuration_get_ticks_per_timeslice();
> -        break;
> -    #endif
> -    #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
> -      case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
> -       break;
> -    #endif
> -  }
> -
>  #if defined(RTEMS_SMP)
>    scheduler_node = NULL;
>    scheduler_node_for_index = the_thread->Scheduler.nodes;
> --
> 2.26.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list