testsuite: ztress: Make cpu load calculation multi-cpu ready

Use idle threads on all cores for cpu load calculation.

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2022-01-14 16:21:15 +01:00 committed by Anas Nashif
commit 1916a833f3

View file

@ -39,7 +39,7 @@ static uint32_t exec_cnt[CONFIG_ZTRESS_MAX_THREADS];
static k_timeout_t backoff[CONFIG_ZTRESS_MAX_THREADS];
static k_timeout_t init_backoff[CONFIG_ZTRESS_MAX_THREADS];
K_THREAD_STACK_ARRAY_DEFINE(stacks, CONFIG_ZTRESS_MAX_THREADS, CONFIG_ZTRESS_STACK_SIZE);
static k_tid_t idle_tid;
static k_tid_t idle_tid[CONFIG_MP_NUM_CPUS];
#define THREAD_NAME(i, _) STRINGIFY(ztress_##i)
@ -107,16 +107,21 @@ static void progress_timeout(struct k_timer *timer)
static void control_load(void)
{
static uint64_t prev_cycles;
static uint64_t prev_idle_cycles;
static uint64_t total_cycles;
k_thread_runtime_stats_t rt_stats_thread;
uint64_t idle_cycles = 0;
k_thread_runtime_stats_t rt_stats_all;
int err = 0;
err = k_thread_runtime_stats_get(idle_tid, &rt_stats_thread);
if (err < 0) {
return;
for (int i = 0; i < CONFIG_MP_NUM_CPUS; i++) {
k_thread_runtime_stats_t thread_stats;
err = k_thread_runtime_stats_get(idle_tid[i], &thread_stats);
if (err < 0) {
return;
}
idle_cycles += thread_stats.execution_cycles;
}
err = k_thread_runtime_stats_all_get(&rt_stats_all);
@ -124,10 +129,10 @@ static void control_load(void)
return;
}
int load = 1000 - (1000 * (rt_stats_thread.execution_cycles - prev_cycles) /
int load = 1000 - (1000 * (idle_cycles - prev_idle_cycles) /
(rt_stats_all.execution_cycles - total_cycles));
prev_cycles = rt_stats_thread.execution_cycles;
prev_idle_cycles = idle_cycles;
total_cycles = rt_stats_all.execution_cycles;
int avg_load = (rt.cpu_load * rt.cpu_load_measurements + load) /
@ -259,11 +264,15 @@ static void ztress_thread(void *data, void *prio, void *unused)
static void thread_cb(const struct k_thread *cthread, void *user_data)
{
#define GET_IDLE_TID(i, tid) do {\
if (strcmp(tname, "idle 0" STRINGIFY(i)) == 0) { \
idle_tid[i] = tid; \
} \
} while (0)
const char *tname = k_thread_name_get((struct k_thread *)cthread);
if (strcmp(tname, "idle 00") == 0) {
idle_tid = (struct k_thread *)cthread;
}
LISTIFY(CONFIG_MP_NUM_CPUS, GET_IDLE_TID, (;), (k_tid_t)cthread);
}
static void ztress_init(struct ztress_context_data *thread_data)