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

Jennifer Averett Jennifer.Averett at OARcorp.com
Wed Apr 2 17:40:40 UTC 2014


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. 

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




More information about the devel mailing list