On Wed, May 21, 2014 at 8:09 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > Add basic support for the Multiprocessor Resource Sharing Protocol > (MrsP). > > The Multiprocessor Resource Sharing Protocol (MrsP) is defined in A. > Burns and A.J. Wellings, A Schedulability Compatible Multiprocessor > Resource Sharing Protocol - MrsP, Proceedings of the 25th Euromicro > Conference on Real-Time Systems (ECRTS 2013), July 2013. It is a > generalization of the Priority Ceiling Protocol to SMP systems. Each > MrsP semaphore uses a ceiling priority per scheduler instance. These > ceiling priorities can be specified with rtems_semaphore_set_priority(). > A task obtaining or owning a MrsP semaphore will execute with the > ceiling priority for its scheduler instance as specified by the MrsP > semaphore object. Tasks waiting to get ownership of a MrsP semaphore > will not relinquish the processor voluntarily. In case the owner of a > MrsP semaphore gets preempted it can ask all tasks waiting for this > semaphore to help out and temporarily borrow the right to execute on one > of their assigned processors. > > The help out feature is not implemented with this patch. > --- > cpukit/rtems/Makefile.am | 1 + > cpukit/rtems/include/rtems/rtems/attr.h | 14 + > cpukit/rtems/include/rtems/rtems/attrimpl.h | 31 ++ > cpukit/rtems/include/rtems/rtems/sem.h | 46 +++ > cpukit/rtems/include/rtems/rtems/semimpl.h | 9 + > cpukit/rtems/src/semcreate.c | 38 ++- > cpukit/rtems/src/semdelete.c | 21 +- > cpukit/rtems/src/semflush.c | 7 +- > cpukit/rtems/src/semobtain.c | 19 +- > cpukit/rtems/src/semrelease.c | 14 +- > cpukit/rtems/src/semsetpriority.c | 116 +++++++ > cpukit/sapi/include/confdefs.h | 14 +- > cpukit/score/Makefile.am | 2 + > cpukit/score/include/rtems/score/mrsp.h | 135 ++++++++ > cpukit/score/include/rtems/score/mrspimpl.h | 301 +++++++++++++++++ > cpukit/score/include/rtems/score/schedulerimpl.h | 10 + > cpukit/score/preinstall.am | 8 + > doc/user/Makefile.am | 2 +- > doc/user/conf.t | 32 ++ > doc/user/sem.t | 198 +++++++++++- > testsuites/smptests/Makefile.am | 1 + > testsuites/smptests/configure.ac | 1 + > testsuites/smptests/smpmrsp01/Makefile.am | 19 ++ > testsuites/smptests/smpmrsp01/init.c | 287 +++++++++++++++++ > testsuites/smptests/smpmrsp01/smpmrsp01.doc | 15 + > testsuites/smptests/smpmrsp01/smpmrsp01.scn | 2 + > testsuites/sptests/Makefile.am | 1 + > testsuites/sptests/configure.ac | 1 + > testsuites/sptests/spmrsp01/Makefile.am | 19 ++ > testsuites/sptests/spmrsp01/init.c | 374 > ++++++++++++++++++++++ > testsuites/sptests/spmrsp01/spmrsp01.doc | 13 + > testsuites/sptests/spmrsp01/spmrsp01.scn | 8 + > 32 files changed, 1743 insertions(+), 16 deletions(-) > create mode 100644 cpukit/rtems/src/semsetpriority.c > create mode 100644 cpukit/score/include/rtems/score/mrsp.h > create mode 100644 cpukit/score/include/rtems/score/mrspimpl.h > create mode 100644 testsuites/smptests/smpmrsp01/Makefile.am > create mode 100644 testsuites/smptests/smpmrsp01/init.c > create mode 100644 testsuites/smptests/smpmrsp01/smpmrsp01.doc > create mode 100644 testsuites/smptests/smpmrsp01/smpmrsp01.scn > create mode 100644 testsuites/sptests/spmrsp01/Makefile.am > create mode 100644 testsuites/sptests/spmrsp01/init.c > create mode 100644 testsuites/sptests/spmrsp01/spmrsp01.doc > create mode 100644 testsuites/sptests/spmrsp01/spmrsp01.scn
[...] > diff --git a/cpukit/rtems/src/semflush.c b/cpukit/rtems/src/semflush.c > index f73c929..e818d68 100644 > --- a/cpukit/rtems/src/semflush.c > +++ b/cpukit/rtems/src/semflush.c > @@ -43,12 +43,17 @@ rtems_status_code rtems_semaphore_flush( > { > Semaphore_Control *the_semaphore; > Objects_Locations location; > + rtems_attribute attribute_set; > > the_semaphore = _Semaphore_Get( id, &location ); > switch ( location ) { > > case OBJECTS_LOCAL: > - if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) > ) { > + attribute_set = the_semaphore->attribute_set; > + if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) > { > + _Objects_Put( &the_semaphore->Object ); > + return RTEMS_NOT_DEFINED; > + } else if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) { > _CORE_mutex_Flush( > &the_semaphore->Core_control.mutex, > SEND_OBJECT_WAS_DELETED, Need #if defined(RTEMS_SMP)...#endif here. > diff --git a/cpukit/rtems/src/semsetpriority.c > b/cpukit/rtems/src/semsetpriority.c > new file mode 100644 > index 0000000..bb3a688 > --- /dev/null > +++ b/cpukit/rtems/src/semsetpriority.c > @@ -0,0 +1,116 @@ > +/* > + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. > + * > + * embedded brains GmbH > + * Dornierstr. 4 > + * 82178 Puchheim > + * Germany > + * <rt...@embedded-brains.de> > + * > + * 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/rtems/semimpl.h> > +#include <rtems/rtems/attrimpl.h> > +#include <rtems/rtems/tasksimpl.h> > +#include <rtems/score/schedulerimpl.h> > + > +static rtems_status_code _Semaphore_Set_priorities( Minor nit, should this be named _Semaphore_Set_priority()? > diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h > index 1c97d15..f3e5127 100644 > --- a/cpukit/sapi/include/confdefs.h > +++ b/cpukit/sapi/include/confdefs.h > @@ -1792,6 +1792,17 @@ const rtems_libio_helper rtems_fs_init_helper = > CONFIGURE_SEMAPHORES_FOR_FILE_SYSTEMS + \ > CONFIGURE_NETWORKING_SEMAPHORES) > > + #if !defined(RTEMS_SMP) || \ > + !defined(CONFIGURE_MAXIMUM_MULTIPROCESSOR_RESOURCE_SHARING_SEMAPHORES) Can this be CONFIGURE_MAXIMUM_MRSP_SEMAPHORES? > diff --git a/cpukit/score/include/rtems/score/mrsp.h > b/cpukit/score/include/rtems/score/mrsp.h > new file mode 100644 > index 0000000..4a790d4 > --- /dev/null > +++ b/cpukit/score/include/rtems/score/mrsp.h > @@ -0,0 +1,135 @@ > +/* > + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. > + * > + * embedded brains GmbH > + * Dornierstr. 4 > + * 82178 Puchheim > + * Germany > + * <rt...@embedded-brains.de> > + * > + * 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. > + */ > + > +#ifndef _RTEMS_SCORE_MRSP_H > +#define _RTEMS_SCORE_MRSP_H > + > +#include <rtems/score/cpuopts.h> > + > +#if defined(RTEMS_SMP) > + > +#include <rtems/score/atomic.h> > +#include <rtems/score/chain.h> > +#include <rtems/score/scheduler.h> > +#include <rtems/score/thread.h> > + > +#ifdef __cplusplus > +extern "C" { > +#endif /* __cplusplus */ > + > +/** > + * @defgroup ScoreMRSP Multiprocessor Resource Sharing Protocol Handler > + * > + * @ingroup Score > + * > + * @brief Multiprocessor Resource Sharing Protocol (MrsP). > + * > + * The Multiprocessor Resource Sharing Protocol (MrsP) is defined in A. > Burns > + * and A.J. Wellings, A Schedulability Compatible Multiprocessor Resource > + * Sharing Protocol - MrsP, Proceedings of the 25th Euromicro Conference on > + * Real-Time Systems (ECRTS 2013), July 2013. It is a generalization of the > + * Priority Ceiling Protocol to SMP systems. Each MrsP semaphore uses a > + * ceiling priority per scheduler instance. A task obtaining or owning a > MrsP > + * semaphore will execute with the ceiling priority for its scheduler > instance > + * as specified by the MrsP semaphore object. Tasks waiting to get ownership > + * of a MrsP semaphore will not relinquish the processor voluntarily. In > case > + * the owner of a MrsP semaphore gets preempted it can ask all tasks waiting > + * for this semaphore to help out and temporarily borrow the right to execute > + * on one of their assigned processors. > + * > + * @{ > + */ > + > +/** > + * @brief MRSP status code. > + * > + * The values are chosen to directly map to RTEMS status codes. In case this > + * implementation is used for other APIs, then for example the errno values > can > + * be added with a bit shift. > + */ > +typedef enum { > + MRSP_SUCCESSFUL = 0, > + MRSP_TIMEOUT = 6, > + MRSP_RESOUCE_IN_USE = 12, > + MRSP_UNSATISFIED = 13, > + MRSP_INVALID_PRIORITY = 19, > + MRSP_NOT_OWNER_OF_RESOURCE = 23, > + MRSP_NO_MEMORY = 26 > +} MRSP_Status; > + > +/** > + * @brief MRSP rival. > + * > + * The rivals are used by threads waiting for resource ownership. They are > + * registered in the MRSP control block. > + */ > +typedef struct { > + /** > + * @brief The node for registration in the MRSP rival chain. > + */ > + Chain_Node Node; > + > + /** > + * @brief Identification of the rival thread. > + */ > + Thread_Control *thread; > + > + /** > + * @brief The rival state. > + * > + * Initially no state bits are set. The rival will busy wait until a state > + * change happens. This an be MRSP_RIVAL_STATE_NEW_OWNER or "This an be" -> "This can be" > diff --git a/cpukit/score/include/rtems/score/mrspimpl.h > b/cpukit/score/include/rtems/score/mrspimpl.h > new file mode 100644 > index 0000000..7adb88f > --- /dev/null > +++ b/cpukit/score/include/rtems/score/mrspimpl.h > @@ -0,0 +1,301 @@ > +/* > + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. > + * > + * embedded brains GmbH > + * Dornierstr. 4 > + * 82178 Puchheim > + * Germany > + * <rt...@embedded-brains.de> > + * > + * 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. > + */ > + > +#ifndef _RTEMS_SCORE_MRSPIMPL_H > +#define _RTEMS_SCORE_MRSPIMPL_H > + > +#include <rtems/score/mrsp.h> > + > +#if defined(RTEMS_SMP) > + > +#include <rtems/score/assert.h> > +#include <rtems/score/chainimpl.h> > +#include <rtems/score/schedulerimpl.h> > +#include <rtems/score/watchdogimpl.h> > +#include <rtems/score/wkspace.h> > + > +#ifdef __cplusplus > +extern "C" { > +#endif /* __cplusplus */ > + > +/** > + * @addtogroup ScoreMRSP > + * > + * @{ > + */ > + > +#define MRSP_RIVAL_STATE_NEW_OWNER 0x1U > + > +#define MRSP_RIVAL_STATE_TIMEOUT 0x2U > + Does it make sense to have MRSP_RIVAL_STATE_WAITING 0x0? Also, the functions in this file could use some doxygen. > diff --git a/doc/user/Makefile.am b/doc/user/Makefile.am > index ef91a41..e774319 100644 > --- a/doc/user/Makefile.am > +++ b/doc/user/Makefile.am > @@ -96,7 +96,7 @@ sem.texi: sem.t > -n "Barrier Manager" < $< > $@ > > barrier.texi: barrier.t > - $(BMENU2) -p "Semaphore Manager SEMAPHORE_FLUSH - Unblock all tasks > waiting on a semaphore" \ > + $(BMENU2) -p "Semaphore Manager SEMAPHORE_SET_PRIORITY - Set priority > by scheduler for a semaphore" \ This should probably say "Set ceiling priority by scheduler" -Gedare _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel