From: Zhongjie Zhu <zhongjiez...@gmail.com> when Acquires an ISR lock in SMP system, it first call _ISR_Local_disable() to disable ISR, this is the same with in UP system, so we could use the same isr_level in ISR_lock_Context, this change will also save 4 Bytes of SMP_lock_Context. --- cpukit/include/rtems/score/isrlock.h | 39 ++++---------- cpukit/include/rtems/score/smpisrlock.h | 69 +++++++++++++++++++++++++ cpukit/include/rtems/score/smplock.h | 60 --------------------- cpukit/score/src/profilingsmplock.c | 11 ++-- cpukit/score/src/smplock.c | 5 +- testsuites/smptests/smpload01/init.c | 2 +- testsuites/smptests/smpmrsp01/init.c | 6 +-- 7 files changed, 93 insertions(+), 99 deletions(-) create mode 100644 cpukit/include/rtems/score/smpisrlock.h
diff --git a/cpukit/include/rtems/score/isrlock.h b/cpukit/include/rtems/score/isrlock.h index 72ac760196..663410387b 100644 --- a/cpukit/include/rtems/score/isrlock.h +++ b/cpukit/include/rtems/score/isrlock.h @@ -79,10 +79,9 @@ typedef struct { * @brief Local ISR lock context for acquire and release pairs. */ typedef struct { + ISR_Level isr_level; #if defined( RTEMS_SMP ) SMP_lock_Context Lock_context; -#else - ISR_Level isr_level; #endif #if defined( RTEMS_PROFILING ) /** @@ -177,11 +176,7 @@ static inline void _ISR_lock_Context_set_level( ISR_Level level ) { -#if defined( RTEMS_SMP ) - context->Lock_context.isr_level = level; -#else context->isr_level = level; -#endif } /** @@ -230,6 +225,7 @@ static inline void _ISR_lock_Context_set_level( #define _ISR_lock_Set_name( _lock, _name ) #endif +#include <rtems/score/smpisrlock.h> /** * @brief Acquires an ISR lock. * @@ -248,7 +244,7 @@ static inline void _ISR_lock_Context_set_level( #define _ISR_lock_ISR_disable_and_acquire( _lock, _context ) \ _SMP_lock_ISR_disable_and_acquire( \ &( _lock )->Lock, \ - &( _context )->Lock_context \ + ( _context ) \ ) #else #define _ISR_lock_ISR_disable_and_acquire( _lock, _context ) \ @@ -273,7 +269,7 @@ static inline void _ISR_lock_Context_set_level( #define _ISR_lock_Release_and_ISR_enable( _lock, _context ) \ _SMP_lock_Release_and_ISR_enable( \ &( _lock )->Lock, \ - &( _context )->Lock_context \ + ( _context ) \ ) #else #define _ISR_lock_Release_and_ISR_enable( _lock, _context ) \ @@ -404,19 +400,11 @@ static inline void _ISR_lock_Context_set_level( * * @see _ISR_lock_ISR_enable(). */ -#if defined( RTEMS_SMP ) - #define _ISR_lock_ISR_disable( _context ) \ - do { \ - _ISR_Local_disable( ( _context )->Lock_context.isr_level ); \ - _ISR_lock_ISR_disable_profile( _context ) \ - } while ( 0 ) -#else - #define _ISR_lock_ISR_disable( _context ) \ - do { \ - _ISR_Local_disable( ( _context )->isr_level ); \ - _ISR_lock_ISR_disable_profile( _context ) \ - } while ( 0 ) -#endif +#define _ISR_lock_ISR_disable( _context ) \ + do { \ + _ISR_Local_disable( ( _context )->isr_level ); \ + _ISR_lock_ISR_disable_profile( _context ) \ + } while ( 0 ) /** * @brief Restores the saved interrupt state of the ISR lock context. @@ -428,13 +416,8 @@ static inline void _ISR_lock_Context_set_level( * * @see _ISR_lock_ISR_disable(). */ -#if defined( RTEMS_SMP ) - #define _ISR_lock_ISR_enable( _context ) \ - _ISR_Local_enable( ( _context )->Lock_context.isr_level ) -#else - #define _ISR_lock_ISR_enable( _context ) \ - _ISR_Local_enable( ( _context )->isr_level ) -#endif +#define _ISR_lock_ISR_enable( _context ) \ + _ISR_Local_enable( ( _context )->isr_level ) /** @} */ diff --git a/cpukit/include/rtems/score/smpisrlock.h b/cpukit/include/rtems/score/smpisrlock.h new file mode 100644 index 0000000000..984bbcf861 --- /dev/null +++ b/cpukit/include/rtems/score/smpisrlock.h @@ -0,0 +1,69 @@ +#ifndef _RTEMS_SCORE_SMP_ISR_LOCK_H +#define _RTEMS_SCORE_SMP_ISR_LOCK_H + +#if defined(RTEMS_SMP) + +#include <rtems/score/smplock.h> +#include <rtems/score/isrlock.h> +/** + * @brief Disables interrupts and acquires the SMP lock + * + * @param[in, out] lock The lock to acquire. + * @param[in, out] context The lock context. + */ +static inline void _SMP_lock_ISR_disable_and_acquire_inline( + SMP_lock_Control *lock, + ISR_lock_Context *context +) +{ + _ISR_Local_disable( context->isr_level ); + _SMP_lock_Acquire_inline( lock, &context->Lock_context ); +} + +/** + * @brief Disables interrupts and acquires the SMP lock. + * + * @param[in, out] lock The SMP lock control. + * @param[in, out] context The local SMP lock context for an acquire and release + * pair. + */ +void _SMP_lock_ISR_disable_and_acquire( + SMP_lock_Control *lock, + ISR_lock_Context *context +); + +/** + * @brief Releases the SMP lock and enables interrupts. + * + * @param[in, out] lock The SMP lock to release. + * @param[in, out] context The lock context. + */ +static inline void _SMP_lock_Release_and_ISR_enable_inline( + SMP_lock_Control *lock, + ISR_lock_Context *context +) +{ + _SMP_lock_Release_inline( lock, &context->Lock_context ); + _ISR_Local_enable( context->isr_level ); +} + +/** + * @brief Releases the SMP lock and enables interrupts. + * + * @param[in, out] lock The SMP lock control. + * @param[in, out] context The local SMP lock context for an acquire and release + * pair. + */ +#if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE) +void _SMP_lock_Release_and_ISR_enable( + SMP_lock_Control *lock, + ISR_lock_Context *context +); +#else +#define _SMP_lock_Release_and_ISR_enable( lock, context ) \ + _SMP_lock_Release_and_ISR_enable_inline( lock, context ) +#endif + +#endif /* RTEMS_SMP */ + +#endif diff --git a/cpukit/include/rtems/score/smplock.h b/cpukit/include/rtems/score/smplock.h index ca874fef08..84831499be 100644 --- a/cpukit/include/rtems/score/smplock.h +++ b/cpukit/include/rtems/score/smplock.h @@ -109,7 +109,6 @@ typedef struct { * @brief Local SMP lock context for acquire and release pairs. */ typedef struct { - ISR_Level isr_level; #if defined(RTEMS_DEBUG) SMP_lock_Control *lock_used_for_acquire; #endif @@ -327,65 +326,6 @@ void _SMP_lock_Release( _SMP_lock_Release_inline( lock, context ) #endif -/** - * @brief Disables interrupts and acquires the SMP lock - * - * @param[in, out] lock The lock to acquire. - * @param[in, out] context The lock context. - */ -static inline void _SMP_lock_ISR_disable_and_acquire_inline( - SMP_lock_Control *lock, - SMP_lock_Context *context -) -{ - _ISR_Local_disable( context->isr_level ); - _SMP_lock_Acquire_inline( lock, context ); -} - -/** - * @brief Disables interrupts and acquires the SMP lock. - * - * @param[in, out] lock The SMP lock control. - * @param[in, out] context The local SMP lock context for an acquire and release - * pair. - */ -void _SMP_lock_ISR_disable_and_acquire( - SMP_lock_Control *lock, - SMP_lock_Context *context -); - -/** - * @brief Releases the SMP lock and enables interrupts. - * - * @param[in, out] lock The SMP lock to release. - * @param[in, out] context The lock context. - */ -static inline void _SMP_lock_Release_and_ISR_enable_inline( - SMP_lock_Control *lock, - SMP_lock_Context *context -) -{ - _SMP_lock_Release_inline( lock, context ); - _ISR_Local_enable( context->isr_level ); -} - -/** - * @brief Releases the SMP lock and enables interrupts. - * - * @param[in, out] lock The SMP lock control. - * @param[in, out] context The local SMP lock context for an acquire and release - * pair. - */ -#if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE) -void _SMP_lock_Release_and_ISR_enable( - SMP_lock_Control *lock, - SMP_lock_Context *context -); -#else -#define _SMP_lock_Release_and_ISR_enable( lock, context ) \ - _SMP_lock_Release_and_ISR_enable_inline( lock, context ) -#endif - #if defined(RTEMS_DEBUG) /** * @brief Checks if the SMP lock is owned by the current processor. diff --git a/cpukit/score/src/profilingsmplock.c b/cpukit/score/src/profilingsmplock.c index 5c5b4d9196..41ebbcbed3 100644 --- a/cpukit/score/src/profilingsmplock.c +++ b/cpukit/score/src/profilingsmplock.c @@ -41,6 +41,7 @@ #endif #include <rtems/score/smplock.h> +#include <rtems/score/isrlock.h> #include <rtems/score/chainimpl.h> #include <string.h> @@ -78,7 +79,7 @@ void _SMP_lock_Stats_destroy( SMP_lock_Stats *stats ) { if ( !_Chain_Is_node_off_chain( &stats->Node ) ) { SMP_lock_Stats_control *control = &_SMP_lock_Stats_control; - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; SMP_lock_Stats_iteration_context *iteration_context; SMP_lock_Stats_iteration_context *iteration_context_tail; SMP_lock_Stats *next_stats; @@ -115,7 +116,7 @@ void _SMP_lock_Stats_register_or_max_section_time( if ( _Chain_Is_node_off_chain( &stats->Node ) ) { SMP_lock_Stats_control *control; - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; control = &_SMP_lock_Stats_control; _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context ); @@ -129,7 +130,7 @@ void _SMP_lock_Stats_iteration_start( ) { SMP_lock_Stats_control *control = &_SMP_lock_Stats_control; - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context ); @@ -152,7 +153,7 @@ bool _SMP_lock_Stats_iteration_next( ) { SMP_lock_Stats_control *control = &_SMP_lock_Stats_control; - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; SMP_lock_Stats *current; bool valid; @@ -190,7 +191,7 @@ void _SMP_lock_Stats_iteration_stop( ) { SMP_lock_Stats_control *control = &_SMP_lock_Stats_control; - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context ); _Chain_Extract_unprotected( &iteration_context->Node ); diff --git a/cpukit/score/src/smplock.c b/cpukit/score/src/smplock.c index c3a41300bb..a0ff2b3ab0 100644 --- a/cpukit/score/src/smplock.c +++ b/cpukit/score/src/smplock.c @@ -41,6 +41,7 @@ #endif #include <rtems/score/smplock.h> +#include <rtems/score/isrlock.h> #if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE) void _SMP_lock_Initialize( @@ -77,7 +78,7 @@ void _SMP_lock_Release( void _SMP_lock_ISR_disable_and_acquire( SMP_lock_Control *lock, - SMP_lock_Context *context + ISR_lock_Context *context ) { _SMP_lock_ISR_disable_and_acquire_inline( lock, context ); @@ -86,7 +87,7 @@ void _SMP_lock_ISR_disable_and_acquire( #if defined(RTEMS_SMP_LOCK_DO_NOT_INLINE) void _SMP_lock_Release_and_ISR_enable( SMP_lock_Control *lock, - SMP_lock_Context *context + ISR_lock_Context *context ) { _SMP_lock_Release_and_ISR_enable_inline( lock, context ); diff --git a/testsuites/smptests/smpload01/init.c b/testsuites/smptests/smpload01/init.c index d28e728746..c72b5e1ef5 100644 --- a/testsuites/smptests/smpload01/init.c +++ b/testsuites/smptests/smpload01/init.c @@ -241,7 +241,7 @@ static void get_obtain_delay_estimate(test_context *ctx) _ISR_Local_disable(level); for (i = 0; i < n; ++i) { - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; rtems_counter_ticks a; rtems_counter_ticks b; diff --git a/testsuites/smptests/smpmrsp01/init.c b/testsuites/smptests/smpmrsp01/init.c index e435f77b2a..2338b1e493 100644 --- a/testsuites/smptests/smpmrsp01/init.c +++ b/testsuites/smptests/smpmrsp01/init.c @@ -157,7 +157,7 @@ static void assert_executing_worker(test_context *ctx) static void switch_extension(Thread_Control *executing, Thread_Control *heir) { test_context *ctx = &test_instance; - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; size_t i; _SMP_lock_ISR_disable_and_acquire(&ctx->switch_lock, &lock_context); @@ -181,7 +181,7 @@ static void switch_extension(Thread_Control *executing, Thread_Control *heir) static void reset_switch_events(test_context *ctx) { - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; _SMP_lock_ISR_disable_and_acquire(&ctx->switch_lock, &lock_context); ctx->switch_index = 0; @@ -190,7 +190,7 @@ static void reset_switch_events(test_context *ctx) static size_t get_switch_events(test_context *ctx) { - SMP_lock_Context lock_context; + ISR_lock_Context lock_context; size_t events; _SMP_lock_ISR_disable_and_acquire(&ctx->switch_lock, &lock_context); -- 2.34.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel