On 14/07/2020 11:11, Sebastian Huber wrote:
On 14/07/2020 10:47, Richi Dubey wrote:
Can someone please help me understand how this
(https://git.rtems.org/rtems/tree/cpukit/score/src/scheduleredfsmp.c#n385)
if condition works. Why are we removing the ready queue Node from the
chain of Affine queues when we are allocating a different processor
(https://git.rtems.org/rtems/tree/cpukit/score/src/scheduleredfsmp.c#n398)
to the node which was currently scheduled on the CPU of that (the
ready queue mentioned in the if condition's) ready queue?
|static inline void _Scheduler_EDF_SMP_Allocate_processor(
Scheduler_Context *context, Scheduler_Node *scheduled_base,
Scheduler_Node *victim_base, Per_CPU_Control *victim_cpu ) {
Scheduler_EDF_SMP_Context *self; Scheduler_EDF_SMP_Node *scheduled;
uint8_t rqi; (void) victim_base; self = _Scheduler_EDF_SMP_Get_self(
context ); scheduled = _Scheduler_EDF_SMP_Node_downcast(
scheduled_base ); rqi = scheduled->ready_queue_index; if ( rqi != 0 )
{ Scheduler_EDF_SMP_Ready_queue *ready_queue; Per_CPU_Control
*desired_cpu; ready_queue = &self->Ready[ rqi ]; if (
!_Chain_Is_node_off_chain( &ready_queue->Node ) ) {
_Chain_Extract_unprotected( &ready_queue->Node );
_Chain_Set_off_chain( &ready_queue->Node ); } Here we remove the
affine ready queue if it exists from the chain of affine queues since
now an affine thread is scheduled on a processor. desired_cpu =
_Per_CPU_Get_by_index( rqi - 1 ); if ( victim_cpu != desired_cpu ) {
Scheduler_EDF_SMP_Node *node; This is another action. If the victim
CPU is not the right one for the new scheduled node, we have to make
room for it on the desired CPU. node =
_Scheduler_EDF_SMP_Get_scheduled( self, rqi ); _Assert(
node->ready_queue_index == 0 ); _Scheduler_EDF_SMP_Set_scheduled(
self, node, victim_cpu ); _Scheduler_SMP_Allocate_processor_exact(
context, &node->Base.Base, NULL, victim_cpu ); victim_cpu =
desired_cpu; } }|
Sorry for the format.
static inline void _Scheduler_EDF_SMP_Allocate_processor(
Scheduler_Context *context,
Scheduler_Node *scheduled_base,
Scheduler_Node *victim_base,
Per_CPU_Control *victim_cpu
)
{
Scheduler_EDF_SMP_Context *self;
Scheduler_EDF_SMP_Node *scheduled;
uint8_t rqi;
(void) victim_base;
self = _Scheduler_EDF_SMP_Get_self( context );
scheduled = _Scheduler_EDF_SMP_Node_downcast( scheduled_base );
rqi = scheduled->ready_queue_index;
if ( rqi != 0 ) {
Scheduler_EDF_SMP_Ready_queue *ready_queue;
Per_CPU_Control *desired_cpu;
ready_queue = &self->Ready[ rqi ];
if ( !_Chain_Is_node_off_chain( &ready_queue->Node ) ) {
_Chain_Extract_unprotected( &ready_queue->Node );
_Chain_Set_off_chain( &ready_queue->Node );
}
Here we remove the affine ready queue if it exists from the chain of
affine queues since now an affine thread is scheduled on a processor.
desired_cpu = _Per_CPU_Get_by_index( rqi - 1 );
if ( victim_cpu != desired_cpu ) {
Scheduler_EDF_SMP_Node *node;
This is another action. If the victim CPU is not the right one for the
new scheduled node, we have to make room for it on the desired CPU.
node = _Scheduler_EDF_SMP_Get_scheduled( self, rqi );
_Assert( node->ready_queue_index == 0 );
_Scheduler_EDF_SMP_Set_scheduled( self, node, victim_cpu );
_Scheduler_SMP_Allocate_processor_exact(
context,
&node->Base.Base,
NULL,
victim_cpu
);
victim_cpu = desired_cpu;
}
}
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel