From 53ad908a646eb6fd67f9b4586f4b484e8255b9d3 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 7 Mar 2014 14:36:22 +0100 Subject: score: Add SMP lock profiling support --- cpukit/sapi/src/profilingiterate.c | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'cpukit/sapi/src/profilingiterate.c') diff --git a/cpukit/sapi/src/profilingiterate.c b/cpukit/sapi/src/profilingiterate.c index 28c06a4689..956dbde887 100644 --- a/cpukit/sapi/src/profilingiterate.c +++ b/cpukit/sapi/src/profilingiterate.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -76,6 +77,66 @@ static void per_cpu_stats_iterate( #endif } +#if defined(RTEMS_PROFILING) && defined(RTEMS_SMP) +RTEMS_STATIC_ASSERT( + RTEMS_PROFILING_SMP_LOCK_CONTENTION_COUNTS + == SMP_LOCK_STATS_CONTENTION_COUNTS, + smp_lock_contention_counts +); +#endif + +static void smp_lock_stats_iterate( + rtems_profiling_visitor visitor, + void *visitor_arg, + rtems_profiling_data *data +) +{ +#if defined(RTEMS_PROFILING) && defined(RTEMS_SMP) + SMP_lock_Stats_iteration_context iteration_context; + SMP_lock_Stats snapshot; + char name[64]; + + memset(data, 0, sizeof(*data)); + data->header.type = RTEMS_PROFILING_SMP_LOCK; + + _SMP_lock_Stats_iteration_start(&iteration_context); + while ( + _SMP_lock_Stats_iteration_next( + &iteration_context, + &snapshot, + &name[0], + sizeof(name) + ) + ) { + rtems_profiling_smp_lock *smp_lock_data = &data->smp_lock; + + smp_lock_data->name = name; + smp_lock_data->max_acquire_time = + rtems_counter_ticks_to_nanoseconds(snapshot.max_acquire_time); + smp_lock_data->max_section_time = + rtems_counter_ticks_to_nanoseconds(snapshot.max_section_time); + smp_lock_data->usage_count = snapshot.usage_count; + smp_lock_data->total_acquire_time = + rtems_counter_ticks_to_nanoseconds(snapshot.total_acquire_time); + smp_lock_data->total_section_time = + rtems_counter_ticks_to_nanoseconds(snapshot.total_section_time); + + memcpy( + &smp_lock_data->contention_counts[0], + &snapshot.contention_counts[0], + sizeof(smp_lock_data->contention_counts) + ); + + (*visitor)(visitor_arg, data); + } + _SMP_lock_Stats_iteration_stop(&iteration_context); +#else + (void) visitor; + (void) visitor_arg; + (void) data; +#endif +} + void rtems_profiling_iterate( rtems_profiling_visitor visitor, void *visitor_arg @@ -84,4 +145,5 @@ void rtems_profiling_iterate( rtems_profiling_data data; per_cpu_stats_iterate(visitor, visitor_arg, &data); + smp_lock_stats_iterate(visitor, visitor_arg, &data); } -- cgit v1.2.3