[PATCH 10/10] rtems: Avoid Giant lock for dual ported memory

Gedare Bloom gedare at rtems.org
Thu Apr 21 20:40:46 UTC 2016


looks good to me.

On Thu, Apr 21, 2016 at 3:20 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> There is no need for an ISR lock since the Dual_ported_memory_Control is
> immutable after initialization.  ISR disable is enough for deletion
> safety on uni-processor configurations.
>
> Update #2555.
> ---
>  cpukit/rtems/include/rtems/rtems/dpmemimpl.h | 18 +++--------
>  cpukit/rtems/src/dpmemdelete.c               | 33 ++++++-------------
>  cpukit/rtems/src/dpmemexternal2internal.c    | 47 ++++++++++++---------------
>  cpukit/rtems/src/dpmeminternal2external.c    | 48 ++++++++++++----------------
>  4 files changed, 54 insertions(+), 92 deletions(-)
>
> diff --git a/cpukit/rtems/include/rtems/rtems/dpmemimpl.h b/cpukit/rtems/include/rtems/rtems/dpmemimpl.h
> index 213856d..1e96722 100644
> --- a/cpukit/rtems/include/rtems/rtems/dpmemimpl.h
> +++ b/cpukit/rtems/include/rtems/rtems/dpmemimpl.h
> @@ -66,23 +66,13 @@ RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free (
>    _Objects_Free( &_Dual_ported_memory_Information, &the_port->Object );
>  }
>
> -/**
> - *  @brief Maps port IDs to port control blocks.
> - *
> - *  This function maps port IDs to port control blocks.  If ID
> - *  corresponds to a local port, then it returns the_port control
> - *  pointer which maps to ID and location is set to OBJECTS_LOCAL.
> - *  Global ports are not supported, thus if ID  does not map to a
> - *  local port, location is set to OBJECTS_ERROR and the_port is
> - *  undefined.
> - */
> -RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get (
> -  Objects_Id         id,
> -  Objects_Locations *location
> +RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get(
> +  Objects_Id        id,
> +  ISR_lock_Context *lock_context
>  )
>  {
>    return (Dual_ported_memory_Control *)
> -     _Objects_Get( &_Dual_ported_memory_Information, id, location );
> +    _Objects_Get_local( id, &_Dual_ported_memory_Information, lock_context );
>  }
>
>  /**@}*/
> diff --git a/cpukit/rtems/src/dpmemdelete.c b/cpukit/rtems/src/dpmemdelete.c
> index 6f11a53..f303629 100644
> --- a/cpukit/rtems/src/dpmemdelete.c
> +++ b/cpukit/rtems/src/dpmemdelete.c
> @@ -18,39 +18,26 @@
>  #include "config.h"
>  #endif
>
> -#include <rtems/system.h>
> -#include <rtems/rtems/status.h>
> -#include <rtems/rtems/support.h>
> -#include <rtems/score/address.h>
>  #include <rtems/rtems/dpmemimpl.h>
> -#include <rtems/score/thread.h>
>
>  rtems_status_code rtems_port_delete(
>    rtems_id id
>  )
>  {
> -  Dual_ported_memory_Control          *the_port;
> -  Objects_Locations                    location;
> +  Dual_ported_memory_Control *the_port;
> +  ISR_lock_Context            lock_context;
>
>    _Objects_Allocator_lock();
> -  the_port = _Dual_ported_memory_Get( id, &location );
> -  switch ( location ) {
> +  the_port = _Dual_ported_memory_Get( id, &lock_context );
>
> -    case OBJECTS_LOCAL:
> -      _Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
> -      _Objects_Put( &the_port->Object );
> -      _Dual_ported_memory_Free( the_port );
> -      _Objects_Allocator_unlock();
> -      return RTEMS_SUCCESSFUL;
> -
> -#if defined(RTEMS_MULTIPROCESSING)
> -    case OBJECTS_REMOTE:        /* this error cannot be returned */
> -#endif
> -    case OBJECTS_ERROR:
> -      break;
> +  if ( the_port == NULL ) {
> +    _Objects_Allocator_unlock();
> +    return RTEMS_INVALID_ID;
>    }
>
> +  _Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
> +  _ISR_lock_ISR_enable( &lock_context );
> +  _Dual_ported_memory_Free( the_port );
>    _Objects_Allocator_unlock();
> -
> -  return RTEMS_INVALID_ID;
> +  return RTEMS_SUCCESSFUL;
>  }
> diff --git a/cpukit/rtems/src/dpmemexternal2internal.c b/cpukit/rtems/src/dpmemexternal2internal.c
> index 237d5c4..0456010 100644
> --- a/cpukit/rtems/src/dpmemexternal2internal.c
> +++ b/cpukit/rtems/src/dpmemexternal2internal.c
> @@ -18,12 +18,8 @@
>  #include "config.h"
>  #endif
>
> -#include <rtems/system.h>
> -#include <rtems/rtems/status.h>
> -#include <rtems/rtems/support.h>
> -#include <rtems/score/address.h>
>  #include <rtems/rtems/dpmemimpl.h>
> -#include <rtems/score/thread.h>
> +#include <rtems/score/address.h>
>
>  rtems_status_code rtems_port_external_to_internal(
>    rtems_id   id,
> @@ -31,31 +27,28 @@ rtems_status_code rtems_port_external_to_internal(
>    void     **internal
>  )
>  {
> -  Dual_ported_memory_Control          *the_port;
> -  Objects_Locations                    location;
> -  uint32_t                             ending;
> +  Dual_ported_memory_Control *the_port;
> +  ISR_lock_Context            lock_context;
> +  uint32_t                    ending;
>
> -  if ( !internal )
> +  if ( internal == NULL ) {
>      return RTEMS_INVALID_ADDRESS;
> +  }
>
> -  the_port = _Dual_ported_memory_Get( id, &location );
> -  switch ( location ) {
> -    case OBJECTS_LOCAL:
> -      ending = _Addresses_Subtract( external, the_port->external_base );
> -      if ( ending > the_port->length )
> -        *internal = external;
> -      else
> -        *internal = _Addresses_Add_offset( the_port->internal_base,
> -                                           ending );
> -      _Objects_Put( &the_port->Object );
> -      return RTEMS_SUCCESSFUL;
> -
> -#if defined(RTEMS_MULTIPROCESSING)
> -    case OBJECTS_REMOTE:        /* this error cannot be returned */
> -#endif
> -    case OBJECTS_ERROR:
> -      break;
> +  the_port = _Dual_ported_memory_Get( id, &lock_context );
> +
> +  if ( the_port == NULL ) {
> +    return RTEMS_INVALID_ID;
> +  }
> +
> +  ending = _Addresses_Subtract( external, the_port->external_base );
> +
> +  if ( ending > the_port->length ) {
> +    *internal = external;
> +  } else {
> +    *internal = _Addresses_Add_offset( the_port->internal_base, ending );
>    }
>
> -  return RTEMS_INVALID_ID;
> +  _ISR_lock_ISR_enable( &lock_context );
> +  return RTEMS_SUCCESSFUL;
>  }
> diff --git a/cpukit/rtems/src/dpmeminternal2external.c b/cpukit/rtems/src/dpmeminternal2external.c
> index e048d8a..bd66ee4 100644
> --- a/cpukit/rtems/src/dpmeminternal2external.c
> +++ b/cpukit/rtems/src/dpmeminternal2external.c
> @@ -18,12 +18,8 @@
>  #include "config.h"
>  #endif
>
> -#include <rtems/system.h>
> -#include <rtems/rtems/status.h>
> -#include <rtems/rtems/support.h>
> -#include <rtems/score/address.h>
>  #include <rtems/rtems/dpmemimpl.h>
> -#include <rtems/score/thread.h>
> +#include <rtems/score/address.h>
>
>  rtems_status_code rtems_port_internal_to_external(
>    rtems_id   id,
> @@ -31,32 +27,28 @@ rtems_status_code rtems_port_internal_to_external(
>    void     **external
>  )
>  {
> -  Dual_ported_memory_Control          *the_port;
> -  Objects_Locations                    location;
> -  uint32_t                             ending;
> +  Dual_ported_memory_Control *the_port;
> +  ISR_lock_Context            lock_context;
> +  uint32_t                    ending;
>
> -  if ( !external )
> +  if ( external == NULL ) {
>      return RTEMS_INVALID_ADDRESS;
> +  }
>
> -  the_port = _Dual_ported_memory_Get( id, &location );
> -  switch ( location ) {
> -
> -    case OBJECTS_LOCAL:
> -      ending = _Addresses_Subtract( internal, the_port->internal_base );
> -      if ( ending > the_port->length )
> -        *external = internal;
> -      else
> -        *external = _Addresses_Add_offset( the_port->external_base,
> -                                           ending );
> -      _Objects_Put( &the_port->Object );
> -      return RTEMS_SUCCESSFUL;
> -
> -#if defined(RTEMS_MULTIPROCESSING)
> -    case OBJECTS_REMOTE:        /* this error cannot be returned */
> -#endif
> -    case OBJECTS_ERROR:
> -      break;
> +  the_port = _Dual_ported_memory_Get( id, &lock_context );
> +
> +  if ( the_port == NULL ) {
> +    return RTEMS_INVALID_ID;
> +  }
> +
> +  ending = _Addresses_Subtract( internal, the_port->internal_base );
> +
> +  if ( ending > the_port->length ) {
> +    *external = internal;
> +  } else {
> +    *external = _Addresses_Add_offset( the_port->external_base, ending );
>    }
>
> -  return RTEMS_INVALID_ID;
> +  _ISR_lock_ISR_enable( &lock_context );
> +  return RTEMS_SUCCESSFUL;
>  }
> --
> 1.8.4.5
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel



More information about the devel mailing list