[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