[PATCH 27/27] score: Restrict affinity for EDF SMP scheduler

Gedare Bloom gedare at rtems.org
Sun Nov 21 00:42:39 UTC 2021


ok other than my comments. nothing looked major.

On Mon, Nov 15, 2021 at 10:14 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> The SMP EDF scheduler supports a one-to-one and one-to-all thread to
> processor affinity. It accepted affinity sets which are a proper
> subset of the online processor containing at least two processors owned by
> the scheduler. In this case it used a one-to-one thread to processor
> affinity. This leads to undefined behaviour if a processor is removed
> since the higher level check in rtems_scheduler_remove_processor() does
> not account for this implementation detail.
>
> Restrict the affinity set accepted by the SMP EDF scheduler to
>
> 1. all online processors, or
>
> 2. exactly one processor owned by the scheduler.
>
> Close #4545.
> ---
>  cpukit/score/src/scheduleredfsmp.c | 30 ++++++++++++++++++++++++------
>  1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/cpukit/score/src/scheduleredfsmp.c b/cpukit/score/src/scheduleredfsmp.c
> index 93c3c126f7..96b530e912 100644
> --- a/cpukit/score/src/scheduleredfsmp.c
> +++ b/cpukit/score/src/scheduleredfsmp.c
> @@ -885,20 +885,38 @@ Status_Control _Scheduler_EDF_SMP_Set_affinity(
>  {
>    Scheduler_Context      *context;
>    Scheduler_EDF_SMP_Node *node;
> -  Processor_mask          local_affinity;
>    uint8_t                 rqi;
>
>    context = _Scheduler_Get_context( scheduler );
> -  _Processor_mask_And( &local_affinity, &context->Processors, affinity );
>
> -  if ( _Processor_mask_Is_zero( &local_affinity ) ) {
> -    return STATUS_INVALID_NUMBER;
> -  }
> +  /*
> +   * We support a thread to processor affinity to all online processors and an
> +   * affinity to exactly one processor owned by the scheduler.  This
> +   * restriction is necessary to avoid issues if processors are added or
> +   * removed to or from the scheduler.
> +   */
>
>    if ( _Processor_mask_Is_equal( affinity, &_SMP_Online_processors ) ) {
>      rqi = 0;
>    } else {
> -    rqi = _Processor_mask_Find_last_set( &local_affinity );
> +    Processor_mask local_affinity;
> +    Processor_mask only_last_affinity;
> +    uint32_t       last;
> +
> +    _Processor_mask_And( &local_affinity, &context->Processors, affinity );
> +
> +    if ( _Processor_mask_Is_zero( &local_affinity ) ) {
> +      return STATUS_INVALID_NUMBER;
> +    }
> +
> +    last = _Processor_mask_Find_last_set( &local_affinity );
> +    _Processor_mask_From_index( &only_last_affinity, last - 1 );
> +
> +    if ( !_Processor_mask_Is_equal( &local_affinity, &only_last_affinity ) ) {
> +      return STATUS_INVALID_NUMBER;
> +    }
> +
> +    rqi = last;
>    }
>
>    node = _Scheduler_EDF_SMP_Node_downcast( node_base );
> --
> 2.26.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list