[PATCH 8/8] score: Add scheduler assignments for SMP

Gedare Bloom gedare at rtems.org
Fri Apr 11 17:27:14 UTC 2014


[...]
> diff --git a/doc/user/conf.t b/doc/user/conf.t
> index 9b093f8..e3c3f24 100644
> --- a/doc/user/conf.t
> +++ b/doc/user/conf.t
> @@ -3792,6 +3792,99 @@ guidance.  For guidance on the configuration macros, please examine
>  Deterministic Priority Scheduler.
>
>  @c
> + at c === Configuring Partitioned/Clustered Schedulers ===
> + at c
> + at subsection Configuring Partitioned/Clustered Schedulers
> +
> +Partitioned/clustered 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 partitioned/clustered
> +scheduling it is possible to honor the cache topology of a system and thus
> +avoid expensive cache synchronization traffic.
> +
> +The schedulers in an SMP system are statically configured.  First the
> +application must select which scheduling algorithms are available with the
> +following defines
> +
> + at itemize @bullet
> + at item @code{CONFIGURE_SCHEDULER_PRIORITY_SMP},
> + at item @code{CONFIGURE_SCHEDULER_SIMPLE_SMP}, and
> + at item @code{CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP}.
> + at end itemize
> +
> +After these definitions the configuration file must
> + at code{#include <rtems/scheduler.h>} to have access to scheduler specific
> +configuration macros.  Each scheduler needs a context to store state
> +information at run-time.  To provide a context for each scheduler is the next
> +step.  Use the following macros to create scheduler contexts
> +
> + at itemize @bullet
> + at item @code{RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP},
> + at item @code{RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP}, and
> + at item @code{RTEMS_SCHEDULER_CONTEXT_PRIORITY_AFFINITY_SMP}.
> + at end itemize
> +
> +The schedulers are registered in the system via the scheduler table.  To create
> +the scheduler table define @code{CONFIGURE_SCHEDULER_CONTROLS} to a list of the
> +following scheduler control initializers
> +
> + at itemize @bullet
> + at item @code{RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP},
> + at item @code{RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP}, and
> + at item @code{RTEMS_SCHEDULER_CONTROL_PRIORITY_AFFINITY_SMP}.
> + at end itemize
> +
> +The last step is to define which processor uses which scheduler.  For this
> +purpose a scheduler assignment table must be defined.  The entry count of this
> +table must be equal to the configured maximum processors
> +(@code{CONFIGURE_SMP_MAXIMUM_PROCESSORS}).  A processor assignment to a
> +scheduler can be optional or mandatory.  The boot processor must have a
> +scheduler assigned.  In case the system needs more mandatory processors than
> +available then a fatal run-time error will occur.  To specify the scheduler
> +assignments define @code{CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS} to a list of
> + at code{RTEMS_SCHEDULER_ASSIGN} macros.
> +
> +The following example shows a partitioned scheduler configuration for two
> +processors.  Each processor is owned by a Deterministic Priority scheduler
> +capable to manage 256 priority levels.  The scheduler with index zero has the
> +name @code{"BLUE"}.  The scheduler with index one has the name @code{"WOOD"}.
> +The scheduler assignments are mandatory, so the system must have at least two
> +processors, otherwise a fatal run-time error will occur during system startup.
> +
> + at example
> + at group
> +#define CONFIGURE_SMP_APPLICATION
> +
> +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 2
> +
> +#define CONFIGURE_MAXIMUM_PRIORITY 255
> +
> +#define CONFIGURE_SCHEDULER_PRIORITY_SMP
> +
> +#include <rtems/scheduler.h>
> +
> +RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, CONFIGURE_MAXIMUM_PRIORITY + 1);
> +
> +RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, CONFIGURE_MAXIMUM_PRIORITY + 1);
> +
> +#define CONFIGURE_SCHEDULER_CONTROLS \
> +  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP( \
> +    a, \
> +    rtems_build_name('B', 'L', 'U', 'E') \
> +  ), \
> +  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP( \
> +    b, \
> +    rtems_build_name('W', 'O', 'O', 'D') \
> +  )
> +
> +#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
> +  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
> +  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY)
> + at end group
> + at end example
> +
Make it more clear in the documentation that the index passed to
RTEMS_SCHEDULER_ASSIGN identifies the scheduler based on the order
they are defined in the CONFIGURE_SCHEDULER_CONTROLS, and that the
order of the assignments implies the processor being assigned.

-Gedare



More information about the devel mailing list