diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-03-07 13:07:02 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-03-07 13:21:00 +0100 |
commit | 088acbb01fc5060f687e4776f8fc6862060d3aa8 (patch) | |
tree | a9445b3bb7de49f8956a0b12cedc0469e1e9bda5 /cpukit/score/include/rtems/score/schedulerimpl.h | |
parent | powerpc: Optimize AltiVec context switch (diff) | |
download | rtems-088acbb01fc5060f687e4776f8fc6862060d3aa8.tar.bz2 |
score: Fix scheduler yield in SMP configurations
Check that no ask help request is registered during unblock and yield
scheduler operations. There is no need to ask for help if a scheduled
thread yields, since this is already covered by the pre-emption
detection.
Update #2556.
Diffstat (limited to 'cpukit/score/include/rtems/score/schedulerimpl.h')
-rw-r--r-- | cpukit/score/include/rtems/score/schedulerimpl.h | 23 |
1 files changed, 5 insertions, 18 deletions
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h index 53631ab4e5..c7c8bf05a0 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -10,7 +10,7 @@ /* * Copyright (C) 2010 Gedare Bloom. * Copyright (C) 2011 On-Line Applications Research Corporation (OAR). - * Copyright (c) 2014, 2016 embedded brains GmbH + * Copyright (c) 2014, 2017 embedded brains GmbH * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -114,8 +114,10 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Release_critical( } #if defined(RTEMS_SMP) +void _Scheduler_Request_ask_for_help( Thread_Control *the_thread ); + /** - * @brief Registers an ask for help request. + * @brief Registers an ask for help request if necessary. * * The actual ask for help operation is carried out during * _Thread_Do_dispatch() on a processor related to the thread. This yields a @@ -130,22 +132,7 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Ask_for_help( Thread_Control *the_thread ) _Assert( _Thread_State_is_owner( the_thread ) ); if ( the_thread->Scheduler.helping_nodes > 0 ) { - ISR_lock_Context lock_context; - Per_CPU_Control *cpu; - - _Thread_Scheduler_acquire_critical( the_thread, &lock_context ); - cpu = _Thread_Get_CPU( the_thread ); - _Per_CPU_Acquire( cpu ); - - _Chain_Append_unprotected( - &cpu->Threads_in_need_for_help, - &the_thread->Scheduler.Help_node - ); - - _Per_CPU_Release( cpu ); - _Thread_Scheduler_release_critical( the_thread, &lock_context ); - - _Thread_Dispatch_request( _Per_CPU_Get(), cpu ); + _Scheduler_Request_ask_for_help( the_thread ); } } #endif |