On Mon, Mar 24, 2014 at 2:39 PM, Jennifer <jennifer.aver...@oarcorp.com> wrote: > From: Jennifer Averett <jennifer.aver...@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@rtems.org > http://www.rtems.org/mailman/listinfo/rtems-devel _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel