[PATCH] score: Add PER_CPU_DATA_NEED_INITIALIZATION()

Gedare Bloom gedare at rtems.org
Thu Jun 10 13:48:31 UTC 2021


On Thu, Jun 10, 2021 at 2:06 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> Make the initialization of the per-CPU data optional.
> ---
>  cpukit/Makefile.am                       |  1 +
>  cpukit/include/rtems/score/percpudata.h  | 14 ++++
>  cpukit/sapi/src/exinit.c                 | 13 ----
>  cpukit/score/src/percpudata.c            | 94 ++++++++++++++++++++++++
>  cpukit/score/src/smp.c                   | 42 -----------
>  spec/build/cpukit/librtemscpu.yml        |  1 +
>  testsuites/smptests/smpfatal09/init.c    |  2 +
>  testsuites/sptests/sppercpudata01/init.c |  2 +
>  8 files changed, 114 insertions(+), 55 deletions(-)
>  create mode 100644 cpukit/score/src/percpudata.c
>
> diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
> index 2782d58d93..78e33b683b 100644
> --- a/cpukit/Makefile.am
> +++ b/cpukit/Makefile.am
> @@ -840,6 +840,7 @@ librtemscpu_a_SOURCES += score/src/coremsgwkspace.c
>  librtemscpu_a_SOURCES += score/src/coremutexseize.c
>  librtemscpu_a_SOURCES += score/src/percpu.c
>  librtemscpu_a_SOURCES += score/src/percpuasm.c
> +librtemscpu_a_SOURCES += score/src/percpudata.c
>  librtemscpu_a_SOURCES += score/src/corerwlock.c
>  librtemscpu_a_SOURCES += score/src/corerwlockobtainread.c
>  librtemscpu_a_SOURCES += score/src/corerwlockobtainwrite.c
> diff --git a/cpukit/include/rtems/score/percpudata.h b/cpukit/include/rtems/score/percpudata.h
> index cae73a62b0..da454fd7bf 100644
> --- a/cpukit/include/rtems/score/percpudata.h
> +++ b/cpukit/include/rtems/score/percpudata.h
> @@ -50,6 +50,20 @@ extern "C" {
>
>  RTEMS_LINKER_RWSET_DECLARE( _Per_CPU_Data, char );
>
> +/**
> + * @brief Translation units which define per-CPU items shall call this macro
> + *   exactly once at file scope.
> + */
> +#ifdef RTEMS_SMP
> +#define PER_CPU_DATA_NEED_INITIALIZATION() \
> +  static const char * const _Per_CPU_Data_reference \
> +  RTEMS_SECTION( ".rtemsroset.reference" ) RTEMS_USED = \
> +  RTEMS_LINKER_SET_BEGIN( _Per_CPU_Data )
> +#else
> +#define PER_CPU_DATA_NEED_INITIALIZATION() \
> +  RTEMS_LINKER_RWSET_DECLARE( _Per_CPU_Data, char )
> +#endif
> +
>  /**
>   * @brief Declares a per-CPU item of the specified type.
>   *
> diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
> index 9015a369a2..c98ed08f10 100644
> --- a/cpukit/sapi/src/exinit.c
> +++ b/cpukit/sapi/src/exinit.c
> @@ -32,7 +32,6 @@
>  #include <rtems/score/heap.h>
>  #include <rtems/score/interr.h>
>  #include <rtems/score/isr.h>
> -#include <rtems/score/percpudata.h>
>  #include <rtems/score/priority.h>
>  #include <rtems/score/schedulerimpl.h>
>  #include <rtems/score/smpimpl.h>
> @@ -58,18 +57,6 @@ _Objects_Information_table[ OBJECTS_APIS_LAST + 1 ] = {
>    &_POSIX_Objects[ 0 ]
>  };
>
> -RTEMS_LINKER_RWSET(
> -  _Per_CPU_Data,
> -#if defined(RTEMS_SMP)
> -  /*
> -   * In SMP configurations, prevent false cache line sharing of per-processor
> -   * data with a proper alignment.
> -   */
> -  RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
> -#endif
> -  char
> -);
> -
>  static void rtems_initialize_data_structures(void)
>  {
>    /*
> diff --git a/cpukit/score/src/percpudata.c b/cpukit/score/src/percpudata.c
> new file mode 100644
> index 0000000000..091c6f0126
> --- /dev/null
> +++ b/cpukit/score/src/percpudata.c
> @@ -0,0 +1,94 @@
> +/**
> + * @file
> + *
> + * @ingroup RTEMSScorePerCPUData
> + *
> + * @brief This source file contains the per-CPU data linker set and its system
> + *   initialization handler.
> + */
> +
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
The SPDX should go by itself on the first line of the file, according
to our templates?

Rest of this looks good.

> + * Copyright (C) 2019, 2021 embedded brains GmbH
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <rtems/score/percpudata.h>
> +#include <rtems/score/interr.h>
> +#include <rtems/score/memory.h>
> +#include <rtems/config.h>
> +#include <rtems/sysinit.h>
> +
> +#include <string.h>
> +
> +RTEMS_LINKER_RWSET(
> +  _Per_CPU_Data,
> +#if defined(RTEMS_SMP)
> +  /*
> +   * In SMP configurations, prevent false cache line sharing of per-processor
> +   * data with a proper alignment.
> +   */
> +  RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
> +#endif
> +  char
> +);
> +
> +#if defined(RTEMS_SMP)
> +static void _Per_CPU_Data_initialize( void )
> +{
> +  uintptr_t size;
> +
> +  size = RTEMS_LINKER_SET_SIZE( _Per_CPU_Data );
> +
> +  if ( size > 0 ) {
> +    const Memory_Information *mem;
> +    Per_CPU_Control          *cpu;
> +    uint32_t                  cpu_index;
> +    uint32_t                  cpu_max;
> +
> +    mem = _Memory_Get();
> +    cpu = _Per_CPU_Get_by_index( 0 );
> +    cpu->data = RTEMS_LINKER_SET_BEGIN( _Per_CPU_Data );
> +
> +    cpu_max = rtems_configuration_get_maximum_processors();
> +
> +    for ( cpu_index = 1 ; cpu_index < cpu_max ; ++cpu_index ) {
> +      cpu = _Per_CPU_Get_by_index( cpu_index );
> +      cpu->data = _Memory_Allocate( mem, size, CPU_CACHE_LINE_BYTES );
> +
> +      if( cpu->data == NULL ) {
> +        _Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_PER_CPU_DATA );
> +      }
> +
> +      memcpy( cpu->data, RTEMS_LINKER_SET_BEGIN( _Per_CPU_Data ), size);
> +    }
> +  }
> +}
> +
> +RTEMS_SYSINIT_ITEM(
> +  _Per_CPU_Data_initialize,
> +  RTEMS_SYSINIT_PER_CPU_DATA,
> +  RTEMS_SYSINIT_ORDER_MIDDLE
> +);
> +#endif
> diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
> index 2a3405c6ef..0488464da0 100644
> --- a/cpukit/score/src/smp.c
> +++ b/cpukit/score/src/smp.c
> @@ -27,14 +27,9 @@
>
>  #include <rtems/score/smpimpl.h>
>  #include <rtems/score/assert.h>
> -#include <rtems/score/memory.h>
> -#include <rtems/score/percpudata.h>
>  #include <rtems/score/schedulerimpl.h>
>  #include <rtems/score/threadimpl.h>
>  #include <rtems/config.h>
> -#include <rtems/sysinit.h>
> -
> -#include <string.h>
>
>  #if CPU_USE_DEFERRED_FP_SWITCH == TRUE
>    #error "deferred FP switch not implemented for SMP"
> @@ -264,40 +259,3 @@ void _SMP_Send_message_multicast(
>      }
>    }
>  }
> -
> -static void _Per_CPU_Data_initialize( void )
> -{
> -  uintptr_t size;
> -
> -  size = RTEMS_LINKER_SET_SIZE( _Per_CPU_Data );
> -
> -  if ( size > 0 ) {
> -    const Memory_Information *mem;
> -    Per_CPU_Control          *cpu;
> -    uint32_t                  cpu_index;
> -    uint32_t                  cpu_max;
> -
> -    mem = _Memory_Get();
> -    cpu = _Per_CPU_Get_by_index( 0 );
> -    cpu->data = RTEMS_LINKER_SET_BEGIN( _Per_CPU_Data );
> -
> -    cpu_max = rtems_configuration_get_maximum_processors();
> -
> -    for ( cpu_index = 1 ; cpu_index < cpu_max ; ++cpu_index ) {
> -      cpu = _Per_CPU_Get_by_index( cpu_index );
> -      cpu->data = _Memory_Allocate( mem, size, CPU_CACHE_LINE_BYTES );
> -
> -      if( cpu->data == NULL ) {
> -        _Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_PER_CPU_DATA );
> -      }
> -
> -      memcpy( cpu->data, RTEMS_LINKER_SET_BEGIN( _Per_CPU_Data ), size);
> -    }
> -  }
> -}
> -
> -RTEMS_SYSINIT_ITEM(
> -  _Per_CPU_Data_initialize,
> -  RTEMS_SYSINIT_PER_CPU_DATA,
> -  RTEMS_SYSINIT_ORDER_MIDDLE
> -);
> diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
> index 810ba66352..e3f328ec5f 100644
> --- a/spec/build/cpukit/librtemscpu.yml
> +++ b/spec/build/cpukit/librtemscpu.yml
> @@ -1454,6 +1454,7 @@ source:
>  - cpukit/score/src/once.c
>  - cpukit/score/src/percpu.c
>  - cpukit/score/src/percpuasm.c
> +- cpukit/score/src/percpudata.c
>  - cpukit/score/src/pheapallocate.c
>  - cpukit/score/src/pheapextend.c
>  - cpukit/score/src/pheapfree.c
> diff --git a/testsuites/smptests/smpfatal09/init.c b/testsuites/smptests/smpfatal09/init.c
> index e67ed0a56a..dfdd11d84c 100644
> --- a/testsuites/smptests/smpfatal09/init.c
> +++ b/testsuites/smptests/smpfatal09/init.c
> @@ -36,6 +36,8 @@
>
>  #include <tmacros.h>
>
> +PER_CPU_DATA_NEED_INITIALIZATION();
> +
>  static PER_CPU_DATA_ITEM(int, i) = 123;
>
>  const char rtems_test_name[] = "SMPFATAL 9";
> diff --git a/testsuites/sptests/sppercpudata01/init.c b/testsuites/sptests/sppercpudata01/init.c
> index 3d105ee61f..fbdf4c50ad 100644
> --- a/testsuites/sptests/sppercpudata01/init.c
> +++ b/testsuites/sptests/sppercpudata01/init.c
> @@ -25,6 +25,8 @@
>
>  const char rtems_test_name[] = "SPPERCPUDATA 1";
>
> +PER_CPU_DATA_NEED_INITIALIZATION();
> +
>  static RTEMS_ALIGNED(CPU_HEAP_ALIGNMENT)
>    PER_CPU_DATA_ITEM(unsigned char, c) = 1;
>
> --
> 2.26.2
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list