diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-11 10:58:59 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-12 13:24:41 +0200 |
commit | e135271b933c896068a343b161773ce3b685be43 (patch) | |
tree | 83faf308498a9695ba551f8e5b3f7473daa37d68 /cpukit/score/src/schedulerpriorityaffinitysmp.c | |
parent | score: Use thread state lock for current state (diff) | |
download | rtems-e135271b933c896068a343b161773ce3b685be43.tar.bz2 |
score: Avoid Giant lock _Scheduler_Set_affinity()
Update #2555.
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/schedulerpriorityaffinitysmp.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c index 98487ec43f..fa56e2b1b5 100644 --- a/cpukit/score/src/schedulerpriorityaffinitysmp.c +++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c @@ -616,10 +616,8 @@ bool _Scheduler_priority_affinity_SMP_Set_affinity( const cpu_set_t *cpuset ) { - Scheduler_priority_affinity_SMP_Node *node = - _Scheduler_priority_affinity_SMP_Thread_get_node(thread); - - (void) scheduler; + Scheduler_priority_affinity_SMP_Node *node; + States_Control current_state; /* * Validate that the cpset meets basic requirements. @@ -628,6 +626,8 @@ bool _Scheduler_priority_affinity_SMP_Set_affinity( return false; } + node = _Scheduler_priority_affinity_SMP_Thread_get_node( thread ); + /* * The old and new set are the same, there is no point in * doing anything. @@ -635,9 +635,20 @@ bool _Scheduler_priority_affinity_SMP_Set_affinity( if ( CPU_EQUAL_S( cpusetsize, cpuset, node->Affinity.set ) ) return true; - _Thread_Set_state( thread, STATES_MIGRATING ); - CPU_COPY( node->Affinity.set, cpuset ); - _Thread_Clear_state( thread, STATES_MIGRATING ); + current_state = thread->current_state; + + if ( _States_Is_ready( current_state ) ) { + _Scheduler_priority_affinity_SMP_Block( scheduler, thread ); + } + + CPU_COPY( node->Affinity.set, cpuset ); + + if ( _States_Is_ready( current_state ) ) { + /* + * FIXME: Do not ignore threads in need for help. + */ + (void) _Scheduler_priority_affinity_SMP_Unblock( scheduler, thread ); + } return true; } |