The MrsP semaphore implementation predates the addition of self-contained synchronization objects. At this time, the potential memory reduction was justified considering the more complex configuration and additional use of the workspace. With the availability of self-contained synchronization options, e.g. POSIX mutexes, this is no longer justified. Memory constrained applications should use the self-contained synchronization objects. Remove the CONFIGURE_MAXIMUM_MRSP_SEMAPHORES configuration option. This has only an impact on applications which use SMP and a large number of scheduler instances.
Update #3833. --- cpukit/include/rtems/confdefs.h | 26 ++++++++------------------ cpukit/include/rtems/rtems/semdata.h | 28 ++++++++++++++++++++++++++-- cpukit/include/rtems/score/mrsp.h | 2 +- cpukit/include/rtems/score/mrspimpl.h | 11 +---------- testsuites/smptests/smpfatal03/init.c | 1 - testsuites/smptests/smpmrsp01/init.c | 1 - testsuites/smptests/smpscheduler02/init.c | 1 - testsuites/sptests/spmrsp01/init.c | 1 - testsuites/tmtests/tmfine01/init.c | 2 -- 9 files changed, 36 insertions(+), 37 deletions(-) diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h index cbcd1f98c2..3f949b2cfa 100644 --- a/cpukit/include/rtems/confdefs.h +++ b/cpukit/include/rtems/confdefs.h @@ -2000,22 +2000,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #define CONFIGURE_MAXIMUM_SEMAPHORES 0 #endif -/* - * This macro is calculated to specify the memory required for - * Classic API Semaphores using MRSP. This is only available in - * SMP configurations. - */ -#if !defined(RTEMS_SMP) || \ - !defined(CONFIGURE_MAXIMUM_MRSP_SEMAPHORES) - #define _CONFIGURE_MEMORY_FOR_MRSP_SEMAPHORES 0 -#else - #define _CONFIGURE_MEMORY_FOR_MRSP_SEMAPHORES \ - CONFIGURE_MAXIMUM_MRSP_SEMAPHORES * \ - _Configure_From_workspace( \ - RTEMS_ARRAY_SIZE(_Scheduler_Table) * sizeof(Priority_Control) \ - ) -#endif - #ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES /** * This configuration parameter specifies the maximum number of @@ -2502,7 +2486,6 @@ struct _reent *__getreent(void) _CONFIGURE_TASKS, _CONFIGURE_TASKS) + \ _CONFIGURE_MEMORY_FOR_TASKS( \ _CONFIGURE_POSIX_THREADS, _CONFIGURE_POSIX_THREADS) + \ - _CONFIGURE_MEMORY_FOR_MRSP_SEMAPHORES + \ _CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \ CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES) + \ _CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( \ @@ -2786,7 +2769,10 @@ struct _reent *__getreent(void) #endif #if CONFIGURE_MAXIMUM_SEMAPHORES > 0 - SEMAPHORE_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_SEMAPHORES ); + SEMAPHORE_INFORMATION_DEFINE( + CONFIGURE_MAXIMUM_SEMAPHORES, + _CONFIGURE_SCHEDULER_COUNT + ); #endif #if _CONFIGURE_TIMERS > 0 @@ -3171,6 +3157,10 @@ struct _reent *__getreent(void) #warning "The CONFIGURE_NUMBER_OF_TERMIOS_PORTS configuration option is obsolete since RTEMS 5.1" #endif +#ifdef CONFIGURE_MAXIMUM_MRSP_SEMAPHORES + #warning "The CONFIGURE_MAXIMUM_MRSP_SEMAPHORES configuration option is obsolete since RTEMS 5.1" +#endif + #ifdef CONFIGURE_MAXIMUM_POSIX_BARRIERS #warning "The CONFIGURE_MAXIMUM_POSIX_BARRIERS configuration option is obsolete since RTEMS 5.1" #endif diff --git a/cpukit/include/rtems/rtems/semdata.h b/cpukit/include/rtems/rtems/semdata.h index f5a8afcc87..497f786dfb 100644 --- a/cpukit/include/rtems/rtems/semdata.h +++ b/cpukit/include/rtems/rtems/semdata.h @@ -108,9 +108,32 @@ void _Semaphore_MP_Send_extract_proxy ( * This macro should only be used by <rtems/confdefs.h>. * * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag - * may be set). + * may be set). + * @param scheduler_count The configured scheduler count (only used in SMP + * configurations). */ -#define SEMAPHORE_INFORMATION_DEFINE( max ) \ +#if defined(RTEMS_SMP) +#define SEMAPHORE_INFORMATION_DEFINE( max, scheduler_count ) \ + typedef union { \ + Objects_Control Object; \ + Semaphore_Control Semaphore; \ + struct { \ + Objects_Control Object; \ + MRSP_Control Control; \ + Priority_Control ceiling_priorities[ scheduler_count ]; \ + } MRSP; \ + } Semaphore_Configured_control; \ + OBJECTS_INFORMATION_DEFINE( \ + _Semaphore, \ + OBJECTS_CLASSIC_API, \ + OBJECTS_RTEMS_SEMAPHORES, \ + Semaphore_Configured_control, \ + max, \ + OBJECTS_NO_STRING_NAME, \ + _Semaphore_MP_Send_extract_proxy \ + ) +#else +#define SEMAPHORE_INFORMATION_DEFINE( max, scheduler_count ) \ OBJECTS_INFORMATION_DEFINE( \ _Semaphore, \ OBJECTS_CLASSIC_API, \ @@ -120,6 +143,7 @@ void _Semaphore_MP_Send_extract_proxy ( OBJECTS_NO_STRING_NAME, \ _Semaphore_MP_Send_extract_proxy \ ) +#endif /** @} */ diff --git a/cpukit/include/rtems/score/mrsp.h b/cpukit/include/rtems/score/mrsp.h index bb06b6aa2f..c7805aef57 100644 --- a/cpukit/include/rtems/score/mrsp.h +++ b/cpukit/include/rtems/score/mrsp.h @@ -73,7 +73,7 @@ typedef struct { /** * @brief One ceiling priority per scheduler instance. */ - Priority_Control *ceiling_priorities; + Priority_Control ceiling_priorities[ RTEMS_ZERO_LENGTH_ARRAY ]; } MRSP_Control; /** @} */ diff --git a/cpukit/include/rtems/score/mrspimpl.h b/cpukit/include/rtems/score/mrspimpl.h index 45b1d1ce7d..a576bc42dc 100644 --- a/cpukit/include/rtems/score/mrspimpl.h +++ b/cpukit/include/rtems/score/mrspimpl.h @@ -7,7 +7,7 @@ */ /* - * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2014, 2019 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -31,7 +31,6 @@ #include <rtems/score/status.h> #include <rtems/score/threadqimpl.h> #include <rtems/score/watchdogimpl.h> -#include <rtems/score/wkspace.h> #ifdef __cplusplus extern "C" { @@ -302,13 +301,6 @@ RTEMS_INLINE_ROUTINE Status_Control _MRSP_Initialize( return STATUS_INVALID_NUMBER; } - mrsp->ceiling_priorities = _Workspace_Allocate( - sizeof( *mrsp->ceiling_priorities ) * scheduler_count - ); - if ( mrsp->ceiling_priorities == NULL ) { - return STATUS_NO_MEMORY; - } - for ( i = 0 ; i < scheduler_count ; ++i ) { const Scheduler_Control *scheduler_of_index; @@ -524,7 +516,6 @@ RTEMS_INLINE_ROUTINE void _MRSP_Destroy( { _MRSP_Release( mrsp, queue_context ); _Thread_queue_Destroy( &mrsp->Wait_queue ); - _Workspace_Free( mrsp->ceiling_priorities ); } /** @} */ diff --git a/testsuites/smptests/smpfatal03/init.c b/testsuites/smptests/smpfatal03/init.c index a2021ce57e..c40194aacb 100644 --- a/testsuites/smptests/smpfatal03/init.c +++ b/testsuites/smptests/smpfatal03/init.c @@ -89,7 +89,6 @@ static void fatal_extension( #define CONFIGURE_MAXIMUM_TASKS 1 #define CONFIGURE_MAXIMUM_TIMERS 1 #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES 1 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/smptests/smpmrsp01/init.c b/testsuites/smptests/smpmrsp01/init.c index 6f00f688e4..815f7a0983 100644 --- a/testsuites/smptests/smpmrsp01/init.c +++ b/testsuites/smptests/smpmrsp01/init.c @@ -1777,7 +1777,6 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_MAXIMUM_TASKS (2 * CPU_COUNT + 2) #define CONFIGURE_MAXIMUM_SEMAPHORES (MRSP_COUNT + 1) -#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES MRSP_COUNT #define CONFIGURE_MAXIMUM_TIMERS 1 #define CONFIGURE_MAXIMUM_PROCESSORS CPU_COUNT diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c index e6480aa819..9fdd5b9076 100644 --- a/testsuites/smptests/smpscheduler02/init.c +++ b/testsuites/smptests/smpscheduler02/init.c @@ -427,7 +427,6 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_SEMAPHORES 2 -#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES 1 /* Lets see when the first RTEMS system hits this limit */ #define CONFIGURE_MAXIMUM_PROCESSORS 64 diff --git a/testsuites/sptests/spmrsp01/init.c b/testsuites/sptests/spmrsp01/init.c index de12713625..0d03f1dc83 100644 --- a/testsuites/sptests/spmrsp01/init.c +++ b/testsuites/sptests/spmrsp01/init.c @@ -327,7 +327,6 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES 1 #define CONFIGURE_INIT_TASK_PRIORITY 2 diff --git a/testsuites/tmtests/tmfine01/init.c b/testsuites/tmtests/tmfine01/init.c index 21e6aff6f5..1fe7c22d83 100644 --- a/testsuites/tmtests/tmfine01/init.c +++ b/testsuites/tmtests/tmfine01/init.c @@ -816,8 +816,6 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_MAXIMUM_SEMAPHORES (1 + CPU_COUNT) -#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES CPU_COUNT - #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES CPU_COUNT #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ -- 2.16.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel