[PATCH] score: Make SMP only code explicit

Joel Sherrill joel at rtems.org
Thu Jun 23 22:33:55 UTC 2022


Does this have a gcc issue?

On Thu, Jun 23, 2022, 3:28 AM Sebastian Huber <
sebastian.huber at embedded-brains.de> wrote:

> Conditional expressions with inline functions are not optimized away if
> optimization is disabled.  Avoid such expressions to prevent dead
> branches.  It helps also during code review to immediately see if a loop
> is used or not.
> ---
>  cpukit/include/rtems/score/priorityimpl.h | 33 ++++-------------------
>  cpukit/score/src/kern_tc.c                |  4 +++
>  cpukit/score/src/threadchangepriority.c   | 10 ++++++-
>  cpukit/score/src/threadqops.c             | 16 +++++++++--
>  cpukit/score/src/watchdogtick.c           |  4 +++
>  5 files changed, 36 insertions(+), 31 deletions(-)
>
> diff --git a/cpukit/include/rtems/score/priorityimpl.h
> b/cpukit/include/rtems/score/priorityimpl.h
> index 1463bf6c2a..55cddf53be 100644
> --- a/cpukit/include/rtems/score/priorityimpl.h
> +++ b/cpukit/include/rtems/score/priorityimpl.h
> @@ -124,26 +124,6 @@ RTEMS_INLINE_ROUTINE bool _Priority_Actions_is_empty(
>    return actions->actions == NULL;
>  }
>
> -/**
> - * @brief Checks if the priority actions is valid.
> - *
> - * @param aggregation The aggregation of the priority action.
> - *
> - * @retval true The @a aggregation is valid.
> - * @retval false The @a aggregation is not valid.
> - */
> -RTEMS_INLINE_ROUTINE bool _Priority_Actions_is_valid(
> -  const Priority_Aggregation *aggregation
> -)
> -{
> -#if defined(RTEMS_SMP)
> -  return aggregation != NULL;
> -#else
> -  (void) aggregation;
> -  return false;
> -#endif
> -}
> -
>  /**
>   * @brief Moves the priority actions' actions.
>   *
> @@ -389,25 +369,22 @@ RTEMS_INLINE_ROUTINE void _Priority_Set_action(
>    aggregation->Action.type = type;
>  }
>
> +#if defined(RTEMS_SMP)
>  /**
>   * @brief Gets the next action of the priority aggregation.
>   *
> - * @param aggregation The priority aggregation to get the next action of.
> + * @param aggregation is the priority aggregation to get the next action
> of.
>   *
> - * @retval next_action The next action of @a aggregation if RTEMS_SMP is
> defined.
> - * @retval NULL RTEMS_SMP is not defined.
> + * @return Returns the next action of the priority aggregation or NULL if
> there
> + *   is no next action.
>   */
>  RTEMS_INLINE_ROUTINE Priority_Aggregation *_Priority_Get_next_action(
>    const Priority_Aggregation *aggregation
>  )
>  {
> -#if defined(RTEMS_SMP)
>    return aggregation->Action.next;
> -#else
> -  (void) aggregation;
> -  return NULL;
> -#endif
>  }
> +#endif
>
>  /**
>   * @brief Compares two priorities.
> diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c
> index 2b7aeaad31..643026a1c8 100644
> --- a/cpukit/score/src/kern_tc.c
> +++ b/cpukit/score/src/kern_tc.c
> @@ -2329,9 +2329,13 @@ _Timecounter_Tick(void)
>  {
>         Per_CPU_Control *cpu_self = _Per_CPU_Get();
>
> +#if defined(RTEMS_SMP)
>         if (_Per_CPU_Is_boot_processor(cpu_self)) {
> +#endif
>                  tc_windup(NULL);
> +#if defined(RTEMS_SMP)
>         }
> +#endif
>
>         _Watchdog_Tick(cpu_self);
>  }
> diff --git a/cpukit/score/src/threadchangepriority.c
> b/cpukit/score/src/threadchangepriority.c
> index 321bb15cab..80f030fdc6 100644
> --- a/cpukit/score/src/threadchangepriority.c
> +++ b/cpukit/score/src/threadchangepriority.c
> @@ -135,11 +135,15 @@ static void _Thread_Priority_do_perform_actions(
>    priority_aggregation = _Priority_Actions_move(
> &queue_context->Priority.Actions );
>
>    do {
> +#if defined(RTEMS_SMP)
>      Priority_Aggregation *next_aggregation;
> +#endif
>      Priority_Node        *priority_action_node;
>      Priority_Action_type  priority_action_type;
>
> +#if defined(RTEMS_SMP)
>      next_aggregation = _Priority_Get_next_action( priority_aggregation );
> +#endif
>
>      priority_action_node = priority_aggregation->Action.node;
>      priority_action_type = priority_aggregation->Action.type;
> @@ -198,8 +202,12 @@ static void _Thread_Priority_do_perform_actions(
>          break;
>      }
>
> +#if defined(RTEMS_SMP)
>      priority_aggregation = next_aggregation;
> -  } while ( _Priority_Actions_is_valid( priority_aggregation ) );
> +  } while ( priority_aggregation != NULL );
> +#else
> +  } while ( false );
> +#endif
>
>    if ( !_Priority_Actions_is_empty( &queue_context->Priority.Actions ) ) {
>      _Thread_queue_Context_add_priority_update( queue_context, the_thread
> );
> diff --git a/cpukit/score/src/threadqops.c b/cpukit/score/src/threadqops.c
> index 33fc5a44cb..fbea9f6de6 100644
> --- a/cpukit/score/src/threadqops.c
> +++ b/cpukit/score/src/threadqops.c
> @@ -404,8 +404,12 @@ static void _Thread_queue_Priority_priority_actions(
>          break;
>      }
>
> +#if defined(RTEMS_SMP)
>      priority_aggregation = _Priority_Get_next_action(
> priority_aggregation );
> -  } while ( _Priority_Actions_is_valid( priority_aggregation ) );
> +  } while ( priority_aggregation != NULL );
> +#else
> +  } while ( false );
> +#endif
>  }
>
>  static void _Thread_queue_Priority_do_initialize(
> @@ -734,14 +738,18 @@ static void
> _Thread_queue_Priority_inherit_priority_actions(
>    priority_aggregation = _Priority_Actions_move( priority_actions );
>
>    do {
> +#if defined(RTEMS_SMP)
>      Priority_Aggregation        *next_aggregation;
> +#endif
>      Scheduler_Node              *scheduler_node;
>      size_t                       scheduler_index;
>      Thread_queue_Priority_queue *priority_queue;
>      Scheduler_Node              *scheduler_node_of_owner;
>      Priority_Action_type         priority_action_type;
>
> +#if defined(RTEMS_SMP)
>      next_aggregation = _Priority_Get_next_action( priority_aggregation );
> +#endif
>
>      scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY(
> priority_aggregation );
>      scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
> @@ -797,8 +805,12 @@ static void
> _Thread_queue_Priority_inherit_priority_actions(
>          break;
>      }
>
> +#if defined(RTEMS_SMP)
>      priority_aggregation = next_aggregation;
> -  } while ( _Priority_Actions_is_valid( priority_aggregation ) );
> +  } while ( priority_aggregation != NULL );
> +#else
> +  } while ( false );
> +#endif
>  }
>
>  static void _Thread_queue_Priority_inherit_do_initialize(
> diff --git a/cpukit/score/src/watchdogtick.c
> b/cpukit/score/src/watchdogtick.c
> index 6edb3f071a..71311b598e 100644
> --- a/cpukit/score/src/watchdogtick.c
> +++ b/cpukit/score/src/watchdogtick.c
> @@ -83,9 +83,13 @@ void _Watchdog_Tick( Per_CPU_Control *cpu )
>    Thread_Control                     *executing;
>    const Thread_CPU_budget_operations *cpu_budget_operations;
>
> +#ifdef RTEMS_SMP
>    if ( _Per_CPU_Is_boot_processor( cpu ) ) {
> +#endif
>      ++_Watchdog_Ticks_since_boot;
> +#ifdef RTEMS_SMP
>    }
> +#endif
>
>    _ISR_lock_ISR_disable_and_acquire( &cpu->Watchdog.Lock, &lock_context );
>
> --
> 2.35.3
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20220623/fbec252b/attachment-0001.htm>


More information about the devel mailing list