[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