[PATCH v2 14/15] score: Fix set scheduler

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


Ensure that the thread processor affinity fits the new scheduler
instance.

Update #3059.
---
 cpukit/score/include/rtems/score/schedulerimpl.h | 18 +++++++++++++-----
 testsuites/smptests/smpscheduler02/init.c        | 16 ++++++++++------
 2 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index cb9fd7e841..85fcace760 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -1092,10 +1092,22 @@ RTEMS_INLINE_ROUTINE Status_Control _Scheduler_Set(
   }
 
   old_scheduler = _Thread_Scheduler_get_home( the_thread );
+  new_scheduler_node = _Thread_Scheduler_get_node_by_index(
+    the_thread,
+    _Scheduler_Get_index( new_scheduler )
+  );
 
   _Scheduler_Acquire_critical( new_scheduler, &lock_context );
 
-  if ( _Scheduler_Get_processor_count( new_scheduler ) == 0 ) {
+  if (
+    _Scheduler_Get_processor_count( new_scheduler ) == 0
+      || !( *new_scheduler->Operations.set_affinity )(
+        new_scheduler,
+        the_thread,
+        new_scheduler_node,
+        &the_thread->Scheduler.Affinity
+      )
+  ) {
     _Scheduler_Release_critical( new_scheduler, &lock_context );
     _Priority_Plain_insert(
       &old_scheduler_node->Wait.Priority,
@@ -1110,10 +1122,6 @@ RTEMS_INLINE_ROUTINE Status_Control _Scheduler_Set(
   _Scheduler_Release_critical( new_scheduler, &lock_context );
 
   _Thread_Scheduler_process_requests( the_thread );
-  new_scheduler_node = _Thread_Scheduler_get_node_by_index(
-    the_thread,
-    _Scheduler_Get_index( new_scheduler )
-  );
 #else
   new_scheduler_node = old_scheduler_node;
 #endif
diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
index a15218b368..7dd60ec4c5 100644
--- a/testsuites/smptests/smpscheduler02/init.c
+++ b/testsuites/smptests/smpscheduler02/init.c
@@ -47,7 +47,7 @@ static void task(rtems_task_argument arg)
 
   rtems_test_assert(rtems_get_current_processor() == 1);
   rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
-  rtems_test_assert(sched_get_priority_max(SCHED_RR) == 126);
+  rtems_test_assert(sched_get_priority_max(SCHED_RR) == INT_MAX - 1);
 
   sc = rtems_semaphore_obtain(cmtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
   rtems_test_assert(sc == RTEMS_NOT_DEFINED);
@@ -345,12 +345,15 @@ static void test(void)
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
     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_INVALID_NUMBER);
-
     sc = rtems_task_set_affinity(task_id, sizeof(online_cpus), &online_cpus);
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
+    sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu);
+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+    sc = rtems_task_set_scheduler(task_id, scheduler_a_id, 1);
+    rtems_test_assert(sc == RTEMS_UNSATISFIED);
+
     sc = rtems_task_get_scheduler(task_id, &scheduler_id);
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
     rtems_test_assert(scheduler_id == scheduler_b_id);
@@ -415,6 +418,7 @@ static void Init(rtems_task_argument arg)
 /* Lets see when the first RTEMS system hits this limit */
 #define CONFIGURE_MAXIMUM_PROCESSORS 64
 
+#define CONFIGURE_SCHEDULER_EDF_SMP
 #define CONFIGURE_SCHEDULER_PRIORITY_SMP
 #define CONFIGURE_SCHEDULER_SIMPLE_SMP
 
@@ -422,13 +426,13 @@ static void Init(rtems_task_argument arg)
 
 RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, 256);
 
-RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, 128);
+RTEMS_SCHEDULER_CONTEXT_EDF_SMP(b, CONFIGURE_MAXIMUM_PROCESSORS);
 
 RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(c);
 
 #define CONFIGURE_SCHEDULER_CONTROLS \
   RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \
-  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B), \
+  RTEMS_SCHEDULER_CONTROL_EDF_SMP(b, SCHED_B), \
   RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(c, SCHED_C)
 
 #define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
-- 
2.12.3



More information about the devel mailing list