[rtems commit] score: Move _SMP_Handler_initialize()

Sebastian Huber sebastian.huber at embedded-brains.de
Sun Feb 23 09:45:26 UTC 2014


On 02/22/2014 11:02 PM, Chris Johns wrote:
> On 19/02/2014 7:52 pm, Sebastian Huber wrote:
>> Module:    rtems
>> Branch:    master
>> Commit:    282bfd3b41e3725ac9f5fb08b1e391af02572f4f
>> Changeset: 
>> http://git.rtems.org/rtems/commit/?id=282bfd3b41e3725ac9f5fb08b1e391af02572f4f
>>
>> Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
>> Date:      Tue Feb 18 13:03:27 2014 +0100
>>
>> score: Move _SMP_Handler_initialize()
>>
>> ---
>>
>>   cpukit/score/src/percpu.c |   31 -------------------------------
>>   cpukit/score/src/smp.c    |   22 ++++++++++++++++++++++
>>   2 files changed, 22 insertions(+), 31 deletions(-)
>>
>> diff --git a/cpukit/score/src/percpu.c b/cpukit/score/src/percpu.c
>> index aa95aa9..c68f378 100644
>> --- a/cpukit/score/src/percpu.c
>> +++ b/cpukit/score/src/percpu.c
>> @@ -18,40 +18,9 @@
>>   #include "config.h"
>>   #endif
>>
>> -#include <rtems/system.h>
>> -#include <rtems/score/address.h>
>> -#include <rtems/score/thread.h>
>>   #include <rtems/score/percpu.h>
>> -#include <rtems/score/wkspace.h>
>> -#include <rtems/config.h>
>> -#include <string.h>
>>
>>   #if defined(RTEMS_SMP)
>> -
>> -  #include <rtems/score/smp.h>
>> -
>> -  void _SMP_Handler_initialize(void)
>> -  {
>> -    uint32_t max_cpus = rtems_configuration_get_maximum_processors();
>> -    uint32_t cpu;
>> -
>> -    /*
>> -     * Discover and initialize the secondary cores in an SMP system.
>> -     */
>> -    max_cpus = _CPU_SMP_Initialize( max_cpus );
>> -
>> -    _SMP_Processor_count = max_cpus;
>> -
>> -    for ( cpu = 1 ; cpu < max_cpus; ++cpu ) {
>> -      const Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index( cpu );
>> -
>> -      _Per_CPU_Wait_for_state(
>> -        per_cpu,
>> -        PER_CPU_STATE_READY_TO_BEGIN_MULTITASKING
>> -      );
>> -    }
>> -  }
>> -
>>     void _Per_CPU_Change_state(
>>       Per_CPU_Control *per_cpu,
>>       Per_CPU_State new_state
>> diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
>> index 86116da..bfd77dc 100644
>> --- a/cpukit/score/src/smp.c
>> +++ b/cpukit/score/src/smp.c
>> @@ -29,6 +29,28 @@
>>     #include <rtems/bspIo.h>
>>   #endif
>>
>> +void _SMP_Handler_initialize( void )
>> +{
>> +  uint32_t max_cpus = rtems_configuration_get_maximum_processors();
>> +  uint32_t cpu;
>> +
>> +  /*
>> +   * Discover and initialize the secondary cores in an SMP system.
>> +   */
>> +  max_cpus = _CPU_SMP_Initialize( max_cpus );
>> +
>> +  _SMP_Processor_count = max_cpus;
>> +
>> +  for ( cpu = 1 ; cpu < max_cpus; ++cpu ) {
>> +    const Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index( cpu );
>> +
>> +    _Per_CPU_Wait_for_state(
>> +      per_cpu,
>> +      PER_CPU_STATE_READY_TO_BEGIN_MULTITASKING
>> +    );
>> +  }
>> +}
>
> I do not agree with this approach. All cores need to be present before 
> continuing and it forces cpu 0 to be a "boot" or "primary" processor. 
> This design is not symmetric.

I cannot say much more to this topic than that what I wrote here:

http://www.rtems.org/pipermail/rtems-devel/2014-February/005481.html

Yes, this boot processor index == 0 is a problem.  One fundamental 
problem is that exactly one processor must initialize the BSS section.  
How can you enforce this in general?

The situation in this patch is a bit better:

http://www.rtems.org/pipermail/rtems-devel/2014-February/005465.html

-void _SMP_Start_multitasking_on_secondary_processor( void )
+void _SMP_Request_start_multitasking( void )
  {
    Per_CPU_Control *self_cpu = _Per_CPU_Get();
+  uint32_t ncpus = _SMP_Get_processor_count();
+  uint32_t cpu;
+
+  _Per_CPU_State_change( self_cpu, PER_CPU_STATE_READY_TO_START_MULTITASKING );
  
-  #if defined(RTEMS_DEBUG)
-    printk( "Made it to %d -- ", _Per_CPU_Get_index( self_cpu ) );
-  #endif
+  for ( cpu = 0 ; cpu < ncpus ; ++cpu ) {
+    Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index( cpu );
+
+    _Per_CPU_State_change( per_cpu, PER_CPU_STATE_REQUEST_START_MULTITASKING );
+  }
+}

Please notice that this loop starts with cpu = 0.

At the moment I can offer only this patch.  It is an improvement since 
now the shutdown works.  There are so many problems and things to do on 
SMP so that I have to focus.  I cannot fix everything at once and now.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.




More information about the devel mailing list