[rtems commit] score: Add processor set to scheduler context

Sebastian Huber sebh at rtems.org
Mon Jul 10 07:37:55 UTC 2017


Module:    rtems
Branch:    master
Commit:    6b1d8c7865268071a8de6ba6343159049a8b0e56
Changeset: http://git.rtems.org/rtems/commit/?id=6b1d8c7865268071a8de6ba6343159049a8b0e56

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jul  4 07:28:44 2017 +0200

score: Add processor set to scheduler context

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 505b8cc..56d6811 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 3b46ad0..d632e5e 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 03a688d..538366b 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 6e7bdcb..7a3ae6b 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 927c6e1..895f116 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 a69b7ed..1a29e37 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 );
     }
   }
 }




More information about the vc mailing list