kernel: Swap RUNTIME_STATS implementation

Clean up RUNTIME_STATS to separate the API from the individual data
backends.  Use the SCHED_THREAD_USAGE tracking instead of the original
for execution_cycles.  Move the kconfig for that into the runtime
stats menu, since it's part of the family now.

Also remove a lot of needless #if's around the declarations.  Unused
structs and uncalled functions don't need to be explicitly hidden.  An
attempt to access a non-existent field (e.g. "execution_cycles" if
that isn't configured) provides all the build time validation we need.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
Andy Ross 2021-09-28 10:01:06 -07:00 committed by Anas Nashif
commit f169c5bc13
5 changed files with 31 additions and 111 deletions

View file

@ -21,10 +21,6 @@
#include <toolchain.h>
#include <tracing/tracing_macros.h>
#ifdef CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
#include <timing/timing.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
@ -5874,8 +5870,6 @@ __syscall int k_float_disable(struct k_thread *thread);
*/
__syscall int k_float_enable(struct k_thread *thread, unsigned int options);
#ifdef CONFIG_THREAD_RUNTIME_STATS
/**
* @brief Get the runtime statistics of a thread
*
@ -5894,8 +5888,6 @@ int k_thread_runtime_stats_get(k_tid_t thread,
*/
int k_thread_runtime_stats_all_get(k_thread_runtime_stats_t *stats);
#endif
#ifdef __cplusplus
}
#endif

View file

@ -169,29 +169,11 @@ struct _thread_userspace_local_data {
};
#endif
#ifdef CONFIG_THREAD_RUNTIME_STATS
struct k_thread_runtime_stats {
/* Thread execution cycles */
#ifdef CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
timing_t execution_cycles;
#else
typedef struct k_thread_runtime_stats {
#ifdef CONFIG_SCHED_THREAD_USAGE
uint64_t execution_cycles;
#endif
};
typedef struct k_thread_runtime_stats k_thread_runtime_stats_t;
struct _thread_runtime_stats {
/* Timestamp when last switched in */
#ifdef CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
timing_t last_switched_in;
#else
uint32_t last_switched_in;
#endif
k_thread_runtime_stats_t stats;
};
#endif
} k_thread_runtime_stats_t;
struct z_poller {
bool is_polling;
@ -289,11 +271,6 @@ struct k_thread {
uintptr_t tls;
#endif /* CONFIG_THREAD_LOCAL_STORAGE */
#ifdef CONFIG_THREAD_RUNTIME_STATS
/** Runtime statistics */
struct _thread_runtime_stats rt_stats;
#endif
#ifdef CONFIG_DEMAND_PAGING_THREAD_STATS
/** Paging statistics */
struct k_mem_paging_stats_t paging_stats;

View file

@ -377,26 +377,14 @@ config THREAD_MAX_NAME_LEN
config INSTRUMENT_THREAD_SWITCHING
bool
config SCHED_THREAD_USAGE
bool "Collect thread runtime usage"
select INSTRUMENT_THREAD_SWITCHING if !USE_SWITCH
help
Alternate implementation of thread runtime cycle usage
config SCHED_THREAD_USAGE_ALL
bool "Collect total system runtime usage"
default y if SCHED_THREAD_USAGE
help
Maintain a sum of all non-idle thread cycle usage.
menuconfig THREAD_RUNTIME_STATS
bool "Thread runtime statistics"
select INSTRUMENT_THREAD_SWITCHING
help
Gather thread runtime statistics.
For example:
- Thread total execution cycles
- System total execution cycles
if THREAD_RUNTIME_STATS
@ -409,6 +397,20 @@ config THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
Note that timing functions may use a different timer than
the default timer for OS timekeeping.
config SCHED_THREAD_USAGE
bool "Collect thread runtime usage"
default y
select INSTRUMENT_THREAD_SWITCHING if !USE_SWITCH
help
Collect thread runtime info at context switch time
config SCHED_THREAD_USAGE_ALL
bool "Collect total system runtime usage"
default y if SCHED_THREAD_USAGE
depends on SCHED_THREAD_USAGE
help
Maintain a sum of all non-idle thread cycle usage.
endif # THREAD_RUNTIME_STATS
endmenu

View file

@ -385,6 +385,8 @@ void z_sched_usage_stop(void);
void z_sched_usage_start(struct k_thread *thread);
uint64_t z_sched_thread_usage(struct k_thread *thread);
static inline void z_sched_usage_switch(struct k_thread *thread)
{
ARG_UNUSED(thread);

View file

@ -31,10 +31,6 @@
#include <logging/log.h>
LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL);
#ifdef CONFIG_THREAD_RUNTIME_STATS
k_thread_runtime_stats_t threads_runtime_stats;
#endif
#ifdef CONFIG_THREAD_MONITOR
/* This lock protects the linked list of active threads; i.e. the
* initial _kernel.threads pointer and the linked list made up of
@ -607,10 +603,6 @@ char *z_setup_new_thread(struct k_thread *new_thread,
SYS_PORT_TRACING_OBJ_FUNC(k_thread, create, new_thread);
#ifdef CONFIG_THREAD_RUNTIME_STATS
memset(&new_thread->rt_stats, 0, sizeof(new_thread->rt_stats));
#endif
return stack_ptr;
}
@ -1013,18 +1005,6 @@ void z_thread_mark_switched_in(void)
#ifdef CONFIG_TRACING
SYS_PORT_TRACING_FUNC(k_thread, switched_in);
#endif
#ifdef CONFIG_THREAD_RUNTIME_STATS
struct k_thread *thread;
thread = k_current_get();
#ifdef CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
thread->rt_stats.last_switched_in = timing_counter_get();
#else
thread->rt_stats.last_switched_in = k_cycle_get_32();
#endif /* CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS */
#endif /* CONFIG_THREAD_RUNTIME_STATS */
}
void z_thread_mark_switched_out(void)
@ -1033,48 +1013,12 @@ void z_thread_mark_switched_out(void)
z_sched_usage_stop();
#endif
#ifdef CONFIG_THREAD_RUNTIME_STATS
#ifdef CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
timing_t now;
#else
uint32_t now;
#endif /* CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS */
uint64_t diff;
struct k_thread *thread;
thread = k_current_get();
if (unlikely(thread->rt_stats.last_switched_in == 0)) {
/* Has not run before */
return;
}
if (unlikely(thread->base.thread_state == _THREAD_DUMMY)) {
/* dummy thread has no stat struct */
return;
}
#ifdef CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS
now = timing_counter_get();
diff = timing_cycles_get(&thread->rt_stats.last_switched_in, &now);
#else
now = k_cycle_get_32();
diff = (uint64_t)(now - thread->rt_stats.last_switched_in);
thread->rt_stats.last_switched_in = 0;
#endif /* CONFIG_THREAD_RUNTIME_STATS_USE_TIMING_FUNCTIONS */
thread->rt_stats.stats.execution_cycles += diff;
threads_runtime_stats.execution_cycles += diff;
#endif /* CONFIG_THREAD_RUNTIME_STATS */
#ifdef CONFIG_TRACING
SYS_PORT_TRACING_FUNC(k_thread, switched_out);
#endif
}
#endif /* CONFIG_INSTRUMENT_THREAD_SWITCHING */
#ifdef CONFIG_THREAD_RUNTIME_STATS
int k_thread_runtime_stats_get(k_tid_t thread,
k_thread_runtime_stats_t *stats)
{
@ -1082,8 +1026,11 @@ int k_thread_runtime_stats_get(k_tid_t thread,
return -EINVAL;
}
(void)memcpy(stats, &thread->rt_stats.stats,
sizeof(thread->rt_stats.stats));
*stats = (k_thread_runtime_stats_t) {};
#ifdef CONFIG_SCHED_THREAD_USAGE
stats->execution_cycles = z_sched_thread_usage(thread);
#endif
return 0;
}
@ -1094,11 +1041,11 @@ int k_thread_runtime_stats_all_get(k_thread_runtime_stats_t *stats)
return -EINVAL;
}
(void)memcpy(stats, &threads_runtime_stats,
sizeof(threads_runtime_stats));
*stats = (k_thread_runtime_stats_t) {};
#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
stats->execution_cycles = _kernel.all_thread_usage;
#endif
return 0;
}
#endif /* CONFIG_THREAD_RUNTIME_STATS */
#endif /* CONFIG_INSTRUMENT_THREAD_SWITCHING */