From e239760f6a6a5e31331487548d56c4a7581ed7cc Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 29 Apr 2014 16:09:35 +0200 Subject: score: SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS Avoid the SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS fatal error and make it a run-time error in rtems_scheduler_ident() and _Scheduler_Get_by_id(). --- cpukit/rtems/include/rtems/rtems/tasks.h | 2 + cpukit/rtems/src/schedulerident.c | 12 +++- cpukit/score/include/rtems/score/schedulerimpl.h | 21 +++++- cpukit/score/include/rtems/score/smpimpl.h | 1 - cpukit/score/src/smp.c | 16 ----- doc/user/conf.t | 2 - doc/user/smp.t | 4 +- testsuites/smptests/Makefile.am | 1 - testsuites/smptests/configure.ac | 1 - testsuites/smptests/smpfatal06/Makefile.am | 19 ------ testsuites/smptests/smpfatal06/init.c | 81 ------------------------ testsuites/smptests/smpfatal06/smpfatal06.doc | 11 ---- testsuites/smptests/smpfatal06/smpfatal06.scn | 2 - testsuites/smptests/smpscheduler02/init.c | 58 +++++++++++++++-- 14 files changed, 83 insertions(+), 148 deletions(-) delete mode 100644 testsuites/smptests/smpfatal06/Makefile.am delete mode 100644 testsuites/smptests/smpfatal06/init.c delete mode 100644 testsuites/smptests/smpfatal06/smpfatal06.doc delete mode 100644 testsuites/smptests/smpfatal06/smpfatal06.scn diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h index a9016ce3f3..43e8c8ac9d 100644 --- a/cpukit/rtems/include/rtems/rtems/tasks.h +++ b/cpukit/rtems/include/rtems/rtems/tasks.h @@ -597,6 +597,8 @@ rtems_id rtems_task_self(void); * @retval RTEMS_SUCCESSFUL Successful operation. * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL. * @retval RTEMS_INVALID_NAME Invalid scheduler name. + * @retval RTEMS_UNSATISFIED A scheduler with this name exists, but the + * processor set of this scheduler is empty. */ rtems_status_code rtems_scheduler_ident( rtems_name name, diff --git a/cpukit/rtems/src/schedulerident.c b/cpukit/rtems/src/schedulerident.c index d9e913c946..ee18af009e 100644 --- a/cpukit/rtems/src/schedulerident.c +++ b/cpukit/rtems/src/schedulerident.c @@ -33,9 +33,15 @@ rtems_status_code rtems_scheduler_ident( sc = RTEMS_INVALID_NAME; for ( i = 0 ; i < n && sc == RTEMS_INVALID_NAME ; ++i ) { - if ( _Scheduler_Table[ i ].name == name ) { - *id = _Scheduler_Build_id( i ); - sc = RTEMS_SUCCESSFUL; + const Scheduler_Control *scheduler = &_Scheduler_Table[ i ]; + + if ( scheduler->name == name ) { + if ( _Scheduler_Get_processor_count( scheduler ) > 0 ) { + *id = _Scheduler_Build_id( i ); + sc = RTEMS_SUCCESSFUL; + } else { + sc = RTEMS_UNSATISFIED; + } } } } else { diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h index 35054dfd3b..6fad4e2190 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -571,6 +571,19 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Change_priority_if_higher( } } +RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_processor_count( + const Scheduler_Control *scheduler +) +{ +#if defined(RTEMS_SMP) + return scheduler->context->processor_count; +#else + (void) scheduler; + + return 1; +#endif +} + RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id( uint32_t scheduler_index ) { return _Objects_Build_id( @@ -583,15 +596,17 @@ RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id( uint32_t scheduler_index ) RTEMS_INLINE_ROUTINE bool _Scheduler_Get_by_id( Objects_Id id, - const Scheduler_Control **scheduler + const Scheduler_Control **scheduler_p ) { uint32_t minimum_id = _Scheduler_Build_id( 0 ); uint32_t index = id - minimum_id; + const Scheduler_Control *scheduler = &_Scheduler_Table[ index ]; - *scheduler = &_Scheduler_Table[ index ]; + *scheduler_p = scheduler; - return index < _Scheduler_Count; + return index < _Scheduler_Count + && _Scheduler_Get_processor_count( scheduler ) > 0; } RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_index( diff --git a/cpukit/score/include/rtems/score/smpimpl.h b/cpukit/score/include/rtems/score/smpimpl.h index c281592bdc..27cf188131 100644 --- a/cpukit/score/include/rtems/score/smpimpl.h +++ b/cpukit/score/include/rtems/score/smpimpl.h @@ -52,7 +52,6 @@ typedef enum { SMP_FATAL_BOOT_PROCESSOR_NOT_ASSIGNED_TO_SCHEDULER, SMP_FATAL_MANDATORY_PROCESSOR_NOT_PRESENT, SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR, - SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS, SMP_FATAL_START_OF_MANDATORY_PROCESSOR_FAILED } SMP_Fatal_code; diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c index f03a4c05e4..34db46ad1e 100644 --- a/cpukit/score/src/smp.c +++ b/cpukit/score/src/smp.c @@ -25,20 +25,6 @@ #include #include -static void _SMP_Check_scheduler_configuration( void ) -{ - size_t n = _Scheduler_Count; - size_t i; - - for ( i = 0 ; i < n ; ++i ) { - const Scheduler_Control *scheduler = &_Scheduler_Table[ i ]; - - if ( scheduler->context->processor_count == 0 ) { - _SMP_Fatal( SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS ); - } - } -} - static void _SMP_Start_processors( uint32_t cpu_count ) { uint32_t cpu_index_self = _SMP_Get_current_processor(); @@ -75,8 +61,6 @@ static void _SMP_Start_processors( uint32_t cpu_count ) ++assignment->scheduler->context->processor_count; } } - - _SMP_Check_scheduler_configuration(); } void _SMP_Handler_initialize( void ) diff --git a/doc/user/conf.t b/doc/user/conf.t index 4709022a8d..b518176455 100644 --- a/doc/user/conf.t +++ b/doc/user/conf.t @@ -3931,8 +3931,6 @@ processors. The processor demand must be reduced for this system. mandatory processor failed during system initialization. The system may not have this processor at all or it could be a problem with a boot loader for example. Check the @code{CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS} definition. -@item @code{SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS} - it is prohibited to have -a scheduler managing the empty processor set. @item @code{SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR} - it is not allowed to start multitasking on a processor with no scheduler assigned. @end itemize diff --git a/doc/user/smp.t b/doc/user/smp.t index d0e067ffef..0ad21f5662 100644 --- a/doc/user/smp.t +++ b/doc/user/smp.t @@ -446,7 +446,9 @@ rtems_status_code rtems_scheduler_ident( @code{@value{RPREFIX}SUCCESSFUL} - successful operation@* @code{@value{RPREFIX}INVALID_ADDRESS} - @code{id} is NULL@* -@code{@value{RPREFIX}INVALID_NAME} - invalid scheduler name +@code{@value{RPREFIX}INVALID_NAME} - invalid scheduler name@* +@code{@value{RPREFIX}UNSATISFIED} - - a scheduler with this name exists, but +the processor set of this scheduler is empty @subheading DESCRIPTION: diff --git a/testsuites/smptests/Makefile.am b/testsuites/smptests/Makefile.am index e757cf28eb..f16d39664d 100644 --- a/testsuites/smptests/Makefile.am +++ b/testsuites/smptests/Makefile.am @@ -16,7 +16,6 @@ SUBDIRS += smpfatal02 SUBDIRS += smpfatal03 SUBDIRS += smpfatal04 SUBDIRS += smpfatal05 -SUBDIRS += smpfatal06 SUBDIRS += smpfatal07 SUBDIRS += smpfatal08 SUBDIRS += smpload01 diff --git a/testsuites/smptests/configure.ac b/testsuites/smptests/configure.ac index ee36b50568..e3857f1e0f 100644 --- a/testsuites/smptests/configure.ac +++ b/testsuites/smptests/configure.ac @@ -71,7 +71,6 @@ smpfatal02/Makefile smpfatal03/Makefile smpfatal04/Makefile smpfatal05/Makefile -smpfatal06/Makefile smpfatal07/Makefile smpfatal08/Makefile smpload01/Makefile diff --git a/testsuites/smptests/smpfatal06/Makefile.am b/testsuites/smptests/smpfatal06/Makefile.am deleted file mode 100644 index c0bdf5bb23..0000000000 --- a/testsuites/smptests/smpfatal06/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -rtems_tests_PROGRAMS = smpfatal06 -smpfatal06_SOURCES = init.c - -dist_rtems_tests_DATA = smpfatal06.scn smpfatal06.doc - -include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg -include $(top_srcdir)/../automake/compile.am -include $(top_srcdir)/../automake/leaf.am - -AM_CPPFLAGS += -I$(top_srcdir)/../support/include - -LINK_OBJS = $(smpfatal06_OBJECTS) -LINK_LIBS = $(smpfatal06_LDLIBS) - -smpfatal06$(EXEEXT): $(smpfatal06_OBJECTS) $(smpfatal06_DEPENDENCIES) - @rm -f smpfatal06$(EXEEXT) - $(make-exe) - -include $(top_srcdir)/../automake/local.am diff --git a/testsuites/smptests/smpfatal06/init.c b/testsuites/smptests/smpfatal06/init.c deleted file mode 100644 index 739da7a35d..0000000000 --- a/testsuites/smptests/smpfatal06/init.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * - * - * 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. - */ - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include -#include -#include - -#include -#include - -const char rtems_test_name[] = "SMPFATAL 6"; - -static void Init(rtems_task_argument arg) -{ - assert(0); -} - -static void fatal_extension( - rtems_fatal_source source, - bool is_internal, - rtems_fatal_code code -) -{ - rtems_test_begink(); - - if ( - source == RTEMS_FATAL_SOURCE_SMP - && !is_internal - && code == SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS - ) { - rtems_test_endk(); - } -} - -#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER - -#define CONFIGURE_INITIAL_EXTENSIONS \ - { .fatal = fatal_extension }, \ - RTEMS_TEST_INITIAL_EXTENSION - -#define CONFIGURE_SMP_APPLICATION - -#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 1 - -#define CONFIGURE_SCHEDULER_SIMPLE_SMP - -#include - -RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(a); -RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(b); - -#define CONFIGURE_SCHEDULER_CONTROLS \ - RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(a, rtems_build_name('S', 'I', 'M', 'P')), \ - RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(b, rtems_build_name('S', 'I', 'M', 'P')) - -#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \ - RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY) - -#define CONFIGURE_MAXIMUM_TASKS 1 - -#define CONFIGURE_RTEMS_INIT_TASKS_TABLE - -#define CONFIGURE_INIT - -#include diff --git a/testsuites/smptests/smpfatal06/smpfatal06.doc b/testsuites/smptests/smpfatal06/smpfatal06.doc deleted file mode 100644 index e35b3b0a8e..0000000000 --- a/testsuites/smptests/smpfatal06/smpfatal06.doc +++ /dev/null @@ -1,11 +0,0 @@ -This file describes the directives and concepts tested by this test set. - -test set name: smpfatal06 - -directives: - - - _SMP_Handler_initialize() - -concepts: - - - Ensure that a scheduler without processor leads to a fatal error. diff --git a/testsuites/smptests/smpfatal06/smpfatal06.scn b/testsuites/smptests/smpfatal06/smpfatal06.scn deleted file mode 100644 index 575b2b3fb1..0000000000 --- a/testsuites/smptests/smpfatal06/smpfatal06.scn +++ /dev/null @@ -1,2 +0,0 @@ -*** TEST SMPFATAL 6 *** -*** END OF TEST SMPFATAL 6 *** diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c index f958744415..1e6b6d5925 100644 --- a/testsuites/smptests/smpscheduler02/init.c +++ b/testsuites/smptests/smpscheduler02/init.c @@ -25,12 +25,12 @@ const char rtems_test_name[] = "SMPSCHEDULER 2"; #if defined(__RTEMS_HAVE_SYS_CPUSET_H__) -#define CPU_COUNT 2 - #define SCHED_A rtems_build_name(' ', ' ', ' ', 'A') #define SCHED_B rtems_build_name(' ', ' ', ' ', 'B') +#define SCHED_C rtems_build_name(' ', ' ', ' ', 'C') + static rtems_id main_task_id; static void task(rtems_task_argument arg) @@ -56,6 +56,7 @@ static void test(void) rtems_id scheduler_id; rtems_id scheduler_a_id; rtems_id scheduler_b_id; + rtems_id scheduler_c_id; cpu_set_t cpuset; cpu_set_t first_cpu; cpu_set_t second_cpu; @@ -82,6 +83,9 @@ static void test(void) rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_a_id != scheduler_b_id); + sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id); + rtems_test_assert(sc == RTEMS_UNSATISFIED); + CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_a_id, @@ -122,6 +126,9 @@ static void test(void) sc = rtems_task_set_scheduler(task_id, scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1); + rtems_test_assert(sc == RTEMS_INVALID_ID); + sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); @@ -191,11 +198,13 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_SMP_APPLICATION -#define CONFIGURE_SMP_MAXIMUM_PROCESSORS CPU_COUNT +/* Lets see when the first RTEMS system hits this limit */ +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 64 #define CONFIGURE_MAXIMUM_PRIORITY 255 #define CONFIGURE_SCHEDULER_PRIORITY_SMP +#define CONFIGURE_SCHEDULER_SIMPLE_SMP #include @@ -203,15 +212,50 @@ RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, CONFIGURE_MAXIMUM_PRIORITY + 1); RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, CONFIGURE_MAXIMUM_PRIORITY + 1); +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_PRIORITY_SMP(b, SCHED_B), \ + RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(c, SCHED_C) #define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \ RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \ - RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY) - -#define CONFIGURE_MAXIMUM_TASKS CPU_COUNT + RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \ + RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL) + +#define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION -- cgit v1.2.3