summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-03 14:05:26 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-07 07:28:29 +0200
commit78515554fd110c9636c38501b699a5da125a5496 (patch)
tree527f8f413668a43a76697dca3e994691bddcaa22
parentscore: Add some processor mask functions (diff)
downloadrtems-78515554fd110c9636c38501b699a5da125a5496.tar.bz2
score: Move processor affinity to Thread_Control
Update #3059.
-rw-r--r--cpukit/score/Makefile.am1
-rw-r--r--cpukit/score/include/rtems/score/processormask.h2
-rw-r--r--cpukit/score/include/rtems/score/scheduler.h27
-rw-r--r--cpukit/score/include/rtems/score/schedulerimpl.h14
-rw-r--r--cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h19
-rw-r--r--cpukit/score/include/rtems/score/thread.h7
-rw-r--r--cpukit/score/src/processormaskcopy.c2
-rw-r--r--cpukit/score/src/schedulerdefaultgetaffinity.c37
-rw-r--r--cpukit/score/src/schedulergetaffinity.c30
-rw-r--r--cpukit/score/src/schedulerpriorityaffinitysmp.c23
-rw-r--r--cpukit/score/src/threadinitialize.c1
-rw-r--r--testsuites/smptests/smpaffinity01/init.c2
-rw-r--r--testsuites/smptests/smppsxaffinity02/init.c2
-rw-r--r--testsuites/smptests/smpscheduler02/init.c19
14 files changed, 36 insertions, 150 deletions
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 <rtems/score/watchdog.h>
#if defined(RTEMS_SMP)
- #include <rtems/score/cpuset.h>
+#include <rtems/score/processormask.h>
#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 <rtems/score/processormask.h>
+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 <rtems/score/schedulerimpl.h>
-
-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);