summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-10-29 14:17:54 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-11-23 11:00:28 +0100
commit4d90289e7169ad96137b7b92b7f05d25bd82ab08 (patch)
tree2c4257fcc332ba8e6793258b837b4c1141420109
parentscore: Remove victim thread from CPU allocation (diff)
downloadrtems-4d90289e7169ad96137b7b92b7f05d25bd82ab08.tar.bz2
score: _Scheduler_SMP_Schedule_highest_ready()
Simplify callers of _Scheduler_SMP_Schedule_highest_ready(). Move the node state change and the extraction from scheduled into _Scheduler_SMP_Schedule_highest_ready(). Move the idle thread release to the caller which have more information about the presence of an idle thread. Update #4531.
-rw-r--r--cpukit/include/rtems/score/schedulersmpimpl.h97
-rw-r--r--cpukit/score/src/scheduleredfsmp.c6
-rw-r--r--cpukit/score/src/schedulerpriorityaffinitysmp.c6
-rw-r--r--cpukit/score/src/schedulerprioritysmp.c6
-rw-r--r--cpukit/score/src/schedulersimplesmp.c6
-rw-r--r--cpukit/score/src/schedulerstrongapa.c6
6 files changed, 59 insertions, 68 deletions
diff --git a/cpukit/include/rtems/score/schedulersmpimpl.h b/cpukit/include/rtems/score/schedulersmpimpl.h
index 1c6054bc09..811376aa61 100644
--- a/cpukit/include/rtems/score/schedulersmpimpl.h
+++ b/cpukit/include/rtems/score/schedulersmpimpl.h
@@ -1098,7 +1098,9 @@ static inline void _Scheduler_SMP_Extract_from_scheduled(
*
* @param context The scheduler context instance.
* @param victim The node of the thread that is repressed by the newly scheduled thread.
- * @param victim_cpu The cpu to allocate.
+ * @param cpu is the processor to allocate.
+ * @param extract_from_scheduled Function to extract a node from the set of
+ * scheduled nodes.
* @param extract_from_ready Function to extract a node from the set of
* ready nodes.
* @param get_highest_ready Function to get the highest ready node.
@@ -1110,22 +1112,19 @@ static inline void _Scheduler_SMP_Extract_from_scheduled(
static inline void _Scheduler_SMP_Schedule_highest_ready(
Scheduler_Context *context,
Scheduler_Node *victim,
- Per_CPU_Control *victim_cpu,
+ Per_CPU_Control *cpu,
+ Scheduler_SMP_Extract extract_from_scheduled,
Scheduler_SMP_Extract extract_from_ready,
Scheduler_SMP_Get_highest_ready get_highest_ready,
Scheduler_SMP_Move move_from_ready_to_scheduled,
Scheduler_SMP_Allocate_processor allocate_processor,
- Scheduler_Get_idle_node get_idle_node,
- Scheduler_Release_idle_node release_idle_node
+ Scheduler_Get_idle_node get_idle_node
)
{
Scheduler_SMP_Action action;
- (void) _Scheduler_Release_idle_thread_if_necessary(
- victim,
- release_idle_node,
- context
- );
+ _Scheduler_SMP_Node_change_state( victim, SCHEDULER_SMP_NODE_BLOCKED );
+ ( *extract_from_scheduled )( context, victim );
while ( true ) {
Scheduler_Node *highest_ready = ( *get_highest_ready )( context, victim );
@@ -1140,7 +1139,7 @@ static inline void _Scheduler_SMP_Schedule_highest_ready(
_Scheduler_SMP_Allocate_processor(
context,
highest_ready,
- victim_cpu,
+ cpu,
allocate_processor
);
@@ -1239,14 +1238,13 @@ static inline void _Scheduler_SMP_Block(
Scheduler_SMP_Get_highest_ready get_highest_ready,
Scheduler_SMP_Move move_from_ready_to_scheduled,
Scheduler_SMP_Allocate_processor allocate_processor,
- Scheduler_Get_idle_node get_idle_node,
- Scheduler_Release_idle_node release_idle_node
+ Scheduler_Get_idle_node get_idle_node
)
{
int sticky_level;
ISR_lock_Context lock_context;
Scheduler_SMP_Node_state node_state;
- Per_CPU_Control *thread_cpu;
+ Per_CPU_Control *cpu;
sticky_level = node->sticky_level;
--sticky_level;
@@ -1254,8 +1252,8 @@ static inline void _Scheduler_SMP_Block(
_Assert( sticky_level >= 0 );
_Thread_Scheduler_acquire_critical( thread, &lock_context );
- thread_cpu = _Thread_Get_CPU( thread );
- _Thread_Scheduler_cancel_need_for_help( thread, thread_cpu );
+ cpu = _Thread_Get_CPU( thread );
+ _Thread_Scheduler_cancel_need_for_help( thread, cpu );
_Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_BLOCKED );
_Thread_Scheduler_release_critical( thread, &lock_context );
@@ -1269,8 +1267,8 @@ static inline void _Scheduler_SMP_Block(
Thread_Control *idle;
idle = _Scheduler_Use_idle_thread( node, get_idle_node, context );
- _Thread_Set_CPU( idle, thread_cpu );
- _Thread_Dispatch_update_heir( _Per_CPU_Get(), thread_cpu, idle );
+ _Thread_Set_CPU( idle, cpu );
+ _Thread_Dispatch_update_heir( _Per_CPU_Get(), cpu, idle );
}
return;
@@ -1279,22 +1277,20 @@ static inline void _Scheduler_SMP_Block(
_Assert( _Scheduler_Node_get_user( node ) == thread );
_Assert( _Scheduler_Node_get_idle( node ) == NULL );
- _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_BLOCKED );
-
if ( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) {
- ( *extract_from_scheduled )( context, node );
_Scheduler_SMP_Schedule_highest_ready(
context,
node,
- thread_cpu,
+ cpu,
+ extract_from_scheduled,
extract_from_ready,
get_highest_ready,
move_from_ready_to_scheduled,
allocate_processor,
- get_idle_node,
- release_idle_node
+ get_idle_node
);
} else if ( node_state == SCHEDULER_SMP_NODE_READY ) {
+ _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_BLOCKED );
( *extract_from_ready )( context, node );
}
}
@@ -1683,8 +1679,7 @@ static inline void _Scheduler_SMP_Withdraw_node(
Scheduler_SMP_Get_highest_ready get_highest_ready,
Scheduler_SMP_Move move_from_ready_to_scheduled,
Scheduler_SMP_Allocate_processor allocate_processor,
- Scheduler_Get_idle_node get_idle_node,
- Scheduler_Release_idle_node release_idle_node
+ Scheduler_Get_idle_node get_idle_node
)
{
ISR_lock_Context lock_context;
@@ -1693,30 +1688,32 @@ static inline void _Scheduler_SMP_Withdraw_node(
_Thread_Scheduler_acquire_critical( thread, &lock_context );
node_state = _Scheduler_SMP_Node_state( node );
- _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_BLOCKED );
if ( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) {
- Per_CPU_Control *thread_cpu;
+ Per_CPU_Control *cpu;
_Assert( thread == _Scheduler_Node_get_user( node ) );
- thread_cpu = _Thread_Get_CPU( thread );
+ cpu = _Thread_Get_CPU( thread );
_Scheduler_Thread_change_state( thread, next_state );
_Thread_Scheduler_release_critical( thread, &lock_context );
- ( *extract_from_scheduled )( context, node );
+ _Assert( _Scheduler_Node_get_user( node ) == thread );
+ _Assert( _Scheduler_Node_get_idle( node ) == NULL );
+
_Scheduler_SMP_Schedule_highest_ready(
context,
node,
- thread_cpu,
+ cpu,
+ extract_from_scheduled,
extract_from_ready,
get_highest_ready,
move_from_ready_to_scheduled,
allocate_processor,
- get_idle_node,
- release_idle_node
+ get_idle_node
);
} else if ( node_state == SCHEDULER_SMP_NODE_READY ) {
_Thread_Scheduler_release_critical( thread, &lock_context );
+ _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_BLOCKED );
( *extract_from_ready )( context, node );
} else {
_Assert( node_state == SCHEDULER_SMP_NODE_BLOCKED );
@@ -1789,25 +1786,29 @@ static inline void _Scheduler_SMP_Clean_sticky(
node_state = _Scheduler_SMP_Node_state( node );
- if ( node_state == SCHEDULER_SMP_NODE_SCHEDULED && node->idle != NULL ) {
- Scheduler_Context *context;
+ if ( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) {
+ Thread_Control *idle;
- context = _Scheduler_Get_context( scheduler );
+ idle = _Scheduler_Node_get_idle( node );
- _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_BLOCKED );
- ( *extract_from_scheduled )( context, node );
+ if ( idle != NULL ) {
+ Scheduler_Context *context;
- _Scheduler_SMP_Schedule_highest_ready(
- context,
- node,
- _Thread_Get_CPU( node->idle ),
- extract_from_ready,
- get_highest_ready,
- move_from_ready_to_scheduled,
- allocate_processor,
- get_idle_node,
- release_idle_node
- );
+ context = _Scheduler_Get_context( scheduler );
+
+ _Scheduler_Release_idle_thread( node, idle, release_idle_node, context );
+ _Scheduler_SMP_Schedule_highest_ready(
+ context,
+ node,
+ _Thread_Get_CPU( idle ),
+ extract_from_scheduled,
+ extract_from_ready,
+ get_highest_ready,
+ move_from_ready_to_scheduled,
+ allocate_processor,
+ get_idle_node
+ );
+ }
}
}
diff --git a/cpukit/score/src/scheduleredfsmp.c b/cpukit/score/src/scheduleredfsmp.c
index 3de3be11a0..93c3c126f7 100644
--- a/cpukit/score/src/scheduleredfsmp.c
+++ b/cpukit/score/src/scheduleredfsmp.c
@@ -534,8 +534,7 @@ void _Scheduler_EDF_SMP_Block(
_Scheduler_EDF_SMP_Get_highest_ready,
_Scheduler_EDF_SMP_Move_from_ready_to_scheduled,
_Scheduler_EDF_SMP_Allocate_processor,
- _Scheduler_EDF_SMP_Get_idle,
- _Scheduler_EDF_SMP_Release_idle
+ _Scheduler_EDF_SMP_Get_idle
);
}
@@ -691,8 +690,7 @@ void _Scheduler_EDF_SMP_Withdraw_node(
_Scheduler_EDF_SMP_Get_highest_ready,
_Scheduler_EDF_SMP_Move_from_ready_to_scheduled,
_Scheduler_EDF_SMP_Allocate_processor,
- _Scheduler_EDF_SMP_Get_idle,
- _Scheduler_EDF_SMP_Release_idle
+ _Scheduler_EDF_SMP_Get_idle
);
}
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c
index 63d9ae47b1..9a71dfd1ae 100644
--- a/cpukit/score/src/schedulerpriorityaffinitysmp.c
+++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c
@@ -192,8 +192,7 @@ void _Scheduler_priority_affinity_SMP_Block(
_Scheduler_priority_affinity_SMP_Get_highest_ready,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled,
_Scheduler_SMP_Allocate_processor_exact,
- _Scheduler_priority_SMP_Get_idle,
- _Scheduler_priority_SMP_Release_idle
+ _Scheduler_priority_SMP_Get_idle
);
/*
@@ -528,8 +527,7 @@ void _Scheduler_priority_affinity_SMP_Withdraw_node(
_Scheduler_priority_affinity_SMP_Get_highest_ready,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled,
_Scheduler_SMP_Allocate_processor_lazy,
- _Scheduler_priority_SMP_Get_idle,
- _Scheduler_priority_SMP_Release_idle
+ _Scheduler_priority_SMP_Get_idle
);
}
diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c
index a33b44587f..14565405ec 100644
--- a/cpukit/score/src/schedulerprioritysmp.c
+++ b/cpukit/score/src/schedulerprioritysmp.c
@@ -120,8 +120,7 @@ void _Scheduler_priority_SMP_Block(
_Scheduler_priority_SMP_Get_highest_ready,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled,
_Scheduler_SMP_Allocate_processor_lazy,
- _Scheduler_priority_SMP_Get_idle,
- _Scheduler_priority_SMP_Release_idle
+ _Scheduler_priority_SMP_Get_idle
);
}
@@ -274,8 +273,7 @@ void _Scheduler_priority_SMP_Withdraw_node(
_Scheduler_priority_SMP_Get_highest_ready,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled,
_Scheduler_SMP_Allocate_processor_lazy,
- _Scheduler_priority_SMP_Get_idle,
- _Scheduler_priority_SMP_Release_idle
+ _Scheduler_priority_SMP_Get_idle
);
}
diff --git a/cpukit/score/src/schedulersimplesmp.c b/cpukit/score/src/schedulersimplesmp.c
index 086d00094d..ebbf00bbc4 100644
--- a/cpukit/score/src/schedulersimplesmp.c
+++ b/cpukit/score/src/schedulersimplesmp.c
@@ -213,8 +213,7 @@ void _Scheduler_simple_SMP_Block(
_Scheduler_simple_SMP_Get_highest_ready,
_Scheduler_simple_SMP_Move_from_ready_to_scheduled,
_Scheduler_SMP_Allocate_processor_lazy,
- _Scheduler_simple_SMP_Get_idle,
- _Scheduler_simple_SMP_Release_idle
+ _Scheduler_simple_SMP_Get_idle
);
}
@@ -367,8 +366,7 @@ void _Scheduler_simple_SMP_Withdraw_node(
_Scheduler_simple_SMP_Get_highest_ready,
_Scheduler_simple_SMP_Move_from_ready_to_scheduled,
_Scheduler_SMP_Allocate_processor_lazy,
- _Scheduler_simple_SMP_Get_idle,
- _Scheduler_simple_SMP_Release_idle
+ _Scheduler_simple_SMP_Get_idle
);
}
diff --git a/cpukit/score/src/schedulerstrongapa.c b/cpukit/score/src/schedulerstrongapa.c
index 265ef1a797..c897652320 100644
--- a/cpukit/score/src/schedulerstrongapa.c
+++ b/cpukit/score/src/schedulerstrongapa.c
@@ -920,8 +920,7 @@ void _Scheduler_strong_APA_Block(
_Scheduler_strong_APA_Get_highest_ready,
_Scheduler_strong_APA_Move_from_ready_to_scheduled,
_Scheduler_strong_APA_Allocate_processor,
- _Scheduler_strong_APA_Get_idle,
- _Scheduler_strong_APA_Release_idle
+ _Scheduler_strong_APA_Get_idle
);
}
@@ -1014,8 +1013,7 @@ void _Scheduler_strong_APA_Withdraw_node(
_Scheduler_strong_APA_Get_highest_ready,
_Scheduler_strong_APA_Move_from_ready_to_scheduled,
_Scheduler_strong_APA_Allocate_processor,
- _Scheduler_strong_APA_Get_idle,
- _Scheduler_strong_APA_Release_idle
+ _Scheduler_strong_APA_Get_idle
);
}