[PATCH 01/10] score: Add get/set affinity to Scheduler Framework.

Joel Sherrill joel.sherrill at OARcorp.com
Wed Apr 2 18:07:58 UTC 2014


On 4/2/2014 12:40 PM, Jennifer Averett wrote:
> Sorry for the late response to this one:
>
> Fixing the typo and cut and paste problems.  
>
> The default scheduler is the default for the SMP system now.
> By default affinity is not supported. 
When we get a functional scheduler with affinity, the default
could change.

Currently for SMP builds but configured with 1 core, we use
the Deterministic Priority Scheduler (uniprocessor). Chris has
asked about switching to an SMP aware scheduler even for
those.  I can see both perspectives but we still want coverage
on all schedulers. This could require adding tests specifically
for the DPS.
> Jennifer
>
>> -----Original Message-----
>> From: gedare at gwmail.gwu.edu [mailto:gedare at gwmail.gwu.edu] On
>> Behalf Of Gedare Bloom
>> Sent: Monday, March 24, 2014 3:10 PM
>> To: Jennifer Averett
>> Cc: RTEMS Devel
>> Subject: Re: [PATCH 01/10] score: Add get/set affinity to Scheduler
>> Framework.
>>
>> On Mon, Mar 24, 2014 at 2:39 PM, Jennifer <jennifer.averett at oarcorp.com>
>> wrote:
>>> From: Jennifer Averett <jennifer.averett at oarcorp.com>
>>>
>>> ---
>>>  cpukit/score/Makefile.am                           |  2 +
>>>  cpukit/score/include/rtems/score/scheduler.h       | 58
>> ++++++++++++++++++++++
>>>  cpukit/score/include/rtems/score/schedulerimpl.h   | 32 ++++++++++++
>>>  .../score/include/rtems/score/schedulerpriority.h  | 11 +++-
>>>  .../include/rtems/score/schedulerprioritysmp.h     |  6 ++-
>>>  .../score/include/rtems/score/schedulersimplesmp.h |  4 +-
>>>  cpukit/score/src/schedulerdefaultgetaffinity.c     | 41 +++++++++++++++
>>>  cpukit/score/src/schedulerdefaultsetaffinity.c     | 32 ++++++++++++
>>>  8 files changed, 182 insertions(+), 4 deletions(-)  create mode
>>> 100644 cpukit/score/src/schedulerdefaultgetaffinity.c
>>>  create mode 100644 cpukit/score/src/schedulerdefaultsetaffinity.c
>>>
>>> diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index
>>> aeee4b6..67cc802 100644
>>> --- a/cpukit/score/Makefile.am
>>> +++ b/cpukit/score/Makefile.am
>>> @@ -131,6 +131,8 @@ libscore_a_SOURCES += src/schedulersmpstartidle.c
>>> libscore_a_SOURCES += src/smp.c  libscore_a_SOURCES += src/cpuset.c
>>> libscore_a_SOURCES += src/cpusetprintsupport.c
>>> +libscore_a_SOURCES += src/schedulerdefaultgetaffinity.c
>>> +libscore_a_SOURCES += src/schedulerdefaultsetaffinity.c
>>>  endif
>>>
>>>  ## CORE_APIMUTEX_C_FILES
>>> diff --git a/cpukit/score/include/rtems/score/scheduler.h
>>> b/cpukit/score/include/rtems/score/scheduler.h
>>> index ced3c00..a0e36f3 100644
>>> --- a/cpukit/score/include/rtems/score/scheduler.h
>>> +++ b/cpukit/score/include/rtems/score/scheduler.h
>>> @@ -22,6 +22,9 @@
>>>  #include <rtems/score/percpu.h>
>>>  #include <rtems/score/chain.h>
>>>  #include <rtems/score/priority.h>
>>> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) &&
>> defined(RTEMS_SMP)
>>> +  #include <sys/cpuset.h>
>>> +#endif
>>>
>>>  #ifdef __cplusplus
>>>  extern "C" {
>>> @@ -98,6 +101,24 @@ typedef struct {
>>>     * @see _Scheduler_Start_idle().
>>>     */
>>>    void ( *start_idle )( Thread_Control *thread, Per_CPU_Control
>>> *processor );
>>> +
>>> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) &&
>> defined(RTEMS_SMP)
>>> +  /**
>>> +   * @brief Obtain the processor affinity for a thread.
>>> +   *
>>> +   * @see _Scheduler_Get_affinity().
>>> +   */
>>> +  int ( *get_affinity )( Thread_Control *thread, size_t cpusetsize,
>>> +cpu_set_t *cpuset );
>>> +
>>> +
>> 1 newline please
>>
>>> +  /**
>>> +   * @brief Set the processor affinity for a thread.
>>> +   *
>>> +   * @see _Scheduler_Set_affinity().
>>> +   */
>>> +  int ( *set_affinity )( Thread_Control *thread, size_t cpusetsize,
>>> +cpu_set_t *cpuset ); #endif
>>> +
>>>  } Scheduler_Operations;
>>>
>>>  /**
>>> @@ -184,6 +205,43 @@ void _Scheduler_default_Start_idle(
>>>    Per_CPU_Control *processor
>>>  );
>>>
>>> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) &&
>> defined(RTEMS_SMP)
>>> +
>>> +  /**
>>> +   * @brief Get affinity for the default scheduler.
>>> +   *
>>> +   * @param[in] thread The associated thread.
>>> +   * @param[in] cpusetsize The size of the cpuset.
>>> +   * @param[out] cpuset Affinity set containing all CPUs.
>>> +   *
>>> +   * @retval 0 Successfully got cpuset
>>> +   * @retval -1 The cpusetsize is invalid for the system
>>> +   */
>>> +  int _Scheduler_default_Get_affinity(
>>> +    Thread_Control *thread,
>>> +    size_t          cpusetsize,
>>> +    cpu_set_t      *cpuset
>>> +  );
>>> +
>>> +  /**
>>> +   * @brief Set affinity for the default scheduler.
>>> +   *
>>> +   * @param[in] thread The associated thread.
>>> +   * @param[in] cpusetsize The size of the cpuset.
>>> +   * @param[in] cpuset Affinity new affinity set.
>>> +   *
>>> +   * @retval 0 Successful
>>> +   *
>>> +   *  This method always returns successful and does not save
>>> +   *  the cpuset.
>>> +   */
>>> +  int _Scheduler_default_Set_affinity(
>>> +    Thread_Control *thread,
>>> +    size_t          cpusetsize,
>>> +    cpu_set_t      *cpuset
>>> +  );
>>> +#endif
>>> +
>>>  /**@}*/
>>>
>>>  #ifdef __cplusplus
>>> diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h
>>> b/cpukit/score/include/rtems/score/schedulerimpl.h
>>> index 7fbaf54..021b50f 100644
>>> --- a/cpukit/score/include/rtems/score/schedulerimpl.h
>>> +++ b/cpukit/score/include/rtems/score/schedulerimpl.h
>>> @@ -240,6 +240,38 @@ RTEMS_INLINE_ROUTINE void
>> _Scheduler_Start_idle(
>>>    ( *_Scheduler.Operations.start_idle )( thread, processor );  }
>>>
>>> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) &&
>> defined(RTEMS_SMP)
>>> +  /**
>>> +   * @brief Obtain the processor affinity for a thread.
>>> +   *
>>> +   * @param[in,out] thread The idle thread for the processor.
>> idle?
>>
>>> +   * @parma[out] cpuset The processor affinity for this thread
>>> +   */
>>> +  RTEMS_INLINE_ROUTINE int _Scheduler_Get_affinity(
>>> +    Thread_Control *thread,
>>> +    size_t          cpusetsize,
>>> +    cpu_set_t      *cpuset
>>> +  )
>>> +  {
>>> +    return (*_Scheduler.Operations.get_affinity)( thread, cpusetsize,
>>> + cpuset );  }
>>> +
>>> +  /**
>>> +   * @brief Set the processor affinity for a thread.
>>> +   *
>>> +   * @param[in,out] thread The idle thread for the processor.
>> idle?
>>
>>> +   * @parma[in] cpuset The processor affinity for this thread
>>> +   */
>>> +  RTEMS_INLINE_ROUTINE int _Scheduler_Set_affinity(
>>> +    Thread_Control *thread,
>>> +    size_t          cpusetsize,
>>> +    cpu_set_t      *cpuset
>>> +  )
>>> +  {
>>> +    return (*_Scheduler.Operations.set_affinity)( thread, cpusetsize,
>>> +cpuset );
>>> +  }
>>> +#endif
>>> +
>>>  RTEMS_INLINE_ROUTINE void _Scheduler_Update_heir(
>>>    Thread_Control *heir,
>>>    bool force_dispatch
>>> diff --git a/cpukit/score/include/rtems/score/schedulerpriority.h
>>> b/cpukit/score/include/rtems/score/schedulerpriority.h
>>> index 605ab39..a9a46e9 100644
>>> --- a/cpukit/score/include/rtems/score/schedulerpriority.h
>>> +++ b/cpukit/score/include/rtems/score/schedulerpriority.h
>>> @@ -34,6 +34,14 @@ extern "C" {
>>>   */
>>>  /**@{*/
>>>
>>> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) &&
>> defined(RTEMS_SMP)
>>> +  #define SCHEDULER_PRIORITY_ADDITIONAL_SMP_ENTRY_POINTS \
>>> +    _Scheduler_default_Get_affinity,     /* get affinity entry point */ \
>>> +    _Scheduler_default_Set_affinity      /* set affinity entry point */
>>> +#else
>>> +  #define SCHEDULER_PRIORITY_ADDITIONAL_SMP_ENTRY_POINTS
>>> +#endif
>>> +
>>>  /**
>>>   *  Entry points for the Deterministic Priority Based Scheduler.
>>>   */
>>> @@ -53,7 +61,8 @@ extern "C" {
>>>      _Scheduler_priority_Priority_compare, /* compares two priorities */ \
>>>      _Scheduler_default_Release_job,       /* new period of task */ \
>>>      _Scheduler_default_Tick,              /* tick entry point */ \
>>> -    _Scheduler_default_Start_idle         /* start idle entry point */ \
>>> +    _Scheduler_default_Start_idle,        /* start idle entry point */ \
>>> +    SCHEDULER_PRIORITY_ADDITIONAL_SMP_ENTRY_POINTS \
>>>    }
>>>
>>>  /**
>> Do we support configuring an SMP system with this scheduler?
>>
>>> diff --git a/cpukit/score/include/rtems/score/schedulerprioritysmp.h
>>> b/cpukit/score/include/rtems/score/schedulerprioritysmp.h
>>> index b0e5fad..bee4232 100644
>>> --- a/cpukit/score/include/rtems/score/schedulerprioritysmp.h
>>> +++ b/cpukit/score/include/rtems/score/schedulerprioritysmp.h
>>> @@ -48,7 +48,7 @@ extern "C" {
>>>   */
>>>
>>>  /**
>>> - * @brief Entry points for the Simple SMP Scheduler.
>>> + * @brief Entry points for the Priority SMP Scheduler.
>>>   */
>>>  #define SCHEDULER_PRIORITY_SMP_ENTRY_POINTS \
>>>    { \
>>> @@ -66,7 +66,9 @@ extern "C" {
>>>      _Scheduler_priority_Priority_compare, \
>>>      _Scheduler_default_Release_job, \
>>>      _Scheduler_default_Tick, \
>>> -    _Scheduler_SMP_Start_idle \
>>> +    _Scheduler_SMP_Start_idle, \
>>> +    _Scheduler_default_Get_affinity, \
>>> +    _Scheduler_default_Set_affinity \
>>>    }
>>>
>>>  void _Scheduler_priority_SMP_Initialize( void ); diff --git
>>> a/cpukit/score/include/rtems/score/schedulersimplesmp.h
>>> b/cpukit/score/include/rtems/score/schedulersimplesmp.h
>>> index 1a69358..e8cd54b 100644
>>> --- a/cpukit/score/include/rtems/score/schedulersimplesmp.h
>>> +++ b/cpukit/score/include/rtems/score/schedulersimplesmp.h
>>> @@ -68,7 +68,9 @@ extern "C" {
>>>      _Scheduler_priority_Priority_compare, \
>>>      _Scheduler_default_Release_job, \
>>>      _Scheduler_default_Tick, \
>>> -    _Scheduler_SMP_Start_idle \
>>> +    _Scheduler_SMP_Start_idle, \
>>> +    _Scheduler_default_Get_affinity, \
>>> +    _Scheduler_default_Set_affinity \
>>>    }
>>>
>>>  void _Scheduler_simple_smp_Initialize( void ); diff --git
>>> a/cpukit/score/src/schedulerdefaultgetaffinity.c
>>> b/cpukit/score/src/schedulerdefaultgetaffinity.c
>>> new file mode 100644
>>> index 0000000..fde9b01
>>> --- /dev/null
>>> +++ b/cpukit/score/src/schedulerdefaultgetaffinity.c
>>> @@ -0,0 +1,41 @@
>>> +/**
>>> + * @file
>>> + *
>>> + * @brief Scheduler Default Get Affinity Operation
>>> + *
>>> + * @ingroup ScoreScheduler
>>> + */
>>> +
>>> +/*
>>> + *  COPYRIGHT (c) 2014.
>>> + *  On-Line Applications Research Corporation (OAR).
>>> + *
>>> + *  The license and distribution terms for this file may be
>>> + *  found in the file LICENSE in this distribution or at
>>> + *  http://www.rtems.org/license/LICENSE.
>>> + */
>>> +
>>> +#if HAVE_CONFIG_H
>>> +  #include "config.h"
>>> +#endif
>>> +
>>> +#include <rtems/score/schedulerimpl.h> #include
>>> +<rtems/score/cpusetimpl.h>
>>> +
>>> +int _Scheduler_default_Get_affinity(
>>> +  Thread_Control *thread,
>>> +  size_t          cpusetsize,
>>> +  cpu_set_t      *cpuset
>>> +)
>>> +{
>>> +  const CPU_set_Control *ctl;
>>> +
>>> +  ctl = _CPU_set_Default();
>>> +  if ( cpusetsize == ctl->setsize ) {
>> shouldn't this be !=
>>
>>> +    return -1;
>>> +  }
>>> +
>>> +  CPU_COPY( cpuset, ctl->set );
>>> +
>>> +  return 0;
>>> +}
>>> diff --git a/cpukit/score/src/schedulerdefaultsetaffinity.c
>>> b/cpukit/score/src/schedulerdefaultsetaffinity.c
>>> new file mode 100644
>>> index 0000000..9c1eef0
>>> --- /dev/null
>>> +++ b/cpukit/score/src/schedulerdefaultsetaffinity.c
>>> @@ -0,0 +1,32 @@
>>> +/**
>>> + * @file
>>> + *
>>> + * @brief Scheduler Default Set Affinity Operation
>>> + *
>>> + * @ingroup ScoreScheduler
>>> + */
>>> +
>>> +/*
>>> + *  COPYRIGHT (c) 2014.
>>> + *  On-Line Applications Research Corporation (OAR).
>>> + *
>>> + *  The license and distribution terms for this file may be
>>> + *  found in the file LICENSE in this distribution or at
>>> + *  http://www.rtems.org/license/LICENSE.
>>> + */
>>> +
>>> +#if HAVE_CONFIG_H
>>> +  #include "config.h"
>>> +#endif
>>> +
>>> +#include <rtems/score/schedulerimpl.h> #include
>>> +<rtems/score/cpusetimpl.h>
>>> +
>>> +int _Scheduler_default_Set_affinity(
>>> +  Thread_Control *thread,
>>> +  size_t          cpusetsize,
>>> +  cpu_set_t      *cpuset
>>> +)
>>> +{
>>> +  return 0;
>>> +}
>>> --
>>> 1.8.1.4
>>>
>>> _______________________________________________
>>> rtems-devel mailing list
>>> rtems-devel at rtems.org
>>> http://www.rtems.org/mailman/listinfo/rtems-devel

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985




More information about the devel mailing list