From 8744498752ad4f0eaf9fb5640c6a0e0f2dc92fda Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 27 Oct 2017 09:04:53 +0200 Subject: score: Fix _Scheduler_Set_affinity() --- cpukit/score/src/scheduleredfsmp.c | 9 ++++----- cpukit/score/src/schedulersetaffinity.c | 7 +++++++ testsuites/sptests/spscheduler01/init.c | 13 ++++++++++++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/cpukit/score/src/scheduleredfsmp.c b/cpukit/score/src/scheduleredfsmp.c index 3a1b1a934e..82255b0f95 100644 --- a/cpukit/score/src/scheduleredfsmp.c +++ b/cpukit/score/src/scheduleredfsmp.c @@ -753,19 +753,18 @@ bool _Scheduler_EDF_SMP_Set_affinity( { Scheduler_Context *context; Processor_mask a; - Processor_mask b; + uint32_t count; uint32_t rqi; context = _Scheduler_Get_context( scheduler ); _Processor_mask_And( &a, &context->Processors, affinity ); + count = _Processor_mask_Count( &a ); - if ( _Processor_mask_Count( &a ) == 0 ) { + if ( count == 0 ) { return false; } - _Processor_mask_And( &b, &_SMP_Online_processors, affinity ); - - if ( _Processor_mask_Count( &b ) == _SMP_Processor_count ) { + if ( count == _SMP_Processor_count ) { rqi = 0; } else { rqi = _Processor_mask_Find_last_set( &a ); diff --git a/cpukit/score/src/schedulersetaffinity.c b/cpukit/score/src/schedulersetaffinity.c index 3d354800b2..00d1a8b207 100644 --- a/cpukit/score/src/schedulersetaffinity.c +++ b/cpukit/score/src/schedulersetaffinity.c @@ -36,6 +36,13 @@ bool _Scheduler_Set_affinity( return false; } + /* + * Reduce affinity set to the online processors to be in line with + * _Thread_Initialize() which sets the default affinity to the set of online + * processors. + */ + _Processor_mask_And( &affinity, &_SMP_Online_processors, &affinity ); + scheduler = _Thread_Scheduler_get_home( the_thread ); _Scheduler_Acquire_critical( scheduler, &lock_context ); diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c index 0fc1a891fe..77a4e9eacb 100644 --- a/testsuites/sptests/spscheduler01/init.c +++ b/testsuites/sptests/spscheduler01/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 @@ -43,6 +43,7 @@ static void test_task_get_set_affinity(void) rtems_id task_id; rtems_status_code sc; cpu_set_t cpusetone; + cpu_set_t cpusetall; cpu_set_t cpuset; size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t); size_t cpusetbigsize = CPU_ALLOC_SIZE(big); @@ -52,6 +53,8 @@ static void test_task_get_set_affinity(void) CPU_ZERO(&cpusetone); CPU_SET(0, &cpusetone); + CPU_FILL(&cpusetall); + sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 2, @@ -99,6 +102,14 @@ static void test_task_get_set_affinity(void) rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone)); + sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpusetall), &cpusetall); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone)); + cpusetbigone = CPU_ALLOC(big); rtems_test_assert(cpusetbigone != NULL); -- cgit v1.2.3