[rtems commit] score: More robust _SMP_Multicast_action()

Sebastian Huber sebh at rtems.org
Fri Apr 12 09:15:55 UTC 2019


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Apr 12 11:13:32 2019 +0200

score: More robust _SMP_Multicast_action()

If the caller already disabled interrupts, then do not disable thread
dispatching.  Calling _SMP_Multicast_action() with interrupts disabled
is a questionable use case.

---

 cpukit/score/src/smpmulticastaction.c     | 14 ++++++++++++--
 testsuites/smptests/smpcache01/init.c     |  5 +----
 testsuites/smptests/smpmulticast01/init.c |  3 ---
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/cpukit/score/src/smpmulticastaction.c b/cpukit/score/src/smpmulticastaction.c
index 966a119..88f874e 100644
--- a/cpukit/score/src/smpmulticastaction.c
+++ b/cpukit/score/src/smpmulticastaction.c
@@ -218,6 +218,7 @@ void _SMP_Multicast_action(
   Per_CPU_Jobs     jobs;
   uint32_t         cpu_max;
   Per_CPU_Control *cpu_self;
+  uint32_t         isr_level;
 
   cpu_max = _SMP_Get_processor_maximum();
   _Assert( cpu_max <= CPU_MAXIMUM_PROCESSORS );
@@ -228,9 +229,18 @@ void _SMP_Multicast_action(
 
   jobs.handler = handler;
   jobs.arg = arg;
+  isr_level = _ISR_Get_level();
+
+  if ( isr_level == 0 ) {
+    cpu_self = _Thread_Dispatch_disable();
+  } else {
+    cpu_self = _Per_CPU_Get();
+  }
 
-  cpu_self = _Thread_Dispatch_disable();
   _SMP_Issue_action_jobs( targets, &jobs, cpu_max );
   _SMP_Wait_for_action_jobs( targets, &jobs, cpu_max, cpu_self );
-  _Thread_Dispatch_enable( cpu_self );
+
+  if ( isr_level == 0 ) {
+    _Thread_Dispatch_enable( cpu_self );
+  }
 }
diff --git a/testsuites/smptests/smpcache01/init.c b/testsuites/smptests/smpcache01/init.c
index e9cee1e..878a015 100644
--- a/testsuites/smptests/smpcache01/init.c
+++ b/testsuites/smptests/smpcache01/init.c
@@ -126,15 +126,12 @@ static void call_tests_isr_disabled( SMP_barrier_State *bs )
   broadcast_test_init();
 
   for (i = 0; i < RTEMS_ARRAY_SIZE( test_cases ); ++i) {
-    Per_CPU_Control *cpu_self;
-    ISR_Level        isr_level;
+    ISR_Level isr_level;
 
-    cpu_self = _Thread_Dispatch_disable();
     _ISR_Local_disable( isr_level );
     barrier( bs );
     ( *test_cases[ i ] )();
     _ISR_Local_enable( isr_level );
-    _Thread_Dispatch_enable( cpu_self );
     barrier( bs );
   }
 
diff --git a/testsuites/smptests/smpmulticast01/init.c b/testsuites/smptests/smpmulticast01/init.c
index 3f3f7dc..f8e74e2 100644
--- a/testsuites/smptests/smpmulticast01/init.c
+++ b/testsuites/smptests/smpmulticast01/init.c
@@ -59,14 +59,11 @@ static void multicast_action_irq_disabled(
   void *arg
 )
 {
-  Per_CPU_Control *cpu_self;
   rtems_interrupt_level level;
 
-  cpu_self = _Thread_Dispatch_disable();
   rtems_interrupt_local_disable(level);
   _SMP_Multicast_action(targets, handler, arg);
   rtems_interrupt_local_enable(level);
-  _Thread_Dispatch_enable(cpu_self);
 }
 
 static void multicast_action_dispatch_disabled(




More information about the vc mailing list