[rtems commit] score: Move processor affinity to Thread_Control

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


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Jul  3 14:05:26 2017 +0200

score: Move processor affinity to Thread_Control

Update #3059.

---

 cpukit/score/Makefile.am                           |  1 -
 cpukit/score/include/rtems/score/processormask.h   |  2 ++
 cpukit/score/include/rtems/score/scheduler.h       | 27 ----------------
 cpukit/score/include/rtems/score/schedulerimpl.h   | 14 --------
 .../rtems/score/schedulerpriorityaffinitysmp.h     | 19 -----------
 cpukit/score/include/rtems/score/thread.h          |  7 +++-
 cpukit/score/src/processormaskcopy.c               |  2 ++
 cpukit/score/src/schedulerdefaultgetaffinity.c     | 37 ----------------------
 cpukit/score/src/schedulergetaffinity.c            | 30 ++++++------------
 cpukit/score/src/schedulerpriorityaffinitysmp.c    | 23 --------------
 cpukit/score/src/threadinitialize.c                |  1 +
 testsuites/smptests/smpaffinity01/init.c           |  2 +-
 testsuites/smptests/smppsxaffinity02/init.c        |  2 +-
 testsuites/smptests/smpscheduler02/init.c          | 19 ++++++++---
 14 files changed, 36 insertions(+), 150 deletions(-)

diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 1ac7c15..d2dd80d 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -161,7 +161,6 @@ libscore_a_SOURCES += src/smpmulticastaction.c
 libscore_a_SOURCES += src/cpuset.c
 libscore_a_SOURCES += src/cpusetprintsupport.c
 libscore_a_SOURCES += src/schedulerdefaultaskforhelp.c
-libscore_a_SOURCES += src/schedulerdefaultgetaffinity.c
 libscore_a_SOURCES += src/schedulerdefaultsetaffinity.c
 libscore_a_SOURCES += src/schedulersmp.c
 libscore_a_SOURCES += src/schedulersmpstartidle.c
diff --git a/cpukit/score/include/rtems/score/processormask.h b/cpukit/score/include/rtems/score/processormask.h
index b550aa4..ed79e63 100644
--- a/cpukit/score/include/rtems/score/processormask.h
+++ b/cpukit/score/include/rtems/score/processormask.h
@@ -252,6 +252,8 @@ RTEMS_INLINE_ROUTINE Processor_mask_Copy_status _Processor_mask_From_cpu_set_t(
   );
 }
 
+extern const Processor_mask _Processor_mask_The_one_and_only;
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h
index 1b9509a..6e7bdcb 100644
--- a/cpukit/score/include/rtems/score/scheduler.h
+++ b/cpukit/score/include/rtems/score/scheduler.h
@@ -203,14 +203,6 @@ typedef struct {
   );
 
 #if defined(RTEMS_SMP)
-  /** @see _Scheduler_Get_affinity() */
-  bool ( *get_affinity )(
-    const Scheduler_Control *,
-    Thread_Control *,
-    size_t,
-    cpu_set_t *
-  );
-  
   /** @see _Scheduler_Set_affinity() */
   bool ( *set_affinity )(
     const Scheduler_Control *,
@@ -514,24 +506,6 @@ void _Scheduler_default_Start_idle(
 );
 
 #if defined(RTEMS_SMP)
-  /**
-   * @brief Get affinity for the default scheduler.
-   *
-   * @param[in] scheduler The scheduler instance.
-   * @param[in] thread The associated thread.
-   * @param[in] cpusetsize The size of the cpuset.
-   * @param[out] cpuset Affinity set containing all CPUs.
-   *
-   * @retval 0 Successfully got cpuset
-   * @retval -1 The cpusetsize is invalid for the system
-   */
-  bool _Scheduler_default_Get_affinity(
-    const Scheduler_Control *scheduler,
-    Thread_Control          *thread,
-    size_t                   cpusetsize,
-    cpu_set_t               *cpuset
-  );
-
   /** 
    * @brief Set affinity for the default scheduler.
    *
@@ -553,7 +527,6 @@ void _Scheduler_default_Start_idle(
   );
 
   #define SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
-    , _Scheduler_default_Get_affinity \
     , _Scheduler_default_Set_affinity
 #else
   #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 c7c8bf0..927c6e1 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -613,20 +613,6 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Get_processor_set(
   }
 }
 
-RTEMS_INLINE_ROUTINE bool _Scheduler_default_Get_affinity_body(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *the_thread,
-  size_t                   cpusetsize,
-  cpu_set_t               *cpuset
-)
-{
-  (void) the_thread;
-
-  _Scheduler_Get_processor_set( scheduler, cpusetsize, cpuset );
-
-  return true;
-}
-
 bool _Scheduler_Get_affinity(
   Thread_Control *the_thread,
   size_t          cpusetsize,
diff --git a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
index 850c72b..fd4a336 100644
--- a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
+++ b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
@@ -68,7 +68,6 @@ extern "C" {
     _Scheduler_default_Cancel_job, \
     _Scheduler_default_Tick, \
     _Scheduler_SMP_Start_idle, \
-    _Scheduler_priority_affinity_SMP_Get_affinity, \
     _Scheduler_priority_affinity_SMP_Set_affinity \
   }
 
@@ -102,24 +101,6 @@ void _Scheduler_priority_affinity_SMP_Unblock(
   Scheduler_Node          *node
 );
 
-/**
- * @brief Get affinity for the priority affinity SMP scheduler.
- *
- * @param[in] scheduler The scheduler of the thread.
- * @param[in] thread The associated thread.
- * @param[in] cpusetsize The size of the cpuset.
- * @param[in,out] cpuset The associated affinity set.
- *
- * @retval 0 Successfully got cpuset
- * @retval -1 The cpusetsize is invalid for the system
- */
-bool _Scheduler_priority_affinity_SMP_Get_affinity(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *thread,
-  size_t                   cpusetsize,
-  cpu_set_t               *cpuset
-);
-
 void _Scheduler_priority_affinity_SMP_Update_priority(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
index 54b207f..ecab766 100644
--- a/cpukit/score/include/rtems/score/thread.h
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -37,7 +37,7 @@
 #include <rtems/score/watchdog.h>
 
 #if defined(RTEMS_SMP)
-  #include <rtems/score/cpuset.h>
+#include <rtems/score/processormask.h>
 #endif
 
 struct _pthread_cleanup_context;
@@ -311,6 +311,11 @@ typedef struct {
    * This list is protected by the thread scheduler lock.
    */
   Scheduler_Node *requests;
+
+  /**
+   * @brief The thread processor affinity set.
+   */
+  Processor_mask Affinity;
 #endif
 
   /**
diff --git a/cpukit/score/src/processormaskcopy.c b/cpukit/score/src/processormaskcopy.c
index bf8082d..677c886 100644
--- a/cpukit/score/src/processormaskcopy.c
+++ b/cpukit/score/src/processormaskcopy.c
@@ -26,6 +26,8 @@
 
 #include <rtems/score/processormask.h>
 
+const Processor_mask _Processor_mask_The_one_and_only = { .__bits[ 0 ] = 1 };
+
 Processor_mask_Copy_status _Processor_mask_Copy(
   long       *dst,
   size_t      dst_size,
diff --git a/cpukit/score/src/schedulerdefaultgetaffinity.c b/cpukit/score/src/schedulerdefaultgetaffinity.c
deleted file mode 100644
index 56a4ee4..0000000
--- a/cpukit/score/src/schedulerdefaultgetaffinity.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file
- *
- * @brief Scheduler Default Get Affinity Operation
- *
- * @ingroup ScoreScheduler
- */
-
-/*
- *  COPYRIGHT (c) 2014.
- *  On-Line Applications Research Corporation (OAR).
- *
- *  The license and distribution terms for this file may be
- *  found in the file LICENSE in this distribution or at
- *  http://www.rtems.org/license/LICENSE.
- */
-
-#if HAVE_CONFIG_H
-  #include "config.h"
-#endif
-
-#include <rtems/score/schedulerimpl.h>
-
-bool _Scheduler_default_Get_affinity(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *thread,
-  size_t                   cpusetsize,
-  cpu_set_t               *cpuset
-)
-{
-  return _Scheduler_default_Get_affinity_body(
-    scheduler,
-    thread,
-    cpusetsize,
-    cpuset
-  );
-}
diff --git a/cpukit/score/src/schedulergetaffinity.c b/cpukit/score/src/schedulergetaffinity.c
index 37e10de..8425a7f 100644
--- a/cpukit/score/src/schedulergetaffinity.c
+++ b/cpukit/score/src/schedulergetaffinity.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
@@ -24,33 +24,21 @@ bool _Scheduler_Get_affinity(
   cpu_set_t      *cpuset
 )
 {
-  const Scheduler_Control *scheduler;
-  ISR_lock_Context         lock_context;
-  bool                     ok;
-
-  if ( !_CPU_set_Is_large_enough( cpusetsize ) ) {
-    return false;
-  }
+  const Scheduler_Control    *scheduler;
+  ISR_lock_Context            lock_context;
+  Processor_mask             *affinity;
+  Processor_mask_Copy_status  status;
 
   scheduler = _Thread_Scheduler_get_home( the_thread );
   _Scheduler_Acquire_critical( scheduler, &lock_context );
 
 #if defined(RTEMS_SMP)
-  ok = ( *scheduler->Operations.get_affinity )(
-    scheduler,
-    the_thread,
-    cpusetsize,
-    cpuset
-  );
+  affinity = &the_thread->Scheduler.Affinity;
 #else
-  ok = _Scheduler_default_Get_affinity_body(
-    scheduler,
-    the_thread,
-    cpusetsize,
-    cpuset
-  );
+  affinity = &_Processor_mask_The_one_and_only;
 #endif
+  status = _Processor_mask_To_cpu_set_t( affinity, cpusetsize, cpuset );
 
   _Scheduler_Release_critical( scheduler, &lock_context );
-  return ok;
+  return status == PROCESSOR_MASK_COPY_LOSSLESS;
 }
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c
index 1fa5dbf..4533dec 100644
--- a/cpukit/score/src/schedulerpriorityaffinitysmp.c
+++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c
@@ -611,29 +611,6 @@ Thread_Control *_Scheduler_priority_affinity_SMP_Remove_processor(
   );
 }
 
-/*
- * This is the public scheduler specific Change Priority operation.
- */
-bool _Scheduler_priority_affinity_SMP_Get_affinity(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *thread,
-  size_t                   cpusetsize,
-  cpu_set_t               *cpuset
-)
-{
-  Scheduler_priority_affinity_SMP_Node *node =
-    _Scheduler_priority_affinity_SMP_Thread_get_node(thread);
-
-  (void) scheduler;
-
-  if ( node->Affinity.setsize != cpusetsize ) {
-    return false;
-  }
-
-  CPU_COPY( node->Affinity.set, cpuset );
-  return true;
-}
-
 bool _Scheduler_priority_affinity_SMP_Set_affinity(
   const Scheduler_Control *scheduler,
   Thread_Control          *thread,
diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
index c34113d..803ee7b 100644
--- a/cpukit/score/src/threadinitialize.c
+++ b/cpukit/score/src/threadinitialize.c
@@ -248,6 +248,7 @@ bool _Thread_Initialize(
   RTEMS_STATIC_ASSERT( THREAD_SCHEDULER_BLOCKED == 0, Scheduler_state );
   the_thread->Scheduler.home = scheduler;
   _ISR_lock_Initialize( &the_thread->Scheduler.Lock, "Thread Scheduler" );
+  _Processor_mask_Assign( &the_thread->Scheduler.Affinity, &_SMP_Online_processors );
   _ISR_lock_Initialize( &the_thread->Wait.Lock.Default, "Thread Wait Default" );
   _Thread_queue_Gate_open( &the_thread->Wait.Lock.Tranquilizer );
   _RBTree_Initialize_node( &the_thread->Wait.Link.Registry_node );
diff --git a/testsuites/smptests/smpaffinity01/init.c b/testsuites/smptests/smpaffinity01/init.c
index cf95fc5..be68e1b 100644
--- a/testsuites/smptests/smpaffinity01/init.c
+++ b/testsuites/smptests/smpaffinity01/init.c
@@ -84,7 +84,7 @@ void Validate_getaffinity_errors(void)
   puts(
     "Init - rtems_task_get_affinity - Invalid cpusetsize - RTEMS_INVALID_NUMBER"
   );
-  sc = rtems_task_get_affinity( Init_id,  sizeof(cpu_set_t) * 2, &cpuset );
+  sc = rtems_task_get_affinity( Init_id,  1, &cpuset );
   rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
 
   /* Verify rtems_task_get_affinity validates cpuset */
diff --git a/testsuites/smptests/smppsxaffinity02/init.c b/testsuites/smptests/smppsxaffinity02/init.c
index 462462f..5f8abac 100644
--- a/testsuites/smptests/smppsxaffinity02/init.c
+++ b/testsuites/smptests/smppsxaffinity02/init.c
@@ -89,7 +89,7 @@ void Validate_getaffinity_errors(void)
 
   /* Verify pthread_getaffinity_np validates cpusetsize */
   puts( "Init - pthread_getaffinity_np - Invalid cpusetsize - EINVAL" );
-  sc = pthread_getaffinity_np( Init_id,  sizeof(cpu_set_t) * 2, &cpuset );
+  sc = pthread_getaffinity_np( Init_id,  1, &cpuset );
   rtems_test_assert( sc == EINVAL );
 
   /* Verify pthread_getaffinity_np validates cpuset */
diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
index 4355857..db7d863 100644
--- a/testsuites/smptests/smpscheduler02/init.c
+++ b/testsuites/smptests/smpscheduler02/init.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2016 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2014, 2017 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -207,8 +207,14 @@ static void test(void)
   cpu_set_t first_cpu;
   cpu_set_t second_cpu;
   cpu_set_t all_cpus;
+  cpu_set_t online_cpus;
   uint32_t cpu_count;
 
+  cpu_count = rtems_get_processor_count();
+  rtems_test_assert(cpu_count == 1 || cpu_count == 2);
+
+  rtems_test_assert(rtems_get_current_processor() == 0);
+
   main_task_id = rtems_task_self();
 
   CPU_ZERO(&first_cpu);
@@ -221,9 +227,12 @@ static void test(void)
   CPU_SET(0, &all_cpus);
   CPU_SET(1, &all_cpus);
 
-  cpu_count = rtems_get_processor_count();
+  CPU_ZERO(&online_cpus);
+  CPU_SET(0, &online_cpus);
 
-  rtems_test_assert(rtems_get_current_processor() == 0);
+  if (cpu_count > 1) {
+    CPU_SET(1, &online_cpus);
+  }
 
   sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -304,7 +313,7 @@ static void test(void)
   CPU_ZERO(&cpuset);
   sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
-  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
+  rtems_test_assert(CPU_EQUAL(&cpuset, &online_cpus));
 
   rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
   rtems_test_assert(sched_get_priority_max(SCHED_RR) == 254);
@@ -326,7 +335,7 @@ static void test(void)
     CPU_ZERO(&cpuset);
     sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
-    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
+    rtems_test_assert(CPU_EQUAL(&cpuset, &online_cpus));
 
     sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus);
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);



More information about the vc mailing list