[PATCH 02/10] score: Add priority affinity smp scheduler.

Jennifer Averett Jennifer.Averett at OARcorp.com
Tue Apr 1 15:09:36 UTC 2014


RTEMS_INLINE_ROUTINE is by definition a static inline.  The others I fixed.

> -----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:23 PM
> To: Jennifer Averett
> Cc: RTEMS Devel
> Subject: Re: [PATCH 02/10] score: Add priority affinity smp scheduler.
> 
> 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 +
> >  .../rtems/score/schedulerpriorityaffinitysmp.h     | 144
> +++++++++++++++++++++
> >  cpukit/score/preinstall.am                         |   4 +
> >  cpukit/score/src/schedulerpriorityaffinitysmp.c    |  95 ++++++++++++++
> >  4 files changed, 245 insertions(+)
> >  create mode 100644
> > cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> >  create mode 100644 cpukit/score/src/schedulerpriorityaffinitysmp.c
> >
> > diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index
> > 67cc802..95406d9 100644
> > --- a/cpukit/score/Makefile.am
> > +++ b/cpukit/score/Makefile.am
> > @@ -109,6 +109,7 @@ endif
> >  if HAS_SMP
> >  include_rtems_score_HEADERS += include/rtems/score/atomic.h
> > include_rtems_score_HEADERS += include/rtems/score/cpustdatomic.h
> > +include_rtems_score_HEADERS +=
> > +include/rtems/score/schedulerpriorityaffinitysmp.h
> >  include_rtems_score_HEADERS +=
> > include/rtems/score/schedulersimplesmp.h
> >  endif
> >
> > @@ -125,6 +126,7 @@ endif
> >
> >  if HAS_SMP
> >  libscore_a_SOURCES += src/profilingsmplock.c
> > +libscore_a_SOURCES += src/schedulerpriorityaffinitysmp.c
> >  libscore_a_SOURCES += src/schedulerprioritysmp.c  libscore_a_SOURCES
> > += src/schedulersimplesmp.c  libscore_a_SOURCES +=
> > src/schedulersmpstartidle.c diff --git
> > a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> > b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> > new file mode 100644
> > index 0000000..b64f54d
> > --- /dev/null
> > +++ b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
> > @@ -0,0 +1,144 @@
> > +/**
> > + * @file
> > + *
> > + * @ingroup ScoreSchedulerPriorityAffinitySMP
> > + *
> > + * @brief Deterministic Priority Affinity SMP Scheduler API  */
> > +
> > +/*
> > + *  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.
> > + */
> > +
> > +#ifndef _RTEMS_SCORE_SCHEDULERPRIORITYAFFINITYSMP_H
> > +#define _RTEMS_SCORE_SCHEDULERPRIORITYAFFINITYSMP_H
> > +
> > +#include <rtems/score/scheduler.h>
> > +#include <rtems/score/schedulerpriority.h> #include
> > +<rtems/score/schedulersmp.h> #include
> > +<rtems/score/schedulerprioritysmp.h>
> > +#include <rtems/score/cpuset.h>
> > +
> > +#ifdef __cplusplus
> > +extern "C" {
> > +#endif /* __cplusplus */
> > +
> > +/**
> > + * @defgroup ScoreSchedulerPriorityAffinitySMP Deterministic Priority
> > +Affinity SMP Scheduler
> > + *
> > + * @ingroup ScoreScheduler
> > + *
> > + * This is an extension of the Deterministic Priority SMP Scheduler.
> > +which
> > + * is an implementation of the global fixed priority scheduler (G-FP).
> > + * It adds thread to core affinity support.
> > + *
> > + * @note This is the first iteration of this scheduler. It currently tracks
> > + *       the requested affinity to exercise the Scheduler Framework but it
> > + *       does not honor that affinity in assigning threads to cores. This
> > + *       will be added in a subsequent revision.
> > + * @{
> > + */
> > +
> > +/**
> > + * @brief Entry points for the Simple SMP Scheduler w/ Affinity.
> Keep the name consistent:
> delete the w/ Affinity and s/Simple/Deterministic Priority Affinity/
> 
> > + */
> > +#define SCHEDULER_PRIORITY_AFFINITY_SMP_ENTRY_POINTS \
> > +  { \
> > +    _Scheduler_priority_SMP_Initialize, \
> > +    _Scheduler_priority_SMP_Schedule, \
> > +    _Scheduler_priority_SMP_Yield, \
> > +    _Scheduler_priority_SMP_Block, \
> > +    _Scheduler_priority_SMP_Enqueue_fifo, \
> > +    _Scheduler_priority_affinity_SMP_Allocate, \
> > +    _Scheduler_priority_Free, \
> > +    _Scheduler_priority_SMP_Update, \
> > +    _Scheduler_priority_SMP_Enqueue_fifo, \
> > +    _Scheduler_priority_SMP_Enqueue_lifo, \
> > +    _Scheduler_priority_SMP_Extract, \
> > +    _Scheduler_priority_Priority_compare, \
> > +    _Scheduler_default_Release_job, \
> > +    _Scheduler_default_Tick, \
> > +    _Scheduler_SMP_Start_idle, \
> > +    _Scheduler_priority_affinity_SMP_Get_affinity, \
> > +    _Scheduler_priority_affinity_SMP_Set_affinity \
> > +  }
> > +
> > +/**
> > + *  @brief Allocates @a the_thread->scheduler.
> > + *
> > + *  This routine allocates @a the_thread->scheduler.
> > + *
> > + *  @param[in] the_thread is the thread the scheduler is allocating
> > + *             management memory for
> > + */
> > +void * _Scheduler_priority_affinity_SMP_Allocate( Thread_Control
> > +*the_thread );
> > +
> > +/**
> > + * @brief Get affinity for the priority affinity smp scheduler.
> > + *
> > + * @param[in] thread The associated thread.
> > + * @param[in] cpusetsize The size of the cpuset.
> > + * @param[in,out] cpuset The associated affinity set.
> > + *
> > + * @retval 0 Successfully got cpuset
> > + * @retval -1 The cpusetsize is invalid for the system  */ int
> > +_Scheduler_priority_affinity_SMP_Get_affinity(
> > +  Thread_Control *thread,
> > +  size_t          cpusetsize,
> > +  cpu_set_t      *cpuset
> > +);
> > +
> > +/**
> > + * @brief Set affinity for the priority affinity smp 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
> > + */
> > +int _Scheduler_priority_affinity_SMP_Set_affinity(
> > +  Thread_Control *thread,
> > +  size_t          cpusetsize,
> > +  cpu_set_t      *cpuset
> > +);
> > +
> > +/**
> > + * This structure handles affinity specific data of a thread.
> > + *
> > + * @note The attribute priority_sched_info must remain
> > + *       the first element in the structure so that the
> > + *       Scheduler_priority_XXX methods will continue to
> > + *       function.
> > + */
> > +typedef struct {
> > +
> > +  /**
> > +   * Data for the Priority Scheduler.
> > +   */
> > +  Scheduler_priority_Per_thread  priority_sched_info;
> An included structure gets the first letter caps, e.g. Priority_sched_info.
> 
> > +
> > +  /**
> > +   * Pointer to corresponding Thread Control Block.
> > +   */
> > +  Thread_Control *thread;
> > +
> > +  /**
> > +   * Structure containing affinity set data and size
> > +   */
> > +  CPU_set_Control affinity;
> ditto.
> 
> > +} Scheduler_priority_affinity_SMP_Per_thread;
> > +
> > +/** @} */
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif /* __cplusplus */
> > +
> > +#endif /* _RTEMS_SCORE_SCHEDULERPRIORITYSMP_H */
> > diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
> > index 68ded43..efbe37d 100644
> > --- a/cpukit/score/preinstall.am
> > +++ b/cpukit/score/preinstall.am
> > @@ -386,6 +386,10 @@
> $(PROJECT_INCLUDE)/rtems/score/cpustdatomic.h:
> include/rtems/score/cpustdatomic.
> >         $(INSTALL_DATA) $<
> > $(PROJECT_INCLUDE)/rtems/score/cpustdatomic.h
> >  PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpustdatomic.h
> >
> > +$(PROJECT_INCLUDE)/rtems/score/schedulerpriorityaffinitysmp.h:
> include/rtems/score/schedulerpriorityaffinitysmp.h
> $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
> > +       $(INSTALL_DATA) $<
> > +$(PROJECT_INCLUDE)/rtems/score/schedulerpriorityaffinitysmp.h
> > +PREINSTALL_FILES +=
> > +$(PROJECT_INCLUDE)/rtems/score/schedulerpriorityaffinitysmp.h
> > +
> >  $(PROJECT_INCLUDE)/rtems/score/schedulersimplesmp.h:
> include/rtems/score/schedulersimplesmp.h
> $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
> >         $(INSTALL_DATA) $<
> > $(PROJECT_INCLUDE)/rtems/score/schedulersimplesmp.h
> >  PREINSTALL_FILES +=
> > $(PROJECT_INCLUDE)/rtems/score/schedulersimplesmp.h
> > diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c
> > b/cpukit/score/src/schedulerpriorityaffinitysmp.c
> > new file mode 100644
> > index 0000000..aa77d8d
> > --- /dev/null
> > +++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c
> > @@ -0,0 +1,95 @@
> > +/**
> > + * @file
> > + *
> > + * @brief Deterministic Priority Affinity SMP Scheduler
> > +Implementation
> > + *
> > + * @ingroup ScoreSchedulerPriorityAffinitySMP  */
> > +
> > +/*
> > + *  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/schedulerpriorityaffinitysmp.h>
> > +#include <rtems/score/schedulerpriorityimpl.h>
> > +#include <rtems/score/schedulersmpimpl.h> #include
> > +<rtems/score/wkspace.h> #include <rtems/score/cpusetimpl.h>
> > +
> > +RTEMS_INLINE_ROUTINE Scheduler_priority_affinity_SMP_Per_thread *
> > +_Scheduler_priority_affinity_Get_scheduler_info( Thread_Control
> > +*thread ) {
> > +  return ( Scheduler_priority_affinity_SMP_Per_thread * )
> > +thread->scheduler_info; }
> Why is this here, not in an impl.h file? if file-local, then make static please.

> 
> > +
> > +void _Scheduler_priority_affinity_SMP_Initialize( void ) {
> > +  Scheduler_SMP_Control *self = _Workspace_Allocate_or_fatal_error(
> > +    sizeof( *self ) + PRIORITY_MAXIMUM * sizeof( Chain_Control )
> > +  );
> > +
> > +  _Chain_Initialize_empty( &self->scheduled );
> > + _Scheduler_priority_Ready_queue_initialize( &self->ready[ 0 ] );
> > +
> > +  _Scheduler.information = self;
> > +}
> > +
> > +void * _Scheduler_priority_affinity_SMP_Allocate( Thread_Control
> > +*the_thread ) {
> > +  Scheduler_priority_affinity_SMP_Per_thread *sched_info_of_thread =
> > +    _Workspace_Allocate( sizeof( *sched_info_of_thread ) );
> > +
> > +
> 1 newline
> 
> > +  sched_info_of_thread->affinity = *_CPU_set_Default();
> > + sched_info_of_thread->affinity.set =
> > +    &sched_info_of_thread->affinity.preallocated;
> ditto, and use a shorter variable name you can squeeze the lines better.
> > +
> > +
> > +  the_thread->scheduler_info = sched_info_of_thread;
> > +
> > +  return sched_info_of_thread;
> > +}
> > +
> > +int _Scheduler_priority_affinity_SMP_Get_affinity(
> > +  Thread_Control *thread,
> > +  size_t          cpusetsize,
> > +  cpu_set_t      *cpuset
> > +)
> > +{
> > +  Scheduler_priority_affinity_SMP_Per_thread *sched_info_of_thread =
> > +    _Scheduler_priority_affinity_Get_scheduler_info(thread);
> > +
> > +  if ( sched_info_of_thread->affinity.setsize != cpusetsize ) {
> > +    return -1;
> > +  }
> > +
> > +  CPU_COPY( cpuset, sched_info_of_thread->affinity.set );
> > +  return 0;
> > +}
> > +
> > +int _Scheduler_priority_affinity_SMP_Set_affinity(
> > +  Thread_Control *thread,
> > +  size_t          cpusetsize,
> > +  cpu_set_t      *cpuset
> > +)
> > +{
> > +  Scheduler_priority_affinity_SMP_Per_thread *sched_info_of_thread =
> > +    _Scheduler_priority_affinity_Get_scheduler_info(thread);
> > +
> > +  if ( sched_info_of_thread->affinity.setsize != cpusetsize ) {
> > +    return -1;
> > +  }
> > +
> > +  CPU_COPY( sched_info_of_thread->affinity.set, 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