summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-09 15:07:54 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-15 10:41:44 +0200
commitc5831a3f9af11228dbdaabaf01f69d37e55684ef (patch)
treee9ddedd942f3f31d239820dfc4dbcef4cde0b09a /cpukit/sapi
parentrtems: Add task get/set scheduler (diff)
downloadrtems-c5831a3f9af11228dbdaabaf01f69d37e55684ef.tar.bz2
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.
Diffstat (limited to 'cpukit/sapi')
-rw-r--r--cpukit/sapi/include/confdefs.h113
-rw-r--r--cpukit/sapi/include/rtems/scheduler.h23
2 files changed, 136 insertions, 0 deletions
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index 5ec0cf2516..c8a9d0e3a4 100644
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -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)
diff --git a/cpukit/sapi/include/rtems/scheduler.h b/cpukit/sapi/include/rtems/scheduler.h
index 06824e9370..ce5455925f 100644
--- a/cpukit/sapi/include/rtems/scheduler.h
+++ b/cpukit/sapi/include/rtems/scheduler.h
@@ -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