[RTEMS Project] #3885: Context switch extension is broken in SMP configurations

RTEMS trac trac at rtems.org
Mon Mar 2 06:52:07 UTC 2020


#3885: Context switch extension is broken in SMP configurations
-----------------------------+------------------------------
 Reporter:  Sebastian Huber  |       Owner:  Sebastian Huber
     Type:  defect           |      Status:  assigned
 Priority:  normal           |   Milestone:  5.1
Component:  score            |     Version:  5
 Severity:  normal           |  Resolution:
 Keywords:                   |  Blocked By:
 Blocking:                   |
-----------------------------+------------------------------

Comment (by Sebastian Huber <sebastian.huber@…>):

 In [changeset:"fcb11510c6b38a7a1f4da7205acc5461a4e18214/rtems"
 fcb11510/rtems]:
 {{{
 #!CommitTicketReference repository="rtems"
 revision="fcb11510c6b38a7a1f4da7205acc5461a4e18214"
 score: Fix context switch extensions (SMP)

 In uniprocessor and SMP configurations, the context switch extensions
 were called during _Thread_Do_dispatch():

 void _Thread_Do_dispatch( Per_CPU_Control *cpu_self, ISR_Level level )
 {
   Thread_Control *executing;

   executing = cpu_self->executing;

   ...
   do {
     Thread_Control *heir;

     heir = _Thread_Get_heir_and_make_it_executing( cpu_self );
     ...
     _User_extensions_Thread_switch( executing, heir );
     ...
     _Context_Switch( &executing->Registers, &heir->Registers );
     ...
   } while ( cpu_self->dispatch_necessary );
   ...
 }

 In uniprocessor configurations, this is fine and the context switch
 extensions are called for all thread switches except the very first
 thread switch to the initialization thread.  However, in SMP
 configurations, the context switch may be invalidated and updated in the
 low-level _Context_Switch() routine.  See:

 https://docs.rtems.org/branches/master/c-user/symmetric_multiprocessing_services.html
 #thread-dispatch-details

 In case such an update happens, a thread will execute on the processor
 which was not seen in the previous call of the context switch
 extensions.  This can confuse for example event record consumers which
 use events generated by a context switch extension.

 Fixing this is not straight forward.  The context switch extensions call
 must move after the low-level context switch.  The problem here is that
 we may end up in _Thread_Handler().  Adding the context switch
 extensions call to _Thread_Handler() covers now also the thread switch
 to the initialization thread.  We also have to save the last executing
 thread (ancestor) of the processor.  Registers or the stack cannot be
 used for this purpose.  We have to add it to the per-processor
 information.  Existing extensions may be affected, since now context
 switch extensions use the stack of the heir thread.  The stack checker
 is affected by this.

 Calling the thread switch extensions in the low-level context switch is
 difficult since at this point an intermediate stack is used which is
 only large enough to enable servicing of interrupts.

 Update #3885.
 }}}

--
Ticket URL: <http://devel.rtems.org/ticket/3885#comment:9>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list