/*
* Copyright (c) 2018 Google, Inc.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* This test looks for a high number of wakeups from the schedutil governor
* threads.
*/
#define _GNU_SOURCE
#include <errno.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <time.h>
#include "tst_test.h"
#include "tst_safe_file_ops.h"
#include "tst_safe_pthread.h"
#include "trace_parse.h"
#define TRACE_EVENTS "sched_switch"
#define MAX_WAKEUPS 100
#define SLEEP_SEC 10
static void run(void)
{
int i;
int num_sugov_wakeups = 0;
tst_res(TINFO, "Observing sugov wakeups over %d sec, "
"%d wakeups allowed\n", SLEEP_SEC, MAX_WAKEUPS);
/* configure and enable tracing */
SAFE_FILE_PRINTF(TRACING_DIR "tracing_on", "0");
SAFE_FILE_PRINTF(TRACING_DIR "buffer_size_kb", "16384");
SAFE_FILE_PRINTF(TRACING_DIR "set_event", TRACE_EVENTS);
SAFE_FILE_PRINTF(TRACING_DIR "trace", "\n");
SAFE_FILE_PRINTF(TRACING_DIR "tracing_on", "1");
sleep(SLEEP_SEC);
/* disable tracing */
SAFE_FILE_PRINTF(TRACING_DIR "tracing_on", "0");
LOAD_TRACE();
for (i = 0; i < num_trace_records; i++) {
if (trace[i].event_type == TRACE_RECORD_SCHED_SWITCH) {
struct trace_sched_switch *t = trace[i].event_data;
if (!strncmp("sugov:", t->next_comm, 6))
num_sugov_wakeups++;
}
}
printf("%d sugov wakeups occurred.\n", num_sugov_wakeups);
if (num_sugov_wakeups > MAX_WAKEUPS)
tst_res(TFAIL, "Too many wakeups from the schedutil "
"governor.\n");
else
tst_res(TPASS, "Wakeups from schedutil governor were below "
"threshold.\n");
}
static struct tst_test test = {
.test_all = run,
.cleanup = trace_cleanup,
};