From 78515554fd110c9636c38501b699a5da125a5496 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 3 Jul 2017 14:05:26 +0200 Subject: 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(-) delete mode 100644 cpukit/score/src/schedulerdefaultgetaffinity.c diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index 1ac7c1545c..d2dd80d6f0 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 b550aa42a9..ed79e63d6f 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 1b9509ae4f..6e7bdcbd9a 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 c7c8bf05a0..927c6e1762 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 850c72bb40..fd4a33670f 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 54b207f137..ecab766fee 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -37,7 +37,7 @@ #include #if defined(RTEMS_SMP) - #include +#include #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 bf8082d3c4..677c886e60 100644 --- a/cpukit/score/src/processormaskcopy.c +++ b/cpukit/score/src/processormaskcopy.c @@ -26,6 +26,8 @@ #include +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 56a4ee4fad..0000000000 --- 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 - -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 37e10de958..8425a7fcf6 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 1fa5dbf920..4533dec9d7 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 c34113db3d..803ee7b646 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 cf95fc54d1..be68e1bbfd 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 462462f275..5f8abac0a0 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 43558579ab..db7d863991 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); -- cgit v1.2.3