[PATCH 2/2] score: _Scheduler_Set_affinity()

Sebastian Huber sebastian.huber at embedded-brains.de
Wed May 28 16:12:58 UTC 2014


Do not change the scheduler with this function.  Documentation.  Coding
style.
---
 cpukit/rtems/include/rtems/rtems/tasks.h         |   11 +++++
 cpukit/score/include/rtems/score/schedulerimpl.h |   10 +----
 cpukit/score/src/schedulersetaffinity.c          |   52 +++++++---------------
 doc/user/smp.t                                   |   10 ++++-
 testsuites/smptests/smpscheduler02/init.c        |    6 +-
 5 files changed, 41 insertions(+), 48 deletions(-)

diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
index 76653fd..e0fa27e 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -521,6 +521,17 @@ rtems_status_code rtems_task_get_affinity(
 /**
  * @brief Sets the processor affinity set of a task.
  *
+ * This function will not change the scheduler of the task.  The intersection
+ * of the processor affinity set and the set of processors owned by the
+ * scheduler of the task must be non-empty.  It is not an error if the
+ * processor affinity set contains processors that are not part of the set of
+ * processors owned by the scheduler instance of the task.  A task will simply
+ * not run under normal circumstances on these processors since the scheduler
+ * ignores them.  Some locking protocols may temporarily use processors that
+ * are not included in the processor affinity set of the task.  It is also not
+ * an error if the processor affinity set contains processors that are not part
+ * of the system.
+ *
  * @param[in] id Identifier of the task.  Use @ref RTEMS_SELF to select the
  * executing task.
  * @param[in] cpusetsize Size of the specified affinity set buffer in
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index a434c8c..f1acf32 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -418,7 +418,6 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(
   const cpu_set_t         *cpuset
 )
 {
-  size_t   cpu_max   = _CPU_set_Maximum_CPU_count( cpusetsize );
   uint32_t cpu_count = _SMP_Get_processor_count();
   uint32_t cpu_index;
   bool     ok = true;
@@ -429,8 +428,7 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(
       _Scheduler_Get_by_CPU_index( cpu_index );
 
     ok = ok
-      && ( ( CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset )
-          && scheduler == scheduler_of_cpu )
+      && ( CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset )
         || ( !CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset )
           && scheduler != scheduler_of_cpu ) );
 #else
@@ -440,12 +438,6 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(
 #endif
   }
 
-  for ( ; cpu_index < cpu_max ; ++cpu_index ) {
-    ok = ok && !CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset );
-  }
-
-  _Scheduler_Set( scheduler, the_thread );
-
   return ok;
 }
 
diff --git a/cpukit/score/src/schedulersetaffinity.c b/cpukit/score/src/schedulersetaffinity.c
index a20888b..f7c9336 100644
--- a/cpukit/score/src/schedulersetaffinity.c
+++ b/cpukit/score/src/schedulersetaffinity.c
@@ -26,45 +26,27 @@ bool _Scheduler_Set_affinity(
   const cpu_set_t         *cpuset
 )
 {
-  bool ok;
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
 
-  if ( _CPU_set_Is_large_enough( cpusetsize ) ) {
-#if defined(RTEMS_SMP)
-    uint32_t cpu_count = _SMP_Get_processor_count();
-    uint32_t cpu_index;
-
-    ok = false;
-
-    for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
-      if ( CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset ) ) {
-        const Scheduler_Control *scheduler_of_cpu =
-          _Scheduler_Get_by_CPU_index( cpu_index );
-
-        if ( scheduler_of_cpu != NULL ) {
-          ok = ( *scheduler_of_cpu->Operations.set_affinity )(
-            scheduler_of_cpu,
-            the_thread,
-            cpusetsize,
-            cpuset
-          );
-        }
+  if ( !_CPU_set_Is_large_enough( cpusetsize ) ) {
+    return false;
+  }
 
-        break;
-      }
-    }
+#if defined(RTEMS_SMP)
+  return ( *scheduler->Operations.set_affinity )(
+    scheduler,
+    the_thread,
+    cpusetsize,
+    cpuset
+  );
 #else
-    ok = _Scheduler_default_Set_affinity_body(
-      _Scheduler_Get( the_thread ),
-      the_thread,
-      cpusetsize,
-      cpuset
-    );
+  return _Scheduler_default_Set_affinity_body(
+    scheduler,
+    the_thread,
+    cpusetsize,
+    cpuset
+  );
 #endif
-  } else {
-    ok = false;
-  }
-
-  return ok;
 }
 
 #endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
diff --git a/doc/user/smp.t b/doc/user/smp.t
index a040b70..dd84c37 100644
--- a/doc/user/smp.t
+++ b/doc/user/smp.t
@@ -622,4 +622,12 @@ cleared bit means the opposite.
 
 @subheading NOTES:
 
-None.
+This function will not change the scheduler of the task.  The intersection of
+the processor affinity set and the set of processors owned by the scheduler of
+the task must be non-empty.  It is not an error if the processor affinity set
+contains processors that are not part of the set of processors owned by the
+scheduler instance of the task.  A task will simply not run under normal
+circumstances on these processors since the scheduler ignores them.  Some
+locking protocols may temporarily use processors that are not included in the
+processor affinity set of the task.  It is also not an error if the processor
+affinity set contains processors that are not part of the system.
diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
index 5bfff0e..9ae636c 100644
--- a/testsuites/smptests/smpscheduler02/init.c
+++ b/testsuites/smptests/smpscheduler02/init.c
@@ -139,14 +139,14 @@ static void test(void)
   rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
 
   sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus);
-  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
   sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu);
-  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
 
   sc = rtems_task_get_scheduler(task_id, &scheduler_id);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
-  rtems_test_assert(scheduler_id == scheduler_a_id);
+  rtems_test_assert(scheduler_id == scheduler_b_id);
 
   sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
-- 
1.7.7




More information about the devel mailing list