From 6b1d8c7865268071a8de6ba6343159049a8b0e56 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 4 Jul 2017 07:28:44 +0200 Subject: score: Add processor set to scheduler context Replace the simple processor count with the processor set owned by the scheduler instance. Update #3059. --- cpukit/rtems/src/scheduleraddprocessor.c | 2 +- cpukit/rtems/src/schedulergetprocessorset.c | 12 +++++++----- cpukit/rtems/src/schedulerremoveprocessor.c | 6 +++--- cpukit/score/include/rtems/score/scheduler.h | 4 ++-- cpukit/score/include/rtems/score/schedulerimpl.h | 25 +++++++----------------- cpukit/score/src/smp.c | 5 ++--- 6 files changed, 22 insertions(+), 32 deletions(-) diff --git a/cpukit/rtems/src/scheduleraddprocessor.c b/cpukit/rtems/src/scheduleraddprocessor.c index 505b8cc9dc..56d6811afd 100644 --- a/cpukit/rtems/src/scheduleraddprocessor.c +++ b/cpukit/rtems/src/scheduleraddprocessor.c @@ -95,7 +95,7 @@ rtems_status_code rtems_scheduler_add_processor( _ISR_lock_ISR_disable( &lock_context ); _Scheduler_Acquire_critical( scheduler, &lock_context ); - ++scheduler_context->processor_count; + _Processor_mask_Set( &scheduler_context->Processors, cpu_index ); cpu->Scheduler.control = scheduler; cpu->Scheduler.context = scheduler_context; ( *scheduler->Operations.add_processor )( scheduler, idle ); diff --git a/cpukit/rtems/src/schedulergetprocessorset.c b/cpukit/rtems/src/schedulergetprocessorset.c index 3b46ad07fc..d632e5e2c7 100644 --- a/cpukit/rtems/src/schedulergetprocessorset.c +++ b/cpukit/rtems/src/schedulergetprocessorset.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 @@ -26,7 +26,9 @@ rtems_status_code rtems_scheduler_get_processor_set( cpu_set_t *cpuset ) { - const Scheduler_Control *scheduler; + const Scheduler_Control *scheduler; + const Processor_mask *processor_set; + Processor_mask_Copy_status status; if ( cpuset == NULL ) { return RTEMS_INVALID_ADDRESS; @@ -37,11 +39,11 @@ rtems_status_code rtems_scheduler_get_processor_set( return RTEMS_INVALID_ID; } - if ( !_CPU_set_Is_large_enough( cpusetsize ) ) { + processor_set = _Scheduler_Get_processors( scheduler ); + status = _Processor_mask_To_cpu_set_t( processor_set, cpusetsize, cpuset ); + if ( status != PROCESSOR_MASK_COPY_LOSSLESS ) { return RTEMS_INVALID_NUMBER; } - _Scheduler_Get_processor_set( scheduler, cpusetsize, cpuset ); - return RTEMS_SUCCESSFUL; } diff --git a/cpukit/rtems/src/schedulerremoveprocessor.c b/cpukit/rtems/src/schedulerremoveprocessor.c index 03a688d64e..538366bb22 100644 --- a/cpukit/rtems/src/schedulerremoveprocessor.c +++ b/cpukit/rtems/src/schedulerremoveprocessor.c @@ -98,8 +98,8 @@ rtems_status_code rtems_scheduler_remove_processor( */ _ISR_lock_ISR_disable( &lock_context ); _Scheduler_Acquire_critical( scheduler, &lock_context ); - processor_count = scheduler_context->processor_count - 1; - scheduler_context->processor_count = processor_count; + _Processor_mask_Clear( &scheduler_context->Processors, cpu_index ); + processor_count = _Processor_mask_Count( &scheduler_context->Processors ); _Scheduler_Release_critical( scheduler, &lock_context ); _ISR_lock_ISR_enable( &lock_context ); @@ -130,7 +130,7 @@ rtems_status_code rtems_scheduler_remove_processor( _Chain_Extract_unprotected( &scheduler_node->Thread.Scheduler_node.Chain ); _Assert( _Chain_Is_empty( &idle->Scheduler.Scheduler_nodes ) ); } else { - ++scheduler_context->processor_count; + _Processor_mask_Set( &scheduler_context->Processors, cpu_index ); } cpu_self = _Thread_Dispatch_disable_critical( &lock_context ); diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h index 6e7bdcbd9a..7a3ae6b466 100644 --- a/cpukit/score/include/rtems/score/scheduler.h +++ b/cpukit/score/include/rtems/score/scheduler.h @@ -227,9 +227,9 @@ typedef struct Scheduler_Context { #if defined(RTEMS_SMP) /** - * @brief Count of processors owned by this scheduler instance. + * @brief The set of processors owned by this scheduler instance. */ - uint32_t processor_count; + Processor_mask Processors; #endif } Scheduler_Context; diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h index 927c6e1762..895f116066 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -589,28 +589,15 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_Has_processor_ownership( #endif } -RTEMS_INLINE_ROUTINE void _Scheduler_Get_processor_set( - const Scheduler_Control *scheduler, - size_t cpusetsize, - cpu_set_t *cpuset +RTEMS_INLINE_ROUTINE const Processor_mask *_Scheduler_Get_processors( + const Scheduler_Control *scheduler ) { - uint32_t cpu_count = _SMP_Get_processor_count(); - uint32_t cpu_index; - - CPU_ZERO_S( cpusetsize, cpuset ); - - for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) { #if defined(RTEMS_SMP) - if ( _Scheduler_Has_processor_ownership( scheduler, cpu_index ) ) { - CPU_SET_S( (int) cpu_index, cpusetsize, cpuset ); - } + return &_Scheduler_Get_context( scheduler )->Processors; #else - (void) scheduler; - - CPU_SET_S( (int) cpu_index, cpusetsize, cpuset ); + return &_Processor_mask_The_one_and_only; #endif - } } bool _Scheduler_Get_affinity( @@ -688,7 +675,9 @@ RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_processor_count( ) { #if defined(RTEMS_SMP) - return _Scheduler_Get_context( scheduler )->processor_count; + const Scheduler_Context *context = _Scheduler_Get_context( scheduler ); + + return _Processor_mask_Count( &context->Processors ); #else (void) scheduler; diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c index a69b7ed46a..1a29e37d15 100644 --- a/cpukit/score/src/smp.c +++ b/cpukit/score/src/smp.c @@ -97,11 +97,10 @@ static void _SMP_Start_processors( uint32_t cpu_count ) scheduler = assignment->scheduler; context = _Scheduler_Get_context( scheduler ); - ++context->processor_count; + _Processor_mask_Set( &_SMP_Online_processors, cpu_index ); + _Processor_mask_Set( &context->Processors, cpu_index ); cpu->Scheduler.control = scheduler; cpu->Scheduler.context = context; - - _Processor_mask_Set( &_SMP_Online_processors, cpu_index ); } } } -- cgit v1.2.3