Thank you for the clarification. On Sat, Jul 18, 2020 at 9:06 PM Gedare Bloom <ged...@rtems.org> wrote:
> On Fri, Jul 17, 2020 at 2:22 AM Richi Dubey <richidu...@gmail.com> wrote: > >> > >> > >> > Scheduler_Node *nodes; > >> > } Thread_Scheduler_control; > >> > > >> > Why do we have a Scheduler_Node *nodes? What does it indicate? Since > the pointer can point to a single value, why is it being called nodes? > >> > > >> See cpukit/score/src/threadinitialize.c +153 > > > > > > Thank you for your help. > > /** > > * @brief The scheduler nodes of this thread. > > * > > * Each thread has a scheduler node for each scheduler instance. > > */ > > > > I went through the entire scheduler related code in threadinitialize.c > and I understood that the scheduler node which belongs to the scheduler > that is the home scheduler for a thread gets initialized with the thread's > priority, while other scheduler nodes gets initialized with the max > priority : for an idle thread case. > > > > But why do we have a scheduler node for each scheduler instance? Is it > because the thread might migrate to a different processor to facilitate > helping and would need a node belonging to the scheduler instance which > owns the processor it is migrating to? > > > > I'm not 100% sure on this, but I believe it is because the thread's > priority needs to be considered globally when taking > scheduling/synchronization decisions. > > > On Wed, Jul 15, 2020 at 10:12 PM Gedare Bloom <ged...@rtems.org> wrote: > >> > >> On Wed, Jul 15, 2020 at 6:55 AM Richi Dubey <richidu...@gmail.com> > wrote: > >> > > >> > Another quick question: > >> > typedef struct { > >> > > >> > #if defined(RTEMS_SMP) > >> > ... > >> > Chain_Control Scheduler_nodes; > >> > > >> > #endif > >> > /** > >> > * @brief The scheduler nodes of this thread. > >> > * > >> > * Each thread has a scheduler node for each scheduler instance. > >> > */ > >> > Scheduler_Node *nodes; > >> > } Thread_Scheduler_control; > >> > > >> > Why do we have a Scheduler_Node *nodes? What does it indicate? Since > the pointer can point to a single value, why is it being called nodes? > >> > > >> > >> See cpukit/score/src/threadinitialize.c +153 > >> > >> > >> > > >> > On Wed, Jul 15, 2020 at 5:57 PM Richi Dubey <richidu...@gmail.com> > wrote: > >> >> > >> >> Hi, > >> >> > >> >> I had a small question. The scheduler struct inside percpu.h looks > like: > >> >> > ------------------------------------------------------------------------------------------------------ > >> >> struct { > >> >> /** > >> >> * @brief The scheduler control of the scheduler owning this > processor. > >> >> * > >> >> * This pointer is NULL in case this processor is currently > not used by a > >> >> * scheduler instance. > >> >> */ > >> >> const struct _Scheduler_Control *control; > >> >> > >> >> /** > >> >> * @brief The scheduler context of the scheduler owning this > processor. > >> >> * > >> >> * This pointer is NULL in case this processor is currently > not used by a > >> >> * scheduler instance. > >> >> */ > >> >> const struct Scheduler_Context *context; > >> >> > >> >> /** > >> >> * @brief The idle thread for this processor in case it is > online and > >> >> * currently not used by a scheduler instance. > >> >> */ > >> >> struct _Thread_Control *idle_if_online_and_unused; > >> >> } Scheduler; > >> >> > ------------------------------------------------------------------------------------------------------ > >> >> So, does this mean a CPU when active is always either executing an > idle thread and is not being used by a scheduler (so has a thread attribute > in the idle_if_online_and_unused), or is used by a scheduler and is > executing a task ( which can not be an idle task)? Another equivalent > question is do we have an idle scheduler node, like we have idle predefined > threads that run on a CPU? > >> >> > >> > >> Not exactly. What I understand is that: > >> * When a processor is online (active), but not used by a scheduler, > >> then it executes an idle task. > >> * When a processor is online and used by a scheduler, it may be > >> executing any task including an idle task. > >> > >> You can find the relevant code in > cpukit/include/rtems/score/schedulersmpimpl.h > >> > >> The idle threads are specially handled when processors are > >> added/removed from scheduler contexts. A scheduler keeps a chain of > >> its idle threads: > >> cpukit/include/rtems/score/schedulersmp.h +64 > >> > >> >> Please let me know, > >> >> Thanks. > >> >> > >> >> On Tue, Jul 14, 2020 at 8:28 PM Richi Dubey <richidu...@gmail.com> > wrote: > >> >>> > >> >>> I understand. Thank you. > >> >>> > >> >>> On Tue, Jul 14, 2020 at 7:05 PM Sebastian Huber < > sebastian.hu...@embedded-brains.de> wrote: > >> >>>> > >> >>>> On 14/07/2020 13:37, Richi Dubey wrote: > >> >>>> > >> >>>> > 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? > >> >>>> Because the highest priority affine thread is now a schedule one. > >> > > >> > _______________________________________________ > >> > devel mailing list > >> > devel@rtems.org > >> > http://lists.rtems.org/mailman/listinfo/devel >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel