Commit 34482388 authored by Costa Shulyupin's avatar Costa Shulyupin Committed by Steven Rostedt (Google)
Browse files

tools/rtla: Consolidate common parameters into shared structure

timerlat_params and osnoise_params structures contain 15 identical
fields.

Introduce a new header common.h and define a common_params structure to
consolidate shared fields, reduce code duplication, and enhance
maintainability.

Cc: John Kacur <jkacur@redhat.com>
Link: https://lore.kernel.org/20250907022325.243930-2-crwood@redhat.com


Reviewed-by: default avatarTomas Glozar <tglozar@redhat.com>
Signed-off-by: default avatarCosta Shulyupin <costa.shul@redhat.com>
Signed-off-by: default avatarCrystal Wood <crwood@redhat.com>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 76eeb9b8
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
#pragma once

#include "utils.h"

/*
 * common_params - Parameters shared between timerlat_params and osnoise_params
 */
struct common_params {
	/* trace configuration */
	char			*cpus;
	cpu_set_t		monitored_cpus;
	struct trace_events	*events;
	int			buffer_size;

	/* Timing parameters */
	int			warmup;
	long long		stop_us;
	long long		stop_total_us;
	int			sleep_time;
	int			duration;

	/* Scheduling parameters */
	int			set_sched;
	struct sched_attr	sched_param;
	int			cgroup;
	char			*cgroup_name;
	int			hk_cpus;
	cpu_set_t		hk_cpu_set;
};
+10 −10
Original line number Diff line number Diff line
@@ -1127,10 +1127,10 @@ osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params)
{
	int retval;

	if (!params->sleep_time)
		params->sleep_time = 1;
	if (!params->common.sleep_time)
		params->common.sleep_time = 1;

	retval = osnoise_set_cpus(tool->context, params->cpus ? params->cpus : "all");
	retval = osnoise_set_cpus(tool->context, params->common.cpus ? params->common.cpus : "all");
	if (retval) {
		err_msg("Failed to apply CPUs config\n");
		goto out_err;
@@ -1151,13 +1151,13 @@ osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params)
		goto out_err;
	}

	retval = osnoise_set_stop_us(tool->context, params->stop_us);
	retval = osnoise_set_stop_us(tool->context, params->common.stop_us);
	if (retval) {
		err_msg("Failed to set stop us\n");
		goto out_err;
	}

	retval = osnoise_set_stop_total_us(tool->context, params->stop_total_us);
	retval = osnoise_set_stop_total_us(tool->context, params->common.stop_total_us);
	if (retval) {
		err_msg("Failed to set stop total us\n");
		goto out_err;
@@ -1169,14 +1169,14 @@ osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params)
		goto out_err;
	}

	if (params->hk_cpus) {
		retval = sched_setaffinity(getpid(), sizeof(params->hk_cpu_set),
					   &params->hk_cpu_set);
	if (params->common.hk_cpus) {
		retval = sched_setaffinity(getpid(), sizeof(params->common.hk_cpu_set),
					   &params->common.hk_cpu_set);
		if (retval == -1) {
			err_msg("Failed to set rtla to the house keeping CPUs\n");
			goto out_err;
		}
	} else if (params->cpus) {
	} else if (params->common.cpus) {
		/*
		 * Even if the user do not set a house-keeping CPU, try to
		 * move rtla to a CPU set different to the one where the user
@@ -1184,7 +1184,7 @@ osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params)
		 *
		 * No need to check results as this is an automatic attempt.
		 */
		auto_house_keeping(&params->monitored_cpus);
		auto_house_keeping(&params->common.monitored_cpus);
	}

	retval = osnoise_set_workload(tool->context, true);
+2 −17
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#pragma once

#include "utils.h"
#include "common.h"
#include "trace.h"

enum osnoise_mode {
@@ -10,26 +10,11 @@ enum osnoise_mode {
};

struct osnoise_params {
	/* Common params */
	char			*cpus;
	cpu_set_t		monitored_cpus;
	struct common_params	common;
	char			*trace_output;
	char			*cgroup_name;
	unsigned long long	runtime;
	unsigned long long	period;
	long long		threshold;
	long long		stop_us;
	long long		stop_total_us;
	int			sleep_time;
	int			duration;
	int			set_sched;
	int			cgroup;
	int			hk_cpus;
	cpu_set_t		hk_cpu_set;
	struct sched_attr	sched_param;
	struct trace_events	*events;
	int			warmup;
	int			buffer_size;
	union {
		struct {
			/* top only */
+46 −46
Original line number Diff line number Diff line
@@ -243,7 +243,7 @@ static void osnoise_hist_header(struct osnoise_tool *tool)
		trace_seq_printf(s, "Index");

	for (cpu = 0; cpu < data->nr_cpus; cpu++) {
		if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
			continue;

		if (!data->hist[cpu].count)
@@ -274,7 +274,7 @@ osnoise_print_summary(struct osnoise_params *params,
		trace_seq_printf(trace->seq, "count:");

	for (cpu = 0; cpu < data->nr_cpus; cpu++) {
		if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
			continue;

		if (!data->hist[cpu].count)
@@ -288,7 +288,7 @@ osnoise_print_summary(struct osnoise_params *params,
		trace_seq_printf(trace->seq, "min:  ");

	for (cpu = 0; cpu < data->nr_cpus; cpu++) {
		if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
			continue;

		if (!data->hist[cpu].count)
@@ -303,7 +303,7 @@ osnoise_print_summary(struct osnoise_params *params,
		trace_seq_printf(trace->seq, "avg:  ");

	for (cpu = 0; cpu < data->nr_cpus; cpu++) {
		if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
			continue;

		if (!data->hist[cpu].count)
@@ -321,7 +321,7 @@ osnoise_print_summary(struct osnoise_params *params,
		trace_seq_printf(trace->seq, "max:  ");

	for (cpu = 0; cpu < data->nr_cpus; cpu++) {
		if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
			continue;

		if (!data->hist[cpu].count)
@@ -357,7 +357,7 @@ osnoise_print_stats(struct osnoise_params *params, struct osnoise_tool *tool)
					 bucket * data->bucket_size);

		for (cpu = 0; cpu < data->nr_cpus; cpu++) {
			if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
			if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
				continue;

			if (!data->hist[cpu].count)
@@ -395,7 +395,7 @@ osnoise_print_stats(struct osnoise_params *params, struct osnoise_tool *tool)
		trace_seq_printf(trace->seq, "over: ");

	for (cpu = 0; cpu < data->nr_cpus; cpu++) {
		if (params->cpus && !CPU_ISSET(cpu, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(cpu, &params->common.monitored_cpus))
			continue;

		if (!data->hist[cpu].count)
@@ -537,7 +537,7 @@ static struct osnoise_params
		switch (c) {
		case 'a':
			/* set sample stop to auto_thresh */
			params->stop_us = get_llong_from_str(optarg);
			params->common.stop_us = get_llong_from_str(optarg);

			/* set sample threshold to 1 */
			params->threshold = 1;
@@ -552,27 +552,27 @@ static struct osnoise_params
				osnoise_hist_usage("Bucket size needs to be > 0 and <= 1000000\n");
			break;
		case 'c':
			retval = parse_cpu_set(optarg, &params->monitored_cpus);
			retval = parse_cpu_set(optarg, &params->common.monitored_cpus);
			if (retval)
				osnoise_hist_usage("\nInvalid -c cpu list\n");
			params->cpus = optarg;
			params->common.cpus = optarg;
			break;
		case 'C':
			params->cgroup = 1;
			params->common.cgroup = 1;
			if (!optarg) {
				/* will inherit this cgroup */
				params->cgroup_name = NULL;
				params->common.cgroup_name = NULL;
			} else if (*optarg == '=') {
				/* skip the = */
				params->cgroup_name = ++optarg;
				params->common.cgroup_name = ++optarg;
			}
			break;
		case 'D':
			config_debug = 1;
			break;
		case 'd':
			params->duration = parse_seconds_duration(optarg);
			if (!params->duration)
			params->common.duration = parse_seconds_duration(optarg);
			if (!params->common.duration)
				osnoise_hist_usage("Invalid -D duration\n");
			break;
		case 'e':
@@ -582,10 +582,10 @@ static struct osnoise_params
				exit(EXIT_FAILURE);
			}

			if (params->events)
				tevent->next = params->events;
			if (params->common.events)
				tevent->next = params->common.events;

			params->events = tevent;
			params->common.events = tevent;
			break;
		case 'E':
			params->entries = get_llong_from_str(optarg);
@@ -597,8 +597,8 @@ static struct osnoise_params
			osnoise_hist_usage(NULL);
			break;
		case 'H':
			params->hk_cpus = 1;
			retval = parse_cpu_set(optarg, &params->hk_cpu_set);
			params->common.hk_cpus = 1;
			retval = parse_cpu_set(optarg, &params->common.hk_cpu_set);
			if (retval) {
				err_msg("Error parsing house keeping CPUs\n");
				exit(EXIT_FAILURE);
@@ -610,10 +610,10 @@ static struct osnoise_params
				osnoise_hist_usage("Period longer than 10 s\n");
			break;
		case 'P':
			retval = parse_prio(optarg, &params->sched_param);
			retval = parse_prio(optarg, &params->common.sched_param);
			if (retval == -1)
				osnoise_hist_usage("Invalid -P priority");
			params->set_sched = 1;
			params->common.set_sched = 1;
			break;
		case 'r':
			params->runtime = get_llong_from_str(optarg);
@@ -621,10 +621,10 @@ static struct osnoise_params
				osnoise_hist_usage("Runtime shorter than 100 us\n");
			break;
		case 's':
			params->stop_us = get_llong_from_str(optarg);
			params->common.stop_us = get_llong_from_str(optarg);
			break;
		case 'S':
			params->stop_total_us = get_llong_from_str(optarg);
			params->common.stop_total_us = get_llong_from_str(optarg);
			break;
		case 'T':
			params->threshold = get_llong_from_str(optarg);
@@ -653,8 +653,8 @@ static struct osnoise_params
			params->with_zeros = 1;
			break;
		case '4': /* trigger */
			if (params->events) {
				retval = trace_event_add_trigger(params->events, optarg);
			if (params->common.events) {
				retval = trace_event_add_trigger(params->common.events, optarg);
				if (retval) {
					err_msg("Error adding trigger %s\n", optarg);
					exit(EXIT_FAILURE);
@@ -664,8 +664,8 @@ static struct osnoise_params
			}
			break;
		case '5': /* filter */
			if (params->events) {
				retval = trace_event_add_filter(params->events, optarg);
			if (params->common.events) {
				retval = trace_event_add_filter(params->common.events, optarg);
				if (retval) {
					err_msg("Error adding filter %s\n", optarg);
					exit(EXIT_FAILURE);
@@ -675,10 +675,10 @@ static struct osnoise_params
			}
			break;
		case '6':
			params->warmup = get_llong_from_str(optarg);
			params->common.warmup = get_llong_from_str(optarg);
			break;
		case '7':
			params->buffer_size = get_llong_from_str(optarg);
			params->common.buffer_size = get_llong_from_str(optarg);
			break;
		default:
			osnoise_hist_usage("Invalid option");
@@ -755,9 +755,9 @@ static void
osnoise_hist_set_signals(struct osnoise_params *params)
{
	signal(SIGINT, stop_hist);
	if (params->duration) {
	if (params->common.duration) {
		signal(SIGALRM, stop_hist);
		alarm(params->duration);
		alarm(params->common.duration);
	}
}

@@ -798,16 +798,16 @@ int osnoise_hist_main(int argc, char *argv[])
	if (retval)
		goto out_destroy;

	if (params->set_sched) {
		retval = set_comm_sched_attr("osnoise/", &params->sched_param);
	if (params->common.set_sched) {
		retval = set_comm_sched_attr("osnoise/", &params->common.sched_param);
		if (retval) {
			err_msg("Failed to set sched parameters\n");
			goto out_free;
		}
	}

	if (params->cgroup) {
		retval = set_comm_cgroup("timerlat/", params->cgroup_name);
	if (params->common.cgroup) {
		retval = set_comm_cgroup("timerlat/", params->common.cgroup_name);
		if (!retval) {
			err_msg("Failed to move threads to cgroup\n");
			goto out_free;
@@ -821,14 +821,14 @@ int osnoise_hist_main(int argc, char *argv[])
			goto out_free;
		}

		if (params->events) {
			retval = trace_events_enable(&record->trace, params->events);
		if (params->common.events) {
			retval = trace_events_enable(&record->trace, params->common.events);
			if (retval)
				goto out_hist;
		}

		if (params->buffer_size > 0) {
			retval = trace_set_buffer_size(&record->trace, params->buffer_size);
		if (params->common.buffer_size > 0) {
			retval = trace_set_buffer_size(&record->trace, params->common.buffer_size);
			if (retval)
				goto out_hist;
		}
@@ -845,9 +845,9 @@ int osnoise_hist_main(int argc, char *argv[])
		trace_instance_start(&record->trace);
	trace_instance_start(trace);

	if (params->warmup > 0) {
		debug_msg("Warming up for %d seconds\n", params->warmup);
		sleep(params->warmup);
	if (params->common.warmup > 0) {
		debug_msg("Warming up for %d seconds\n", params->common.warmup);
		sleep(params->common.warmup);
		if (stop_tracing)
			goto out_hist;

@@ -868,7 +868,7 @@ int osnoise_hist_main(int argc, char *argv[])
	osnoise_hist_set_signals(params);

	while (!stop_tracing) {
		sleep(params->sleep_time);
		sleep(params->common.sleep_time);

		retval = tracefs_iterate_raw_events(trace->tep,
						    trace->inst,
@@ -899,8 +899,8 @@ int osnoise_hist_main(int argc, char *argv[])
	}

out_hist:
	trace_events_destroy(&record->trace, params->events);
	params->events = NULL;
	trace_events_destroy(&record->trace, params->common.events);
	params->common.events = NULL;
out_free:
	osnoise_free_histogram(tool->data);
out_destroy:
+40 −40
Original line number Diff line number Diff line
@@ -238,7 +238,7 @@ osnoise_print_stats(struct osnoise_params *params, struct osnoise_tool *top)
	osnoise_top_header(top);

	for (i = 0; i < nr_cpus; i++) {
		if (params->cpus && !CPU_ISSET(i, &params->monitored_cpus))
		if (params->common.cpus && !CPU_ISSET(i, &params->common.monitored_cpus))
			continue;
		osnoise_top_print(top, i);
	}
@@ -377,7 +377,7 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
		switch (c) {
		case 'a':
			/* set sample stop to auto_thresh */
			params->stop_us = get_llong_from_str(optarg);
			params->common.stop_us = get_llong_from_str(optarg);

			/* set sample threshold to 1 */
			params->threshold = 1;
@@ -387,27 +387,27 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)

			break;
		case 'c':
			retval = parse_cpu_set(optarg, &params->monitored_cpus);
			retval = parse_cpu_set(optarg, &params->common.monitored_cpus);
			if (retval)
				osnoise_top_usage(params, "\nInvalid -c cpu list\n");
			params->cpus = optarg;
			params->common.cpus = optarg;
			break;
		case 'C':
			params->cgroup = 1;
			params->common.cgroup = 1;
			if (!optarg) {
				/* will inherit this cgroup */
				params->cgroup_name = NULL;
				params->common.cgroup_name = NULL;
			} else if (*optarg == '=') {
				/* skip the = */
				params->cgroup_name = ++optarg;
				params->common.cgroup_name = ++optarg;
			}
			break;
		case 'D':
			config_debug = 1;
			break;
		case 'd':
			params->duration = parse_seconds_duration(optarg);
			if (!params->duration)
			params->common.duration = parse_seconds_duration(optarg);
			if (!params->common.duration)
				osnoise_top_usage(params, "Invalid -d duration\n");
			break;
		case 'e':
@@ -417,9 +417,9 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
				exit(EXIT_FAILURE);
			}

			if (params->events)
				tevent->next = params->events;
			params->events = tevent;
			if (params->common.events)
				tevent->next = params->common.events;
			params->common.events = tevent;

			break;
		case 'h':
@@ -427,8 +427,8 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
			osnoise_top_usage(params, NULL);
			break;
		case 'H':
			params->hk_cpus = 1;
			retval = parse_cpu_set(optarg, &params->hk_cpu_set);
			params->common.hk_cpus = 1;
			retval = parse_cpu_set(optarg, &params->common.hk_cpu_set);
			if (retval) {
				err_msg("Error parsing house keeping CPUs\n");
				exit(EXIT_FAILURE);
@@ -440,10 +440,10 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
				osnoise_top_usage(params, "Period longer than 10 s\n");
			break;
		case 'P':
			retval = parse_prio(optarg, &params->sched_param);
			retval = parse_prio(optarg, &params->common.sched_param);
			if (retval == -1)
				osnoise_top_usage(params, "Invalid -P priority");
			params->set_sched = 1;
			params->common.set_sched = 1;
			break;
		case 'q':
			params->quiet = 1;
@@ -454,10 +454,10 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
				osnoise_top_usage(params, "Runtime shorter than 100 us\n");
			break;
		case 's':
			params->stop_us = get_llong_from_str(optarg);
			params->common.stop_us = get_llong_from_str(optarg);
			break;
		case 'S':
			params->stop_total_us = get_llong_from_str(optarg);
			params->common.stop_total_us = get_llong_from_str(optarg);
			break;
		case 't':
			if (optarg) {
@@ -474,8 +474,8 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
			params->threshold = get_llong_from_str(optarg);
			break;
		case '0': /* trigger */
			if (params->events) {
				retval = trace_event_add_trigger(params->events, optarg);
			if (params->common.events) {
				retval = trace_event_add_trigger(params->common.events, optarg);
				if (retval) {
					err_msg("Error adding trigger %s\n", optarg);
					exit(EXIT_FAILURE);
@@ -485,8 +485,8 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
			}
			break;
		case '1': /* filter */
			if (params->events) {
				retval = trace_event_add_filter(params->events, optarg);
			if (params->common.events) {
				retval = trace_event_add_filter(params->common.events, optarg);
				if (retval) {
					err_msg("Error adding filter %s\n", optarg);
					exit(EXIT_FAILURE);
@@ -496,10 +496,10 @@ struct osnoise_params *osnoise_top_parse_args(int argc, char **argv)
			}
			break;
		case '2':
			params->warmup = get_llong_from_str(optarg);
			params->common.warmup = get_llong_from_str(optarg);
			break;
		case '3':
			params->buffer_size = get_llong_from_str(optarg);
			params->common.buffer_size = get_llong_from_str(optarg);
			break;
		default:
			osnoise_top_usage(params, "Invalid option");
@@ -583,9 +583,9 @@ static void stop_top(int sig)
static void osnoise_top_set_signals(struct osnoise_params *params)
{
	signal(SIGINT, stop_top);
	if (params->duration) {
	if (params->common.duration) {
		signal(SIGALRM, stop_top);
		alarm(params->duration);
		alarm(params->common.duration);
	}
}

@@ -622,16 +622,16 @@ int osnoise_top_main(int argc, char **argv)
		goto out_free;
	}

	if (params->set_sched) {
		retval = set_comm_sched_attr("osnoise/", &params->sched_param);
	if (params->common.set_sched) {
		retval = set_comm_sched_attr("osnoise/", &params->common.sched_param);
		if (retval) {
			err_msg("Failed to set sched parameters\n");
			goto out_free;
		}
	}

	if (params->cgroup) {
		retval = set_comm_cgroup("osnoise/", params->cgroup_name);
	if (params->common.cgroup) {
		retval = set_comm_cgroup("osnoise/", params->common.cgroup_name);
		if (!retval) {
			err_msg("Failed to move threads to cgroup\n");
			goto out_free;
@@ -645,14 +645,14 @@ int osnoise_top_main(int argc, char **argv)
			goto out_free;
		}

		if (params->events) {
			retval = trace_events_enable(&record->trace, params->events);
		if (params->common.events) {
			retval = trace_events_enable(&record->trace, params->common.events);
			if (retval)
				goto out_top;
		}

		if (params->buffer_size > 0) {
			retval = trace_set_buffer_size(&record->trace, params->buffer_size);
		if (params->common.buffer_size > 0) {
			retval = trace_set_buffer_size(&record->trace, params->common.buffer_size);
			if (retval)
				goto out_top;
		}
@@ -669,9 +669,9 @@ int osnoise_top_main(int argc, char **argv)
		trace_instance_start(&record->trace);
	trace_instance_start(trace);

	if (params->warmup > 0) {
		debug_msg("Warming up for %d seconds\n", params->warmup);
		sleep(params->warmup);
	if (params->common.warmup > 0) {
		debug_msg("Warming up for %d seconds\n", params->common.warmup);
		sleep(params->common.warmup);
		if (stop_tracing)
			goto out_top;

@@ -692,7 +692,7 @@ int osnoise_top_main(int argc, char **argv)
	osnoise_top_set_signals(params);

	while (!stop_tracing) {
		sleep(params->sleep_time);
		sleep(params->common.sleep_time);

		retval = tracefs_iterate_raw_events(trace->tep,
						    trace->inst,
@@ -725,8 +725,8 @@ int osnoise_top_main(int argc, char **argv)
	}

out_top:
	trace_events_destroy(&record->trace, params->events);
	params->events = NULL;
	trace_events_destroy(&record->trace, params->common.events);
	params->common.events = NULL;
out_free:
	osnoise_free_top(tool->data);
	osnoise_destroy_tool(record);
Loading