[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