Need help in understanding some of the existing code in RTEMS

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Jul 14 09:11:43 UTC 2020


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; } }|



More information about the devel mailing list