score: Add clustered/partitioned scheduling

Clustered/partitioned scheduling helps to control the worst-case
latencies in the system.  The goal is to reduce the amount of shared
state in the system and thus prevention of lock contention.  Modern
multi-processor systems tend to have several layers of data and
instruction caches.  With clustered/partitioned scheduling it is
possible to honour the cache topology of a system and thus avoid
expensive cache synchronization traffic.

We have clustered scheduling in case the set of processors of a system
is partitioned into non-empty pairwise-disjoint subsets.  These subsets
are called clusters.  Clusters with a cardinality of one are partitions.
Each cluster is owned by exactly one scheduler instance.
This commit is contained in:
Sebastian Huber
2014-04-15 10:41:44 +02:00
parent 27270b0d6c
commit c5831a3f9a
49 changed files with 1589 additions and 114 deletions
+113
View File
@@ -820,6 +820,119 @@ const rtems_libio_helper rtems_fs_init_helper =
#if defined(RTEMS_SMP)
const size_t _Scheduler_Count =
RTEMS_ARRAY_SIZE( _Scheduler_Table );
const Scheduler_Assignment _Scheduler_Assignments[] = {
#if defined(CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS)
CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS
#else
#define CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT \
RTEMS_SCHEDULER_ASSIGN( \
0, \
RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL \
)
CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 2
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 3
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 4
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 5
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 6
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 7
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 8
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 9
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 10
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 11
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 12
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 13
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 14
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 15
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 16
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 17
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 18
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 19
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 20
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 21
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 22
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 23
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 24
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 25
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 26
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 27
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 28
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 29
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 30
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 31
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#if CONFIGURE_SMP_MAXIMUM_PROCESSORS >= 32
, CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
#undef CONFIGURE_SMP_SCHEDULER_ASSIGN_OPT
#endif
};
RTEMS_STATIC_ASSERT(
CONFIGURE_SMP_MAXIMUM_PROCESSORS
== RTEMS_ARRAY_SIZE( _Scheduler_Assignments ),
_Scheduler_Assignments
);
#endif
#if defined(CONFIGURE_SCHEDULER_EDF)
+23
View File
@@ -26,6 +26,29 @@
#define RTEMS_SCHEDULER_CONTEXT_NAME( name ) \
_Configuration_Scheduler_ ## name
#if defined(RTEMS_SMP)
/* This object doesn't exist and indicates a configuration error */
extern const Scheduler_Control RTEMS_SCHEDULER_INVALID_INDEX;
#define RTEMS_SCHEDULER_ASSIGN_DEFAULT \
SCHEDULER_ASSIGN_DEFAULT
#define RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL \
SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL
#define RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY \
SCHEDULER_ASSIGN_PROCESSOR_MANDATORY
#define RTEMS_SCHEDULER_ASSIGN( index, attr ) \
{ \
( index ) < RTEMS_ARRAY_SIZE( _Scheduler_Table ) ? \
&_Scheduler_Table[ ( index ) ] : &RTEMS_SCHEDULER_INVALID_INDEX, \
( attr ) \
}
#define RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER { NULL, 0 }
#endif
/*
* This file should be only included in the context of <rtems/confdefs.h>.
* Define the scheduler configuration macros only in case the corresponding