[PATCH v2 05/15] score: Add processor set to scheduler context

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Jul 7 13:54:42 UTC 2017


Replace the simple processor count with the processor set owned by the
scheduler instance.

Update #3059.
---
 cpukit/rtems/src/scheduleraddprocessor.c         |  2 +-
 cpukit/rtems/src/schedulergetprocessorset.c      | 12 +++++++-----
 cpukit/rtems/src/schedulerremoveprocessor.c      |  6 +++---
 cpukit/score/include/rtems/score/scheduler.h     |  4 ++--
 cpukit/score/include/rtems/score/schedulerimpl.h | 25 +++++++-----------------
 cpukit/score/src/smp.c                           |  5 ++---
 6 files changed, 22 insertions(+), 32 deletions(-)

diff --git a/cpukit/rtems/src/scheduleraddprocessor.c b/cpukit/rtems/src/scheduleraddprocessor.c
index 505b8cc9dc..56d6811afd 100644
--- a/cpukit/rtems/src/scheduleraddprocessor.c
+++ b/cpukit/rtems/src/scheduleraddprocessor.c
@@ -95,7 +95,7 @@ rtems_status_code rtems_scheduler_add_processor(
 
     _ISR_lock_ISR_disable( &lock_context );
     _Scheduler_Acquire_critical( scheduler, &lock_context );
-    ++scheduler_context->processor_count;
+    _Processor_mask_Set( &scheduler_context->Processors, cpu_index );
     cpu->Scheduler.control = scheduler;
     cpu->Scheduler.context = scheduler_context;
     ( *scheduler->Operations.add_processor )( scheduler, idle );
diff --git a/cpukit/rtems/src/schedulergetprocessorset.c b/cpukit/rtems/src/schedulergetprocessorset.c
index 3b46ad07fc..d632e5e2c7 100644
--- a/cpukit/rtems/src/schedulergetprocessorset.c
+++ b/cpukit/rtems/src/schedulergetprocessorset.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2014, 2017 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -26,7 +26,9 @@ rtems_status_code rtems_scheduler_get_processor_set(
   cpu_set_t *cpuset
 )
 {
-  const Scheduler_Control *scheduler;
+  const Scheduler_Control    *scheduler;
+  const Processor_mask       *processor_set;
+  Processor_mask_Copy_status  status;
 
   if ( cpuset == NULL ) {
     return RTEMS_INVALID_ADDRESS;
@@ -37,11 +39,11 @@ rtems_status_code rtems_scheduler_get_processor_set(
     return RTEMS_INVALID_ID;
   }
 
-  if ( !_CPU_set_Is_large_enough( cpusetsize ) ) {
+  processor_set = _Scheduler_Get_processors( scheduler );
+  status = _Processor_mask_To_cpu_set_t( processor_set, cpusetsize, cpuset );
+  if ( status != PROCESSOR_MASK_COPY_LOSSLESS ) {
     return RTEMS_INVALID_NUMBER;
   }
 
-  _Scheduler_Get_processor_set( scheduler, cpusetsize, cpuset );
-
   return RTEMS_SUCCESSFUL;
 }
diff --git a/cpukit/rtems/src/schedulerremoveprocessor.c b/cpukit/rtems/src/schedulerremoveprocessor.c
index 03a688d64e..538366bb22 100644
--- a/cpukit/rtems/src/schedulerremoveprocessor.c
+++ b/cpukit/rtems/src/schedulerremoveprocessor.c
@@ -98,8 +98,8 @@ rtems_status_code rtems_scheduler_remove_processor(
    */
   _ISR_lock_ISR_disable( &lock_context );
   _Scheduler_Acquire_critical( scheduler, &lock_context );
-  processor_count = scheduler_context->processor_count - 1;
-  scheduler_context->processor_count = processor_count;
+  _Processor_mask_Clear( &scheduler_context->Processors, cpu_index );
+  processor_count = _Processor_mask_Count( &scheduler_context->Processors );
   _Scheduler_Release_critical( scheduler, &lock_context );
   _ISR_lock_ISR_enable( &lock_context );
 
@@ -130,7 +130,7 @@ rtems_status_code rtems_scheduler_remove_processor(
     _Chain_Extract_unprotected( &scheduler_node->Thread.Scheduler_node.Chain );
     _Assert( _Chain_Is_empty( &idle->Scheduler.Scheduler_nodes ) );
   } else {
-    ++scheduler_context->processor_count;
+    _Processor_mask_Set( &scheduler_context->Processors, cpu_index );
   }
 
   cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h
index 6e7bdcbd9a..7a3ae6b466 100644
--- a/cpukit/score/include/rtems/score/scheduler.h
+++ b/cpukit/score/include/rtems/score/scheduler.h
@@ -227,9 +227,9 @@ typedef struct Scheduler_Context {
 
 #if defined(RTEMS_SMP)
   /**
-   * @brief Count of processors owned by this scheduler instance.
+   * @brief The set of processors owned by this scheduler instance.
    */
-  uint32_t processor_count;
+  Processor_mask Processors;
 #endif
 } Scheduler_Context;
 
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index 927c6e1762..895f116066 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -589,28 +589,15 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_Has_processor_ownership(
 #endif
 }
 
-RTEMS_INLINE_ROUTINE void _Scheduler_Get_processor_set(
-  const Scheduler_Control *scheduler,
-  size_t                   cpusetsize,
-  cpu_set_t               *cpuset
+RTEMS_INLINE_ROUTINE const Processor_mask *_Scheduler_Get_processors(
+  const Scheduler_Control *scheduler
 )
 {
-  uint32_t cpu_count = _SMP_Get_processor_count();
-  uint32_t cpu_index;
-
-  CPU_ZERO_S( cpusetsize, cpuset );
-
-  for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
 #if defined(RTEMS_SMP)
-    if ( _Scheduler_Has_processor_ownership( scheduler, cpu_index ) ) {
-      CPU_SET_S( (int) cpu_index, cpusetsize, cpuset );
-    }
+  return &_Scheduler_Get_context( scheduler )->Processors;
 #else
-    (void) scheduler;
-
-    CPU_SET_S( (int) cpu_index, cpusetsize, cpuset );
+  return &_Processor_mask_The_one_and_only;
 #endif
-  }
 }
 
 bool _Scheduler_Get_affinity(
@@ -688,7 +675,9 @@ RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_processor_count(
 )
 {
 #if defined(RTEMS_SMP)
-  return _Scheduler_Get_context( scheduler )->processor_count;
+  const Scheduler_Context *context = _Scheduler_Get_context( scheduler );
+
+  return _Processor_mask_Count( &context->Processors );
 #else
   (void) scheduler;
 
diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c
index a69b7ed46a..1a29e37d15 100644
--- a/cpukit/score/src/smp.c
+++ b/cpukit/score/src/smp.c
@@ -97,11 +97,10 @@ static void _SMP_Start_processors( uint32_t cpu_count )
       scheduler = assignment->scheduler;
       context = _Scheduler_Get_context( scheduler );
 
-      ++context->processor_count;
+      _Processor_mask_Set( &_SMP_Online_processors, cpu_index );
+      _Processor_mask_Set( &context->Processors, cpu_index );
       cpu->Scheduler.control = scheduler;
       cpu->Scheduler.context = context;
-
-      _Processor_mask_Set( &_SMP_Online_processors, cpu_index );
     }
   }
 }
-- 
2.12.3



More information about the devel mailing list