summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-07-08 10:38:19 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-07-08 16:30:48 +0200
commit19e417678a3d68c5dee3708bf699b1f9e38ff1cb (patch)
tree442e9f0f2faab0b983c614fdd8dcb829e3ce6911
parentscore: Rename _Scheduler_SMP_Update_heir() (diff)
downloadrtems-19e417678a3d68c5dee3708bf699b1f9e38ff1cb.tar.bz2
score: Simplify SMP processor allocation
Avoid copy and paste and set the scheduler node state in one place.
-rw-r--r--cpukit/score/include/rtems/score/schedulersmpimpl.h61
-rw-r--r--cpukit/score/src/schedulerpriorityaffinitysmp.c25
-rw-r--r--cpukit/score/src/schedulerprioritysmp.c6
-rw-r--r--cpukit/score/src/schedulersimplesmp.c6
4 files changed, 62 insertions, 36 deletions
diff --git a/cpukit/score/include/rtems/score/schedulersmpimpl.h b/cpukit/score/include/rtems/score/schedulersmpimpl.h
index 3bd4795ce7..425dae2942 100644
--- a/cpukit/score/include/rtems/score/schedulersmpimpl.h
+++ b/cpukit/score/include/rtems/score/schedulersmpimpl.h
@@ -313,8 +313,8 @@ typedef void ( *Scheduler_SMP_Enqueue )(
typedef void ( *Scheduler_SMP_Allocate_processor )(
Scheduler_Context *context,
- Scheduler_Node *scheduled,
- Scheduler_Node *victim
+ Thread_Control *scheduled,
+ Thread_Control *victim
);
static inline bool _Scheduler_SMP_Insert_priority_lifo_order(
@@ -410,24 +410,17 @@ static inline bool _Scheduler_SMP_Is_processor_owned_by_us(
return cpu->scheduler_context == context;
}
-static inline void _Scheduler_SMP_Allocate_processor(
+static inline void _Scheduler_SMP_Allocate_processor_lazy(
Scheduler_Context *context,
- Scheduler_Node *scheduled,
- Scheduler_Node *victim
+ Thread_Control *scheduled_thread,
+ Thread_Control *victim_thread
)
{
- Thread_Control *scheduled_thread = _Scheduler_Node_get_owner( scheduled );
- Thread_Control *victim_thread = _Scheduler_Node_get_owner( victim );
Per_CPU_Control *scheduled_cpu = _Thread_Get_CPU( scheduled_thread );
Per_CPU_Control *victim_cpu = _Thread_Get_CPU( victim_thread );
Per_CPU_Control *cpu_self = _Per_CPU_Get();
Thread_Control *heir;
- _Scheduler_SMP_Node_change_state(
- _Scheduler_SMP_Node_downcast( scheduled ),
- SCHEDULER_SMP_NODE_SCHEDULED
- );
-
_Assert( _ISR_Get_level() != 0 );
if ( _Thread_Is_executing_on_a_processor( scheduled_thread ) ) {
@@ -455,6 +448,24 @@ static inline void _Scheduler_SMP_Allocate_processor(
}
}
+static inline void _Scheduler_SMP_Allocate_processor(
+ Scheduler_Context *context,
+ Scheduler_Node *scheduled,
+ Scheduler_Node *victim,
+ Scheduler_SMP_Allocate_processor allocate_processor
+)
+{
+ Thread_Control *scheduled_thread = _Scheduler_Node_get_owner( scheduled );
+ Thread_Control *victim_thread = _Scheduler_Node_get_owner( victim );
+
+ _Scheduler_SMP_Node_change_state(
+ _Scheduler_SMP_Node_downcast( scheduled ),
+ SCHEDULER_SMP_NODE_SCHEDULED
+ );
+
+ ( *allocate_processor )( context, scheduled_thread, victim_thread );
+}
+
static inline Scheduler_Node *_Scheduler_SMP_Get_lowest_scheduled(
Scheduler_Context *context,
Scheduler_Node *filter,
@@ -514,7 +525,14 @@ static inline void _Scheduler_SMP_Enqueue_ordered(
_Scheduler_SMP_Node_downcast( lowest_scheduled ),
SCHEDULER_SMP_NODE_READY
);
- ( *allocate_processor )( context, node, lowest_scheduled );
+
+ _Scheduler_SMP_Allocate_processor(
+ context,
+ node,
+ lowest_scheduled,
+ allocate_processor
+ );
+
( *insert_scheduled )( context, node );
( *move_from_scheduled_to_ready )( context, lowest_scheduled );
} else {
@@ -565,7 +583,14 @@ static inline void _Scheduler_SMP_Enqueue_scheduled_ordered(
_Scheduler_SMP_Node_downcast( node ),
SCHEDULER_SMP_NODE_READY
);
- ( *allocate_processor) ( context, highest_ready, node );
+
+ _Scheduler_SMP_Allocate_processor(
+ context,
+ highest_ready,
+ node,
+ allocate_processor
+ );
+
( *insert_ready )( context, node );
( *move_from_ready_to_scheduled )( context, highest_ready );
}
@@ -588,7 +613,13 @@ static inline void _Scheduler_SMP_Schedule_highest_ready(
{
Scheduler_Node *highest_ready = ( *get_highest_ready )( context, victim );
- ( *allocate_processor )( context, highest_ready, victim );
+ _Scheduler_SMP_Allocate_processor(
+ context,
+ highest_ready,
+ victim,
+ allocate_processor
+ );
+
( *move_from_ready_to_scheduled )( context, highest_ready );
}
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c
index f1e2252b2e..49601d5642 100644
--- a/cpukit/score/src/schedulerpriorityaffinitysmp.c
+++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c
@@ -104,28 +104,22 @@ void _Scheduler_priority_affinity_SMP_Node_initialize(
}
/*
- * This method is slightly different from _Scheduler_SMP_Allocate_processor()
- * in that it does what it is asked to do. _Scheduler_SMP_Allocate_processor()
- * attempts to prevent migrations but does not take into account affinity
+ * This method is slightly different from
+ * _Scheduler_SMP_Allocate_processor_lazy() in that it does what it is asked to
+ * do. _Scheduler_SMP_Allocate_processor_lazy() attempts to prevent migrations
+ * but does not take into account affinity
*/
static inline void _Scheduler_SMP_Allocate_processor_exact(
- Scheduler_Context *context,
- Scheduler_Node *scheduled,
- Scheduler_Node *victim
+ Scheduler_Context *context,
+ Thread_Control *scheduled_thread,
+ Thread_Control *victim_thread
)
{
- Thread_Control *victim_thread = _Scheduler_Node_get_owner( victim );
- Thread_Control *scheduled_thread = _Scheduler_Node_get_owner( scheduled );
Per_CPU_Control *victim_cpu = _Thread_Get_CPU( victim_thread );
Per_CPU_Control *cpu_self = _Per_CPU_Get();
(void) context;
- _Scheduler_SMP_Node_change_state(
- _Scheduler_SMP_Node_downcast( scheduled ),
- SCHEDULER_SMP_NODE_SCHEDULED
- );
-
_Thread_Set_CPU( scheduled_thread, victim_cpu );
_Thread_Dispatch_update_heir( cpu_self, victim_cpu, scheduled_thread );
}
@@ -358,10 +352,11 @@ static void _Scheduler_priority_affinity_SMP_Check_for_migrations(
SCHEDULER_SMP_NODE_READY
);
- _Scheduler_SMP_Allocate_processor_exact(
+ _Scheduler_SMP_Allocate_processor(
context,
highest_ready,
- lowest_scheduled
+ lowest_scheduled,
+ _Scheduler_SMP_Allocate_processor_exact
);
_Scheduler_priority_SMP_Move_from_ready_to_scheduled(
diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c
index f340b83b9d..f74eb1bb82 100644
--- a/cpukit/score/src/schedulerprioritysmp.c
+++ b/cpukit/score/src/schedulerprioritysmp.c
@@ -93,7 +93,7 @@ void _Scheduler_priority_SMP_Block(
_Scheduler_priority_SMP_Extract_from_ready,
_Scheduler_priority_SMP_Get_highest_ready,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled,
- _Scheduler_SMP_Allocate_processor
+ _Scheduler_SMP_Allocate_processor_lazy
);
}
@@ -113,7 +113,7 @@ static void _Scheduler_priority_SMP_Enqueue_ordered(
insert_scheduled,
_Scheduler_priority_SMP_Move_from_scheduled_to_ready,
_Scheduler_SMP_Get_lowest_scheduled,
- _Scheduler_SMP_Allocate_processor
+ _Scheduler_SMP_Allocate_processor_lazy
);
}
@@ -161,7 +161,7 @@ static void _Scheduler_priority_SMP_Enqueue_scheduled_ordered(
insert_ready,
insert_scheduled,
_Scheduler_priority_SMP_Move_from_ready_to_scheduled,
- _Scheduler_SMP_Allocate_processor
+ _Scheduler_SMP_Allocate_processor_lazy
);
}
diff --git a/cpukit/score/src/schedulersimplesmp.c b/cpukit/score/src/schedulersimplesmp.c
index 4b0ce0a61c..da2b77a28e 100644
--- a/cpukit/score/src/schedulersimplesmp.c
+++ b/cpukit/score/src/schedulersimplesmp.c
@@ -175,7 +175,7 @@ void _Scheduler_simple_SMP_Block(
_Scheduler_simple_SMP_Extract_from_ready,
_Scheduler_simple_SMP_Get_highest_ready,
_Scheduler_simple_SMP_Move_from_ready_to_scheduled,
- _Scheduler_SMP_Allocate_processor
+ _Scheduler_SMP_Allocate_processor_lazy
);
}
@@ -195,7 +195,7 @@ static void _Scheduler_simple_SMP_Enqueue_ordered(
insert_scheduled,
_Scheduler_simple_SMP_Move_from_scheduled_to_ready,
_Scheduler_SMP_Get_lowest_scheduled,
- _Scheduler_SMP_Allocate_processor
+ _Scheduler_SMP_Allocate_processor_lazy
);
}
@@ -243,7 +243,7 @@ static void _Scheduler_simple_SMP_Enqueue_scheduled_ordered(
insert_ready,
insert_scheduled,
_Scheduler_simple_SMP_Move_from_ready_to_scheduled,
- _Scheduler_SMP_Allocate_processor
+ _Scheduler_SMP_Allocate_processor_lazy
);
}