> > 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.
Why are we removing the entire affine queue corresponding to a CPU when a single node of the queue gets scheduled? On Tue, Jul 14, 2020 at 2:51 PM Sebastian Huber < sebastian.hu...@embedded-brains.de> wrote: > 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