summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cpukit/score/src/smpmulticastaction.c14
-rw-r--r--testsuites/smptests/smpcache01/init.c5
-rw-r--r--testsuites/smptests/smpmulticast01/init.c3
3 files changed, 13 insertions, 9 deletions
diff --git a/cpukit/score/src/smpmulticastaction.c b/cpukit/score/src/smpmulticastaction.c
index 966a119217..88f874eb59 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 e9cee1eec5..878a015bf1 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 3f3f7dc3fc..f8e74e22cc 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(