[rtems commit] score: Add _SMP_Broadcast_action()

Sebastian Huber sebh at rtems.org
Tue May 21 04:25:00 UTC 2019


Module:    rtems
Branch:    master
Commit:    658700449de9d67d8571b707eec50c06fdfb9455
Changeset: http://git.rtems.org/rtems/commit/?id=658700449de9d67d8571b707eec50c06fdfb9455

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Apr 18 06:47:01 2019 +0200

score: Add _SMP_Broadcast_action()

---

 bsps/arm/shared/clock/clock-a9mpcore.c      |  2 +-
 bsps/arm/shared/clock/clock-generic-timer.c |  2 +-
 bsps/shared/cache/cacheimpl.h               |  4 +--
 cpukit/include/rtems/score/smpimpl.h        | 24 ++++++++++++++---
 cpukit/score/src/smpmulticastaction.c       | 12 ++++++---
 testsuites/smptests/smpmulticast01/init.c   | 40 +++++++++++++++++++++++------
 6 files changed, 64 insertions(+), 20 deletions(-)

diff --git a/bsps/arm/shared/clock/clock-a9mpcore.c b/bsps/arm/shared/clock/clock-a9mpcore.c
index 2907dff..7dac844 100644
--- a/bsps/arm/shared/clock/clock-a9mpcore.c
+++ b/bsps/arm/shared/clock/clock-a9mpcore.c
@@ -124,7 +124,7 @@ static void a9mpcore_clock_secondary_initialization(
     .interval = interval
   };
 
-  _SMP_Multicast_action(NULL, a9mpcore_clock_secondary_action, &init_data);
+  _SMP_Broadcast_action(a9mpcore_clock_secondary_action, &init_data);
 
   if (cmpval - a9mpcore_clock_get_counter(gt) >= interval) {
     bsp_fatal(BSP_ARM_A9MPCORE_FATAL_CLOCK_SMP_INIT);
diff --git a/bsps/arm/shared/clock/clock-generic-timer.c b/bsps/arm/shared/clock/clock-generic-timer.c
index e851e02..88fb196 100644
--- a/bsps/arm/shared/clock/clock-generic-timer.c
+++ b/bsps/arm/shared/clock/clock-generic-timer.c
@@ -135,7 +135,7 @@ static void arm_gt_clock_secondary_action(void *arg)
 static void arm_gt_clock_secondary_initialization(uint64_t cval)
 {
 #if defined(RTEMS_SMP) && !defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR)
-  _SMP_Multicast_action(NULL, arm_gt_clock_secondary_action, &cval);
+  _SMP_Broadcast_action(arm_gt_clock_secondary_action, &cval);
 #endif
 }
 
diff --git a/bsps/shared/cache/cacheimpl.h b/bsps/shared/cache/cacheimpl.h
index dbed9c8..a91230d 100644
--- a/bsps/shared/cache/cacheimpl.h
+++ b/bsps/shared/cache/cacheimpl.h
@@ -329,7 +329,7 @@ rtems_cache_invalidate_multiple_instruction_lines(
 #if defined(RTEMS_SMP) && defined(CPU_CACHE_NO_INSTRUCTION_CACHE_SNOOPING)
   smp_cache_area area = { i_addr, n_bytes };
 
-  _SMP_Multicast_action( NULL, smp_cache_inst_inv, &area );
+  _SMP_Broadcast_action( smp_cache_inst_inv, &area );
 #else
   _CPU_cache_invalidate_instruction_range( i_addr, n_bytes );
 #endif
@@ -345,7 +345,7 @@ rtems_cache_invalidate_entire_instruction( void )
 {
 #if defined(CPU_INSTRUCTION_CACHE_ALIGNMENT)
 #if defined(RTEMS_SMP) && defined(CPU_CACHE_NO_INSTRUCTION_CACHE_SNOOPING)
-  _SMP_Multicast_action( NULL, smp_cache_inst_inv_all, NULL );
+  _SMP_Broadcast_action( smp_cache_inst_inv_all, NULL );
 #else
  _CPU_cache_invalidate_entire_instruction();
 #endif
diff --git a/cpukit/include/rtems/score/smpimpl.h b/cpukit/include/rtems/score/smpimpl.h
index 6dde8f5..bc24f82 100644
--- a/cpukit/include/rtems/score/smpimpl.h
+++ b/cpukit/include/rtems/score/smpimpl.h
@@ -253,12 +253,13 @@ void _SMP_Send_message_multicast(
 typedef void ( *SMP_Action_handler )( void *arg );
 
 /**
- * @brief Initiates an SMP multicast action to a set of target processors.
+ * @brief Initiates an SMP multicast action to the set of target processors.
  *
- * The current processor may be part of the set.
+ * The current processor may be part of the set.  In case a target processor is
+ * in a wrong state to process per-processor jobs, then this function results
+ * in an SMP_FATAL_WRONG_CPU_STATE_TO_PERFORM_JOBS fatal SMP error.
  *
- * @param targets The set of target processors for the action.  If @c NULL,
- *   then the action will be performed on all online processors.
+ * @param targets The set of target processors for the action.
  * @param handler The multicast action handler.
  * @param arg The multicast action argument.
  */
@@ -268,6 +269,21 @@ void _SMP_Multicast_action(
   void                 *arg
 );
 
+/**
+ * @brief Initiates an SMP multicast action to the set of all online
+ * processors.
+ *
+ * Simply calls _SMP_Multicast_action() with _SMP_Get_online_processors() as
+ * the target processor set.
+ *
+ * @param handler The multicast action handler.
+ * @param arg The multicast action argument.
+ */
+void _SMP_Broadcast_action(
+  SMP_Action_handler  handler,
+  void               *arg
+);
+
 #endif /* defined( RTEMS_SMP ) */
 
 /**
diff --git a/cpukit/score/src/smpmulticastaction.c b/cpukit/score/src/smpmulticastaction.c
index ea430e8..b703ba1 100644
--- a/cpukit/score/src/smpmulticastaction.c
+++ b/cpukit/score/src/smpmulticastaction.c
@@ -233,10 +233,6 @@ void _SMP_Multicast_action(
   cpu_max = _SMP_Get_processor_maximum();
   _Assert( cpu_max <= CPU_MAXIMUM_PROCESSORS );
 
-  if ( targets == NULL ) {
-    targets = _SMP_Get_online_processors();
-  }
-
   jobs.handler = handler;
   jobs.arg = arg;
   isr_level = _ISR_Get_level();
@@ -254,3 +250,11 @@ void _SMP_Multicast_action(
     _Thread_Dispatch_enable( cpu_self );
   }
 }
+
+void _SMP_Broadcast_action(
+  SMP_Action_handler  handler,
+  void               *arg
+)
+{
+  _SMP_Multicast_action( _SMP_Get_online_processors(), handler, arg );
+}
diff --git a/testsuites/smptests/smpmulticast01/init.c b/testsuites/smptests/smpmulticast01/init.c
index a5ed85c..7b2556d 100644
--- a/testsuites/smptests/smpmulticast01/init.c
+++ b/testsuites/smptests/smpmulticast01/init.c
@@ -85,6 +85,30 @@ static void multicast_action_dispatch_disabled(
   _Thread_Dispatch_enable(cpu_self);
 }
 
+static void broadcast_action_irq_disabled(
+  SMP_Action_handler handler,
+  void *arg
+)
+{
+  rtems_interrupt_level level;
+
+  rtems_interrupt_local_disable(level);
+  _SMP_Broadcast_action(handler, arg);
+  rtems_interrupt_local_enable(level);
+}
+
+static void broadcast_action_dispatch_disabled(
+  SMP_Action_handler handler,
+  void *arg
+)
+{
+  Per_CPU_Control *cpu_self;
+
+  cpu_self = _Thread_Dispatch_disable();
+  _SMP_Broadcast_action(handler, arg);
+  _Thread_Dispatch_enable(cpu_self);
+}
+
 static void action(void *arg)
 {
   Atomic_Uint *id;
@@ -147,7 +171,7 @@ static void test_unicast(
 
 static void test_broadcast(
   test_context *ctx,
-  void (*multicast_action)(const Processor_mask *, SMP_Action_handler, void *)
+  void (*broadcast_action)(SMP_Action_handler, void *)
 )
 {
   uint32_t step;
@@ -163,7 +187,7 @@ static void test_broadcast(
 
     clear_ids_by_worker(ctx, 0);
 
-    (*multicast_action)(NULL, action, &ctx->id[0][0]);
+    (*broadcast_action)(action, &ctx->id[0][0]);
 
     for (j = 0; j < n; ++j) {
       unsigned id;
@@ -255,15 +279,15 @@ static void test_before_multitasking(void)
   T_case_end();
 
   T_case_begin("BroadcastBeforeMultitasking", NULL);
-  test_broadcast(ctx, _SMP_Multicast_action);
+  test_broadcast(ctx, _SMP_Broadcast_action);
   T_case_end();
 
   T_case_begin("BroadcastBeforeMultitaskingIRQDisabled", NULL);
-  test_broadcast(ctx, multicast_action_irq_disabled);
+  test_broadcast(ctx, broadcast_action_irq_disabled);
   T_case_end();
 
   T_case_begin("BroadcastBeforeMultitaskingDispatchDisabled", NULL);
-  test_broadcast(ctx, multicast_action_dispatch_disabled);
+  test_broadcast(ctx, broadcast_action_dispatch_disabled);
   T_case_end();
 }
 
@@ -340,17 +364,17 @@ T_TEST_CASE(UnicastDuringMultitaskingDispatchDisabled)
 
 T_TEST_CASE(BroadcastDuringMultitasking)
 {
-  test_broadcast(&test_instance, _SMP_Multicast_action);
+  test_broadcast(&test_instance, _SMP_Broadcast_action);
 }
 
 T_TEST_CASE(BroadcastDuringMultitaskingIRQDisabled)
 {
-  test_broadcast(&test_instance, multicast_action_irq_disabled);
+  test_broadcast(&test_instance, broadcast_action_irq_disabled);
 }
 
 T_TEST_CASE(BroadcastDuringMultitaskingDispatchDisabled)
 {
-  test_broadcast(&test_instance, multicast_action_dispatch_disabled);
+  test_broadcast(&test_instance, broadcast_action_dispatch_disabled);
 }
 
 static void Init(rtems_task_argument arg)



More information about the vc mailing list