[rtems commit] score: Use processor mask for set affinity

Sebastian Huber sebh at rtems.org
Mon Jul 10 07:38:21 UTC 2017


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jul  4 08:59:37 2017 +0200

score: Use processor mask for set affinity

Update #3059.

---

 cpukit/score/include/rtems/score/scheduler.h       | 17 +++++-------
 cpukit/score/include/rtems/score/schedulerimpl.h   | 31 ++++------------------
 .../rtems/score/schedulerpriorityaffinitysmp.h     |  6 ++---
 cpukit/score/src/schedulerdefaultsetaffinity.c     |  6 ++---
 cpukit/score/src/schedulerpriorityaffinitysmp.c    | 13 +++++----
 cpukit/score/src/schedulersetaffinity.c            | 29 +++++++++++---------
 testsuites/smptests/smpaffinity01/init.c           |  2 +-
 testsuites/smptests/smppsxaffinity02/init.c        |  2 +-
 8 files changed, 42 insertions(+), 64 deletions(-)

diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h
index 7a3ae6b..5f3fb01 100644
--- a/cpukit/score/include/rtems/score/scheduler.h
+++ b/cpukit/score/include/rtems/score/scheduler.h
@@ -207,8 +207,7 @@ typedef struct {
   bool ( *set_affinity )(
     const Scheduler_Control *,
     Thread_Control *,
-    size_t,
-    const cpu_set_t *
+    const Processor_mask *
   );
 #endif
 } Scheduler_Operations;
@@ -507,23 +506,19 @@ void _Scheduler_default_Start_idle(
 
 #if defined(RTEMS_SMP)
   /** 
-   * @brief Set affinity for the default scheduler.
+   * @brief Default implementation of the set affinity scheduler operation.
    *
    * @param[in] scheduler The scheduler instance.
    * @param[in] thread The associated thread.
-   * @param[in] cpusetsize The size of the cpuset.
-   * @param[in] cpuset Affinity new affinity set.
+   * @param[in] affinity The new processor affinity set for the thread.
    *
-   * @retval 0 Successful
-   *
-   *  This method always returns successful and does not save
-   *  the cpuset.
+   * @retval true The processor set of the scheduler is a subset of the affinity set.
+   * @retval false Otherwise.
    */
   bool _Scheduler_default_Set_affinity(
     const Scheduler_Control *scheduler,
     Thread_Control          *thread,
-    size_t                   cpusetsize,
-    const cpu_set_t         *cpuset
+    const Processor_mask    *affinity
   );
 
   #define SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index 895f116..6f220ac 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -609,34 +609,13 @@ bool _Scheduler_Get_affinity(
 RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
-  size_t                   cpusetsize,
-  const cpu_set_t         *cpuset
+  const Processor_mask    *affinity
 )
 {
-  uint32_t cpu_count = _SMP_Get_processor_count();
-  uint32_t cpu_index;
-  bool     ok = true;
-
-  for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
-#if defined(RTEMS_SMP)
-    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 )
-        || ( !CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset )
-          && scheduler != scheduler_of_cpu ) );
-#else
-    (void) scheduler;
-
-    ok = ok && CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset );
-#endif
-  }
-
-  return ok;
+  return _Processor_mask_Is_subset(
+    affinity,
+    _Scheduler_Get_processors( scheduler )
+  );
 }
 
 bool _Scheduler_Set_affinity(
diff --git a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
index fd4a336..d53f76b 100644
--- a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
+++ b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
@@ -141,8 +141,7 @@ Thread_Control *_Scheduler_priority_affinity_SMP_Remove_processor(
  *
  * @param[in] scheduler The scheduler of the thread.
  * @param[in] thread The associated thread.
- * @param[in] cpusetsize The size of the cpuset.
- * @param[in] cpuset Affinity new affinity set.
+ * @param[in] affinity The new affinity set.
  *
  * @retval true if successful
  * @retval false if unsuccessful
@@ -150,8 +149,7 @@ Thread_Control *_Scheduler_priority_affinity_SMP_Remove_processor(
 bool _Scheduler_priority_affinity_SMP_Set_affinity(
   const Scheduler_Control *scheduler,
   Thread_Control          *thread,
-  size_t                   cpusetsize,
-  const cpu_set_t         *cpuset
+  const Processor_mask    *affinity
 );
 
 /**
diff --git a/cpukit/score/src/schedulerdefaultsetaffinity.c b/cpukit/score/src/schedulerdefaultsetaffinity.c
index e53f8b8..940d093 100644
--- a/cpukit/score/src/schedulerdefaultsetaffinity.c
+++ b/cpukit/score/src/schedulerdefaultsetaffinity.c
@@ -24,14 +24,12 @@
 bool _Scheduler_default_Set_affinity(
   const Scheduler_Control *scheduler,
   Thread_Control          *thread,
-  size_t                   cpusetsize,
-  const cpu_set_t         *cpuset
+  const Processor_mask    *affinity
 )
 {
   return _Scheduler_default_Set_affinity_body(
     scheduler,
     thread,
-    cpusetsize,
-    cpuset
+    affinity
   );
 }
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c
index 4533dec..6cc480d 100644
--- a/cpukit/score/src/schedulerpriorityaffinitysmp.c
+++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c
@@ -614,17 +614,20 @@ Thread_Control *_Scheduler_priority_affinity_SMP_Remove_processor(
 bool _Scheduler_priority_affinity_SMP_Set_affinity(
   const Scheduler_Control *scheduler,
   Thread_Control          *thread,
-  size_t                   cpusetsize,
-  const cpu_set_t         *cpuset
+  const Processor_mask    *affinity
 )
 {
   Scheduler_priority_affinity_SMP_Node *node;
   States_Control                        current_state;
+  cpu_set_t                             cpuset;
+  size_t                                cpusetsize;
 
+  cpusetsize = sizeof( cpuset );
+  _Processor_mask_To_cpu_set_t( affinity, cpusetsize, &cpuset );
   /*
    * Validate that the cpset meets basic requirements.
    */
-  if ( !_CPU_set_Is_valid( cpuset, cpusetsize ) ) {
+  if ( !_CPU_set_Is_valid( &cpuset, cpusetsize ) ) {
     return false;
   }
 
@@ -634,7 +637,7 @@ bool _Scheduler_priority_affinity_SMP_Set_affinity(
    * The old and new set are the same, there is no point in
    * doing anything.
    */
-  if ( CPU_EQUAL_S( cpusetsize, cpuset, node->Affinity.set ) )
+  if ( CPU_EQUAL_S( cpusetsize, &cpuset, node->Affinity.set ) )
     return true;
 
   current_state = thread->current_state;
@@ -643,7 +646,7 @@ bool _Scheduler_priority_affinity_SMP_Set_affinity(
     _Scheduler_priority_affinity_SMP_Block( scheduler, thread, &node->Base.Base.Base );
   }
 
-  CPU_COPY( cpuset, node->Affinity.set );
+  CPU_COPY( &cpuset, node->Affinity.set );
 
   if ( _States_Is_ready( current_state ) ) {
     /*
diff --git a/cpukit/score/src/schedulersetaffinity.c b/cpukit/score/src/schedulersetaffinity.c
index 67073df..93ed851 100644
--- a/cpukit/score/src/schedulersetaffinity.c
+++ b/cpukit/score/src/schedulersetaffinity.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
@@ -19,16 +19,19 @@
 #include <rtems/score/schedulerimpl.h>
 
 bool _Scheduler_Set_affinity(
-  Thread_Control  *the_thread,
-  size_t           cpusetsize,
-  const cpu_set_t *cpuset
+  Thread_Control       *the_thread,
+  size_t                cpusetsize,
+  const cpu_set_t      *cpuset
 )
 {
-  const Scheduler_Control *scheduler;
-  ISR_lock_Context         lock_context;
-  bool                     ok;
+  Processor_mask             affinity;
+  Processor_mask_Copy_status status;
+  const Scheduler_Control   *scheduler;
+  ISR_lock_Context           lock_context;
+  bool                       ok;
 
-  if ( !_CPU_set_Is_large_enough( cpusetsize ) ) {
+  status = _Processor_mask_From_cpu_set_t( &affinity, cpusetsize, cpuset );
+  if ( !_Processor_mask_Is_at_most_partial_loss( status ) ) {
     return false;
   }
 
@@ -39,15 +42,17 @@ bool _Scheduler_Set_affinity(
   ok = ( *scheduler->Operations.set_affinity )(
     scheduler,
     the_thread,
-    cpusetsize,
-    cpuset
+    &affinity
   );
+
+  if ( ok ) {
+    _Processor_mask_Assign( &the_thread->Scheduler.Affinity, &affinity );
+  }
 #else
   ok = _Scheduler_default_Set_affinity_body(
     scheduler,
     the_thread,
-    cpusetsize,
-    cpuset
+    &affinity
   );
 #endif
 
diff --git a/testsuites/smptests/smpaffinity01/init.c b/testsuites/smptests/smpaffinity01/init.c
index be68e1b..b80be72 100644
--- a/testsuites/smptests/smpaffinity01/init.c
+++ b/testsuites/smptests/smpaffinity01/init.c
@@ -59,7 +59,7 @@ void Validate_setaffinity_errors(void)
 
   /* Verify rtems_task_set_affinity validates cpusetsize */
   puts( "Init - rtems_task_set_affinity - Invalid cpusetsize - RTEMS_INVALID_NUMBER" );
-  sc = rtems_task_set_affinity( Init_id,  sizeof(cpu_set_t) * 2, &cpuset );
+  sc = rtems_task_set_affinity( Init_id,  1, &cpuset );
   rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
 
   /* Verifyrtems_task_set_affinity validates cpuset */
diff --git a/testsuites/smptests/smppsxaffinity02/init.c b/testsuites/smptests/smppsxaffinity02/init.c
index 5f8abac..eb38ea3 100644
--- a/testsuites/smptests/smppsxaffinity02/init.c
+++ b/testsuites/smptests/smppsxaffinity02/init.c
@@ -66,7 +66,7 @@ void Validate_setaffinity_errors(void)
 
   /* Verify pthread_setaffinity_np validates cpusetsize */
   puts( "Init - pthread_setaffinity_np - Invalid cpusetsize - EINVAL" );
-  sc = pthread_setaffinity_np( Init_id,  sizeof(cpu_set_t) * 2, &cpuset );
+  sc = pthread_setaffinity_np( Init_id,  1, &cpuset );
   rtems_test_assert( sc == EINVAL );
 
   /* Verify pthread_setaffinity_np validates cpuset */




More information about the vc mailing list