Need help in understanding some of the existing code in RTEMS

Richi Dubey richidubey at gmail.com
Tue Jul 14 11:37:54 UTC 2020


>
> 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.huber at 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;
>      }
>    }
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200714/e223e23a/attachment.html>


More information about the devel mailing list