When does heir become executing on calling _Thread_Dispatch_request from another cpu?

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Aug 21 08:50:06 UTC 2020


On 21/08/2020 10:40, Richi Dubey wrote:

> While trying to debug my code, I realised that the heir set on another 
> processor does not become that cpu's per_cpu_control->executing after 
> some time.
>
> On checking the allocate_processor call that set the heir, I saw the 
> call trace as:
>
> _Scheduler_SMP_Allocate_processor_exact -> _Thread_Dispatch_update_heir :
>
> -------------------------------------
> ...
>   } else { (Here this gets executed since the current cpu is different 
> than the one that gets its executing changed)
>     _Atomic_Fetch_or_ulong( &cpu_target->message, 0, 
> ATOMIC_ORDER_RELEASE );
>     _CPU_SMP_Send_interrupt( _Per_CPU_Get_index( cpu_target ) );
>   }
>
> ............................................
>
> So, how long does it take for heir to become executing on another cpu? 
> This question is wrt my code at this line 
> <https://github.com/richidubey/rtems/blob/03d08d02b3e61570f2022845caa44ec6a261f677/cpukit/score/src/schedulerstrongapa.c#L297>. 
> Is it okay if i use heir here instead of executing (To get the latest 
> thread intended to be scheduled on the cpu)? Would it mean the same 
> thing? Is heir==executing when thread_dispatch is set to false?
The thread dispatching uses the per-processor variables executing, heir, 
and is_dispatch_necessary. Thread dispatching is always a per-processor 
operation. If you want to carry out a thread dispatch on another 
processor you have to use an inter-processor interrupt. For the control 
flow, see _Thread_Do_dispatch(). Check the variables on the other 
processor. After updating the variables you can set a break point to the 
inter-processor interrupt handler and check if it is called.


More information about the devel mailing list