[PATCH 06/10] score: Add scheduler to per-CPU information

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Nov 8 08:59:40 UTC 2016


This makes it possible to adjust the scheduler of a processor at
run-time.

Update #2797.
---
 cpukit/score/include/rtems/score/percpu.h          | 21 ++++++++++---
 cpukit/score/include/rtems/score/schedulerimpl.h   | 36 ++++++++++------------
 .../score/include/rtems/score/schedulersmpimpl.h   |  2 +-
 cpukit/score/src/smp.c                             | 10 ++++--
 4 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
index e3be0c8..94aef1d 100644
--- a/cpukit/score/include/rtems/score/percpu.h
+++ b/cpukit/score/include/rtems/score/percpu.h
@@ -410,10 +410,23 @@ typedef struct Per_CPU_Control {
      */
     Atomic_Ulong message;
 
-    /**
-     * @brief The scheduler context of the scheduler owning this processor.
-     */
-    const struct Scheduler_Context *scheduler_context;
+    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;
+    } Scheduler;
 
     /**
      * @brief Indicates the current state of the CPU.
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index 8d804bb..de9af50 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -53,28 +53,18 @@ RTEMS_INLINE_ROUTINE Scheduler_Context *_Scheduler_Get_context(
   return scheduler->context;
 }
 
-RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get_by_CPU_index(
-  uint32_t cpu_index
+RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get_by_CPU(
+  const Per_CPU_Control *cpu
 )
 {
 #if defined(RTEMS_SMP)
-  return _Scheduler_Assignments[ cpu_index ].scheduler;
+  return cpu->Scheduler.control;
 #else
-  (void) cpu_index;
-
+  (void) cpu;
   return &_Scheduler_Table[ 0 ];
 #endif
 }
 
-RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get_by_CPU(
-  const Per_CPU_Control *cpu
-)
-{
-  uint32_t cpu_index = _Per_CPU_Get_index( cpu );
-
-  return _Scheduler_Get_by_CPU_index( cpu_index );
-}
-
 /**
  * @brief Acquires the scheduler instance inside a critical section (interrupts
  * disabled).
@@ -673,14 +663,17 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_Should_start_processor(
 
 RTEMS_INLINE_ROUTINE bool _Scheduler_Has_processor_ownership(
   const Scheduler_Control *scheduler,
-  uint32_t cpu_index
+  uint32_t                 cpu_index
 )
 {
 #if defined(RTEMS_SMP)
-  const Scheduler_Assignment *assignment =
-    _Scheduler_Get_assignment( cpu_index );
+  const Per_CPU_Control   *cpu;
+  const Scheduler_Control *scheduler_of_cpu;
+
+  cpu = _Per_CPU_Get_by_index( cpu_index );
+  scheduler_of_cpu = _Scheduler_Get_by_CPU( cpu );
 
-  return assignment->scheduler == scheduler;
+  return scheduler_of_cpu == scheduler;
 #else
   (void) scheduler;
   (void) cpu_index;
@@ -748,8 +741,11 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(
 
   for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
 #if defined(RTEMS_SMP)
-    const Scheduler_Control *scheduler_of_cpu =
-      _Scheduler_Get_by_CPU_index( cpu_index );
+    const Per_CPU_Control   *cpu;
+    const Scheduler_Control *scheduler_of_cpu;
+
+    cpu = _Per_CPU_Get_by_index( cpu_index );
+    scheduler_of_cpu = _Scheduler_Get_by_CPU( cpu );
 
     ok = ok
       && ( CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset )
diff --git a/cpukit/score/include/rtems/score/schedulersmpimpl.h b/cpukit/score/include/rtems/score/schedulersmpimpl.h
index b12dd5f..ece075a 100644
--- a/cpukit/score/include/rtems/score/schedulersmpimpl.h
+++ b/cpukit/score/include/rtems/score/schedulersmpimpl.h
@@ -443,7 +443,7 @@ static inline bool _Scheduler_SMP_Is_processor_owned_by_us(
   const Per_CPU_Control   *cpu
 )
 {
-  return cpu->scheduler_context == context;
+  return cpu->Scheduler.context == context;
 }
 
 static inline Thread_Control *_Scheduler_SMP_Get_idle_thread(
diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
index f383f6d..c880d7e 100644
--- a/cpukit/score/src/smp.c
+++ b/cpukit/score/src/smp.c
@@ -66,11 +66,15 @@ static void _SMP_Start_processors( uint32_t cpu_count )
     cpu->online = started;
 
     if ( started ) {
-      Scheduler_Context *context =
-        _Scheduler_Get_context( assignment->scheduler );
+      const Scheduler_Control *scheduler;
+      Scheduler_Context       *context;
+
+      scheduler = assignment->scheduler;
+      context = _Scheduler_Get_context( scheduler );
 
       ++context->processor_count;
-      cpu->scheduler_context = context;
+      cpu->Scheduler.control = scheduler;
+      cpu->Scheduler.context = context;
 
       _Processor_mask_Set( _SMP_Online_processors, cpu_index );
     }
-- 
1.8.4.5



More information about the devel mailing list