diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-09-03 08:12:35 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-09-03 09:37:35 +0200 |
commit | e0a9336bf939e7bc4b0adb9227e2d2198de8dc7f (patch) | |
tree | c569bccfc3433ac758114a7daf4015b93ae74512 /cpukit/score | |
parent | score: Generalize SMP scheduler block support (diff) | |
download | rtems-e0a9336bf939e7bc4b0adb9227e2d2198de8dc7f.tar.bz2 |
score: Fix EDF SMP scheduler
Fix a special case: block a one-to-one scheduled thread while having a
non-empty affine ready queue on the same processor.
Diffstat (limited to 'cpukit/score')
-rw-r--r-- | cpukit/score/src/scheduleredfsmp.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/cpukit/score/src/scheduleredfsmp.c b/cpukit/score/src/scheduleredfsmp.c index 66e9a8ef36..874ec3e58b 100644 --- a/cpukit/score/src/scheduleredfsmp.c +++ b/cpukit/score/src/scheduleredfsmp.c @@ -276,6 +276,29 @@ static inline void _Scheduler_EDF_SMP_Insert_ready( } } +static inline void _Scheduler_EDF_SMP_Extract_from_scheduled( + Scheduler_Context *context, + Scheduler_Node *node_to_extract +) +{ + Scheduler_EDF_SMP_Context *self; + Scheduler_EDF_SMP_Node *node; + uint8_t rqi; + Scheduler_EDF_SMP_Ready_queue *ready_queue; + + self = _Scheduler_EDF_SMP_Get_self( context ); + node = _Scheduler_EDF_SMP_Node_downcast( node_to_extract ); + + _Scheduler_SMP_Extract_from_scheduled( &self->Base.Base, &node->Base.Base ); + + rqi = node->ready_queue_index; + ready_queue = &self->Ready[ rqi ]; + + if ( rqi != 0 && !_RBTree_Is_empty( &ready_queue->Queue ) ) { + _Chain_Append_unprotected( &self->Affine_queues, &ready_queue->Node ); + } +} + static inline void _Scheduler_EDF_SMP_Extract_from_ready( Scheduler_Context *context, Scheduler_Node *node_to_extract @@ -403,7 +426,7 @@ void _Scheduler_EDF_SMP_Block( context, thread, node, - _Scheduler_SMP_Extract_from_scheduled, + _Scheduler_EDF_SMP_Extract_from_scheduled, _Scheduler_EDF_SMP_Extract_from_ready, _Scheduler_EDF_SMP_Get_highest_ready, _Scheduler_EDF_SMP_Move_from_ready_to_scheduled, |