xref: /openbmc/linux/tools/tracing/rtla/src/osnoise.c (revision cdca4f4e)
10605bf00SDaniel Bristot de Oliveira // SPDX-License-Identifier: GPL-2.0
20605bf00SDaniel Bristot de Oliveira /*
30605bf00SDaniel Bristot de Oliveira  * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
40605bf00SDaniel Bristot de Oliveira  */
50605bf00SDaniel Bristot de Oliveira 
60605bf00SDaniel Bristot de Oliveira #include <sys/types.h>
70605bf00SDaniel Bristot de Oliveira #include <sys/stat.h>
80605bf00SDaniel Bristot de Oliveira #include <pthread.h>
90605bf00SDaniel Bristot de Oliveira #include <stdlib.h>
100605bf00SDaniel Bristot de Oliveira #include <string.h>
110605bf00SDaniel Bristot de Oliveira #include <unistd.h>
120605bf00SDaniel Bristot de Oliveira #include <errno.h>
130605bf00SDaniel Bristot de Oliveira #include <fcntl.h>
140605bf00SDaniel Bristot de Oliveira #include <stdio.h>
150605bf00SDaniel Bristot de Oliveira 
160605bf00SDaniel Bristot de Oliveira #include "osnoise.h"
170605bf00SDaniel Bristot de Oliveira #include "utils.h"
180605bf00SDaniel Bristot de Oliveira 
190605bf00SDaniel Bristot de Oliveira /*
200605bf00SDaniel Bristot de Oliveira  * osnoise_get_cpus - return the original "osnoise/cpus" content
210605bf00SDaniel Bristot de Oliveira  *
220605bf00SDaniel Bristot de Oliveira  * It also saves the value to be restored.
230605bf00SDaniel Bristot de Oliveira  */
osnoise_get_cpus(struct osnoise_context * context)240605bf00SDaniel Bristot de Oliveira char *osnoise_get_cpus(struct osnoise_context *context)
250605bf00SDaniel Bristot de Oliveira {
260605bf00SDaniel Bristot de Oliveira 	if (context->curr_cpus)
270605bf00SDaniel Bristot de Oliveira 		return context->curr_cpus;
280605bf00SDaniel Bristot de Oliveira 
290605bf00SDaniel Bristot de Oliveira 	if (context->orig_cpus)
300605bf00SDaniel Bristot de Oliveira 		return context->orig_cpus;
310605bf00SDaniel Bristot de Oliveira 
320605bf00SDaniel Bristot de Oliveira 	context->orig_cpus = tracefs_instance_file_read(NULL, "osnoise/cpus", NULL);
330605bf00SDaniel Bristot de Oliveira 
340605bf00SDaniel Bristot de Oliveira 	/*
350605bf00SDaniel Bristot de Oliveira 	 * The error value (NULL) is the same for tracefs_instance_file_read()
360605bf00SDaniel Bristot de Oliveira 	 * and this functions, so:
370605bf00SDaniel Bristot de Oliveira 	 */
380605bf00SDaniel Bristot de Oliveira 	return context->orig_cpus;
390605bf00SDaniel Bristot de Oliveira }
400605bf00SDaniel Bristot de Oliveira 
410605bf00SDaniel Bristot de Oliveira /*
420605bf00SDaniel Bristot de Oliveira  * osnoise_set_cpus - configure osnoise to run on *cpus
430605bf00SDaniel Bristot de Oliveira  *
440605bf00SDaniel Bristot de Oliveira  * "osnoise/cpus" file is used to set the cpus in which osnoise/timerlat
450605bf00SDaniel Bristot de Oliveira  * will run. This function opens this file, saves the current value,
460605bf00SDaniel Bristot de Oliveira  * and set the cpus passed as argument.
470605bf00SDaniel Bristot de Oliveira  */
osnoise_set_cpus(struct osnoise_context * context,char * cpus)480605bf00SDaniel Bristot de Oliveira int osnoise_set_cpus(struct osnoise_context *context, char *cpus)
490605bf00SDaniel Bristot de Oliveira {
500605bf00SDaniel Bristot de Oliveira 	char *orig_cpus = osnoise_get_cpus(context);
510605bf00SDaniel Bristot de Oliveira 	char buffer[1024];
520605bf00SDaniel Bristot de Oliveira 	int retval;
530605bf00SDaniel Bristot de Oliveira 
540605bf00SDaniel Bristot de Oliveira 	if (!orig_cpus)
550605bf00SDaniel Bristot de Oliveira 		return -1;
560605bf00SDaniel Bristot de Oliveira 
570605bf00SDaniel Bristot de Oliveira 	context->curr_cpus = strdup(cpus);
580605bf00SDaniel Bristot de Oliveira 	if (!context->curr_cpus)
590605bf00SDaniel Bristot de Oliveira 		return -1;
600605bf00SDaniel Bristot de Oliveira 
610605bf00SDaniel Bristot de Oliveira 	snprintf(buffer, 1024, "%s\n", cpus);
620605bf00SDaniel Bristot de Oliveira 
630605bf00SDaniel Bristot de Oliveira 	debug_msg("setting cpus to %s from %s", cpus, context->orig_cpus);
640605bf00SDaniel Bristot de Oliveira 
650605bf00SDaniel Bristot de Oliveira 	retval = tracefs_instance_file_write(NULL, "osnoise/cpus", buffer);
660605bf00SDaniel Bristot de Oliveira 	if (retval < 0) {
670605bf00SDaniel Bristot de Oliveira 		free(context->curr_cpus);
680605bf00SDaniel Bristot de Oliveira 		context->curr_cpus = NULL;
690605bf00SDaniel Bristot de Oliveira 		return -1;
700605bf00SDaniel Bristot de Oliveira 	}
710605bf00SDaniel Bristot de Oliveira 
720605bf00SDaniel Bristot de Oliveira 	return 0;
730605bf00SDaniel Bristot de Oliveira }
740605bf00SDaniel Bristot de Oliveira 
750605bf00SDaniel Bristot de Oliveira /*
760605bf00SDaniel Bristot de Oliveira  * osnoise_restore_cpus - restore the original "osnoise/cpus"
770605bf00SDaniel Bristot de Oliveira  *
780605bf00SDaniel Bristot de Oliveira  * osnoise_set_cpus() saves the original data for the "osnoise/cpus"
790605bf00SDaniel Bristot de Oliveira  * file. This function restore the original config it was previously
800605bf00SDaniel Bristot de Oliveira  * modified.
810605bf00SDaniel Bristot de Oliveira  */
osnoise_restore_cpus(struct osnoise_context * context)820605bf00SDaniel Bristot de Oliveira void osnoise_restore_cpus(struct osnoise_context *context)
830605bf00SDaniel Bristot de Oliveira {
840605bf00SDaniel Bristot de Oliveira 	int retval;
850605bf00SDaniel Bristot de Oliveira 
860605bf00SDaniel Bristot de Oliveira 	if (!context->orig_cpus)
870605bf00SDaniel Bristot de Oliveira 		return;
880605bf00SDaniel Bristot de Oliveira 
890605bf00SDaniel Bristot de Oliveira 	if (!context->curr_cpus)
900605bf00SDaniel Bristot de Oliveira 		return;
910605bf00SDaniel Bristot de Oliveira 
920605bf00SDaniel Bristot de Oliveira 	/* nothing to do? */
930605bf00SDaniel Bristot de Oliveira 	if (!strcmp(context->orig_cpus, context->curr_cpus))
940605bf00SDaniel Bristot de Oliveira 		goto out_done;
950605bf00SDaniel Bristot de Oliveira 
960605bf00SDaniel Bristot de Oliveira 	debug_msg("restoring cpus to %s", context->orig_cpus);
970605bf00SDaniel Bristot de Oliveira 
980605bf00SDaniel Bristot de Oliveira 	retval = tracefs_instance_file_write(NULL, "osnoise/cpus", context->orig_cpus);
990605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
1000605bf00SDaniel Bristot de Oliveira 		err_msg("could not restore original osnoise cpus\n");
1010605bf00SDaniel Bristot de Oliveira 
1020605bf00SDaniel Bristot de Oliveira out_done:
1030605bf00SDaniel Bristot de Oliveira 	free(context->curr_cpus);
1040605bf00SDaniel Bristot de Oliveira 	context->curr_cpus = NULL;
1050605bf00SDaniel Bristot de Oliveira }
1060605bf00SDaniel Bristot de Oliveira 
1070605bf00SDaniel Bristot de Oliveira /*
1080605bf00SDaniel Bristot de Oliveira  * osnoise_put_cpus - restore cpus config and cleanup data
1090605bf00SDaniel Bristot de Oliveira  */
osnoise_put_cpus(struct osnoise_context * context)1100605bf00SDaniel Bristot de Oliveira void osnoise_put_cpus(struct osnoise_context *context)
1110605bf00SDaniel Bristot de Oliveira {
1120605bf00SDaniel Bristot de Oliveira 	osnoise_restore_cpus(context);
1130605bf00SDaniel Bristot de Oliveira 
1140605bf00SDaniel Bristot de Oliveira 	if (!context->orig_cpus)
1150605bf00SDaniel Bristot de Oliveira 		return;
1160605bf00SDaniel Bristot de Oliveira 
1170605bf00SDaniel Bristot de Oliveira 	free(context->orig_cpus);
1180605bf00SDaniel Bristot de Oliveira 	context->orig_cpus = NULL;
1190605bf00SDaniel Bristot de Oliveira }
1200605bf00SDaniel Bristot de Oliveira 
1210605bf00SDaniel Bristot de Oliveira /*
1220605bf00SDaniel Bristot de Oliveira  * osnoise_read_ll_config - read a long long value from a config
1230605bf00SDaniel Bristot de Oliveira  *
1240605bf00SDaniel Bristot de Oliveira  * returns -1 on error.
1250605bf00SDaniel Bristot de Oliveira  */
osnoise_read_ll_config(char * rel_path)1260605bf00SDaniel Bristot de Oliveira static long long osnoise_read_ll_config(char *rel_path)
1270605bf00SDaniel Bristot de Oliveira {
1280605bf00SDaniel Bristot de Oliveira 	long long retval;
1290605bf00SDaniel Bristot de Oliveira 	char *buffer;
1300605bf00SDaniel Bristot de Oliveira 
1310605bf00SDaniel Bristot de Oliveira 	buffer = tracefs_instance_file_read(NULL, rel_path, NULL);
1320605bf00SDaniel Bristot de Oliveira 	if (!buffer)
1330605bf00SDaniel Bristot de Oliveira 		return -1;
1340605bf00SDaniel Bristot de Oliveira 
1350605bf00SDaniel Bristot de Oliveira 	/* get_llong_from_str returns -1 on error */
1360605bf00SDaniel Bristot de Oliveira 	retval = get_llong_from_str(buffer);
1370605bf00SDaniel Bristot de Oliveira 
1380605bf00SDaniel Bristot de Oliveira 	debug_msg("reading %s returned %lld\n", rel_path, retval);
1390605bf00SDaniel Bristot de Oliveira 
1400605bf00SDaniel Bristot de Oliveira 	free(buffer);
1410605bf00SDaniel Bristot de Oliveira 
1420605bf00SDaniel Bristot de Oliveira 	return retval;
1430605bf00SDaniel Bristot de Oliveira }
1440605bf00SDaniel Bristot de Oliveira 
1450605bf00SDaniel Bristot de Oliveira /*
1460605bf00SDaniel Bristot de Oliveira  * osnoise_write_ll_config - write a long long value to a config in rel_path
1470605bf00SDaniel Bristot de Oliveira  *
1480605bf00SDaniel Bristot de Oliveira  * returns -1 on error.
1490605bf00SDaniel Bristot de Oliveira  */
osnoise_write_ll_config(char * rel_path,long long value)1500605bf00SDaniel Bristot de Oliveira static long long osnoise_write_ll_config(char *rel_path, long long value)
1510605bf00SDaniel Bristot de Oliveira {
1520605bf00SDaniel Bristot de Oliveira 	char buffer[BUFF_U64_STR_SIZE];
1530605bf00SDaniel Bristot de Oliveira 	long long retval;
1540605bf00SDaniel Bristot de Oliveira 
1550605bf00SDaniel Bristot de Oliveira 	snprintf(buffer, sizeof(buffer), "%lld\n", value);
1560605bf00SDaniel Bristot de Oliveira 
1570605bf00SDaniel Bristot de Oliveira 	debug_msg("setting %s to %lld\n", rel_path, value);
1580605bf00SDaniel Bristot de Oliveira 
1590605bf00SDaniel Bristot de Oliveira 	retval = tracefs_instance_file_write(NULL, rel_path, buffer);
1600605bf00SDaniel Bristot de Oliveira 	return retval;
1610605bf00SDaniel Bristot de Oliveira }
1620605bf00SDaniel Bristot de Oliveira 
1630605bf00SDaniel Bristot de Oliveira /*
1640605bf00SDaniel Bristot de Oliveira  * osnoise_get_runtime - return the original "osnoise/runtime_us" value
1650605bf00SDaniel Bristot de Oliveira  *
1660605bf00SDaniel Bristot de Oliveira  * It also saves the value to be restored.
1670605bf00SDaniel Bristot de Oliveira  */
osnoise_get_runtime(struct osnoise_context * context)1680605bf00SDaniel Bristot de Oliveira unsigned long long osnoise_get_runtime(struct osnoise_context *context)
1690605bf00SDaniel Bristot de Oliveira {
1700605bf00SDaniel Bristot de Oliveira 	long long runtime_us;
1710605bf00SDaniel Bristot de Oliveira 
1720605bf00SDaniel Bristot de Oliveira 	if (context->runtime_us != OSNOISE_TIME_INIT_VAL)
1730605bf00SDaniel Bristot de Oliveira 		return context->runtime_us;
1740605bf00SDaniel Bristot de Oliveira 
1750605bf00SDaniel Bristot de Oliveira 	if (context->orig_runtime_us != OSNOISE_TIME_INIT_VAL)
1760605bf00SDaniel Bristot de Oliveira 		return context->orig_runtime_us;
1770605bf00SDaniel Bristot de Oliveira 
1780605bf00SDaniel Bristot de Oliveira 	runtime_us = osnoise_read_ll_config("osnoise/runtime_us");
1790605bf00SDaniel Bristot de Oliveira 	if (runtime_us < 0)
1800605bf00SDaniel Bristot de Oliveira 		goto out_err;
1810605bf00SDaniel Bristot de Oliveira 
1820605bf00SDaniel Bristot de Oliveira 	context->orig_runtime_us = runtime_us;
1830605bf00SDaniel Bristot de Oliveira 	return runtime_us;
1840605bf00SDaniel Bristot de Oliveira 
1850605bf00SDaniel Bristot de Oliveira out_err:
1860605bf00SDaniel Bristot de Oliveira 	return OSNOISE_TIME_INIT_VAL;
1870605bf00SDaniel Bristot de Oliveira }
1880605bf00SDaniel Bristot de Oliveira 
1890605bf00SDaniel Bristot de Oliveira /*
1900605bf00SDaniel Bristot de Oliveira  * osnoise_get_period - return the original "osnoise/period_us" value
1910605bf00SDaniel Bristot de Oliveira  *
1920605bf00SDaniel Bristot de Oliveira  * It also saves the value to be restored.
1930605bf00SDaniel Bristot de Oliveira  */
osnoise_get_period(struct osnoise_context * context)1940605bf00SDaniel Bristot de Oliveira unsigned long long osnoise_get_period(struct osnoise_context *context)
1950605bf00SDaniel Bristot de Oliveira {
1960605bf00SDaniel Bristot de Oliveira 	long long period_us;
1970605bf00SDaniel Bristot de Oliveira 
1980605bf00SDaniel Bristot de Oliveira 	if (context->period_us != OSNOISE_TIME_INIT_VAL)
1990605bf00SDaniel Bristot de Oliveira 		return context->period_us;
2000605bf00SDaniel Bristot de Oliveira 
2010605bf00SDaniel Bristot de Oliveira 	if (context->orig_period_us != OSNOISE_TIME_INIT_VAL)
2020605bf00SDaniel Bristot de Oliveira 		return context->orig_period_us;
2030605bf00SDaniel Bristot de Oliveira 
2040605bf00SDaniel Bristot de Oliveira 	period_us = osnoise_read_ll_config("osnoise/period_us");
2050605bf00SDaniel Bristot de Oliveira 	if (period_us < 0)
2060605bf00SDaniel Bristot de Oliveira 		goto out_err;
2070605bf00SDaniel Bristot de Oliveira 
2080605bf00SDaniel Bristot de Oliveira 	context->orig_period_us = period_us;
2090605bf00SDaniel Bristot de Oliveira 	return period_us;
2100605bf00SDaniel Bristot de Oliveira 
2110605bf00SDaniel Bristot de Oliveira out_err:
2120605bf00SDaniel Bristot de Oliveira 	return OSNOISE_TIME_INIT_VAL;
2130605bf00SDaniel Bristot de Oliveira }
2140605bf00SDaniel Bristot de Oliveira 
__osnoise_write_runtime(struct osnoise_context * context,unsigned long long runtime)2150605bf00SDaniel Bristot de Oliveira static int __osnoise_write_runtime(struct osnoise_context *context,
2160605bf00SDaniel Bristot de Oliveira 				   unsigned long long runtime)
2170605bf00SDaniel Bristot de Oliveira {
2180605bf00SDaniel Bristot de Oliveira 	int retval;
2190605bf00SDaniel Bristot de Oliveira 
2200605bf00SDaniel Bristot de Oliveira 	if (context->orig_runtime_us == OSNOISE_TIME_INIT_VAL)
2210605bf00SDaniel Bristot de Oliveira 		return -1;
2220605bf00SDaniel Bristot de Oliveira 
2230605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/runtime_us", runtime);
2240605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
2250605bf00SDaniel Bristot de Oliveira 		return -1;
2260605bf00SDaniel Bristot de Oliveira 
2270605bf00SDaniel Bristot de Oliveira 	context->runtime_us = runtime;
2280605bf00SDaniel Bristot de Oliveira 	return 0;
2290605bf00SDaniel Bristot de Oliveira }
2300605bf00SDaniel Bristot de Oliveira 
__osnoise_write_period(struct osnoise_context * context,unsigned long long period)2310605bf00SDaniel Bristot de Oliveira static int __osnoise_write_period(struct osnoise_context *context,
2320605bf00SDaniel Bristot de Oliveira 				  unsigned long long period)
2330605bf00SDaniel Bristot de Oliveira {
2340605bf00SDaniel Bristot de Oliveira 	int retval;
2350605bf00SDaniel Bristot de Oliveira 
2360605bf00SDaniel Bristot de Oliveira 	if (context->orig_period_us == OSNOISE_TIME_INIT_VAL)
2370605bf00SDaniel Bristot de Oliveira 		return -1;
2380605bf00SDaniel Bristot de Oliveira 
2390605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/period_us", period);
2400605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
2410605bf00SDaniel Bristot de Oliveira 		return -1;
2420605bf00SDaniel Bristot de Oliveira 
2430605bf00SDaniel Bristot de Oliveira 	context->period_us = period;
2440605bf00SDaniel Bristot de Oliveira 	return 0;
2450605bf00SDaniel Bristot de Oliveira }
2460605bf00SDaniel Bristot de Oliveira 
2470605bf00SDaniel Bristot de Oliveira /*
2480605bf00SDaniel Bristot de Oliveira  * osnoise_set_runtime_period - set osnoise runtime and period
2490605bf00SDaniel Bristot de Oliveira  *
2500605bf00SDaniel Bristot de Oliveira  * Osnoise's runtime and period are related as runtime <= period.
2510605bf00SDaniel Bristot de Oliveira  * Thus, this function saves the original values, and then tries
2520605bf00SDaniel Bristot de Oliveira  * to set the runtime and period if they are != 0.
2530605bf00SDaniel Bristot de Oliveira  */
osnoise_set_runtime_period(struct osnoise_context * context,unsigned long long runtime,unsigned long long period)2540605bf00SDaniel Bristot de Oliveira int osnoise_set_runtime_period(struct osnoise_context *context,
2550605bf00SDaniel Bristot de Oliveira 			       unsigned long long runtime,
2560605bf00SDaniel Bristot de Oliveira 			       unsigned long long period)
2570605bf00SDaniel Bristot de Oliveira {
2580605bf00SDaniel Bristot de Oliveira 	unsigned long long curr_runtime_us;
2590605bf00SDaniel Bristot de Oliveira 	unsigned long long curr_period_us;
2600605bf00SDaniel Bristot de Oliveira 	int retval;
2610605bf00SDaniel Bristot de Oliveira 
2620605bf00SDaniel Bristot de Oliveira 	if (!period && !runtime)
2630605bf00SDaniel Bristot de Oliveira 		return 0;
2640605bf00SDaniel Bristot de Oliveira 
2650605bf00SDaniel Bristot de Oliveira 	curr_runtime_us = osnoise_get_runtime(context);
2660605bf00SDaniel Bristot de Oliveira 	curr_period_us = osnoise_get_period(context);
2670605bf00SDaniel Bristot de Oliveira 
2680605bf00SDaniel Bristot de Oliveira 	/* error getting any value? */
2690605bf00SDaniel Bristot de Oliveira 	if (curr_period_us == OSNOISE_TIME_INIT_VAL || curr_runtime_us == OSNOISE_TIME_INIT_VAL)
2700605bf00SDaniel Bristot de Oliveira 		return -1;
2710605bf00SDaniel Bristot de Oliveira 
2720605bf00SDaniel Bristot de Oliveira 	if (!period) {
2730605bf00SDaniel Bristot de Oliveira 		if (runtime > curr_period_us)
2740605bf00SDaniel Bristot de Oliveira 			return -1;
2750605bf00SDaniel Bristot de Oliveira 		return __osnoise_write_runtime(context, runtime);
2760605bf00SDaniel Bristot de Oliveira 	} else if (!runtime) {
2770605bf00SDaniel Bristot de Oliveira 		if (period < curr_runtime_us)
2780605bf00SDaniel Bristot de Oliveira 			return -1;
2790605bf00SDaniel Bristot de Oliveira 		return __osnoise_write_period(context, period);
2800605bf00SDaniel Bristot de Oliveira 	}
2810605bf00SDaniel Bristot de Oliveira 
2820605bf00SDaniel Bristot de Oliveira 	if (runtime > curr_period_us) {
2830605bf00SDaniel Bristot de Oliveira 		retval = __osnoise_write_period(context, period);
2840605bf00SDaniel Bristot de Oliveira 		if (retval)
2850605bf00SDaniel Bristot de Oliveira 			return -1;
2860605bf00SDaniel Bristot de Oliveira 		retval = __osnoise_write_runtime(context, runtime);
2870605bf00SDaniel Bristot de Oliveira 		if (retval)
2880605bf00SDaniel Bristot de Oliveira 			return -1;
2890605bf00SDaniel Bristot de Oliveira 	} else {
2900605bf00SDaniel Bristot de Oliveira 		retval = __osnoise_write_runtime(context, runtime);
2910605bf00SDaniel Bristot de Oliveira 		if (retval)
2920605bf00SDaniel Bristot de Oliveira 			return -1;
2930605bf00SDaniel Bristot de Oliveira 		retval = __osnoise_write_period(context, period);
2940605bf00SDaniel Bristot de Oliveira 		if (retval)
2950605bf00SDaniel Bristot de Oliveira 			return -1;
2960605bf00SDaniel Bristot de Oliveira 	}
2970605bf00SDaniel Bristot de Oliveira 
2980605bf00SDaniel Bristot de Oliveira 	return 0;
2990605bf00SDaniel Bristot de Oliveira }
3000605bf00SDaniel Bristot de Oliveira 
3010605bf00SDaniel Bristot de Oliveira /*
3020605bf00SDaniel Bristot de Oliveira  * osnoise_restore_runtime_period - restore the original runtime and period
3030605bf00SDaniel Bristot de Oliveira  */
osnoise_restore_runtime_period(struct osnoise_context * context)3040605bf00SDaniel Bristot de Oliveira void osnoise_restore_runtime_period(struct osnoise_context *context)
3050605bf00SDaniel Bristot de Oliveira {
3060605bf00SDaniel Bristot de Oliveira 	unsigned long long orig_runtime = context->orig_runtime_us;
3070605bf00SDaniel Bristot de Oliveira 	unsigned long long orig_period = context->orig_period_us;
3080605bf00SDaniel Bristot de Oliveira 	unsigned long long curr_runtime = context->runtime_us;
3090605bf00SDaniel Bristot de Oliveira 	unsigned long long curr_period = context->period_us;
3100605bf00SDaniel Bristot de Oliveira 	int retval;
3110605bf00SDaniel Bristot de Oliveira 
3120605bf00SDaniel Bristot de Oliveira 	if ((orig_runtime == OSNOISE_TIME_INIT_VAL) && (orig_period == OSNOISE_TIME_INIT_VAL))
3130605bf00SDaniel Bristot de Oliveira 		return;
3140605bf00SDaniel Bristot de Oliveira 
3150605bf00SDaniel Bristot de Oliveira 	if ((orig_period == curr_period) && (orig_runtime == curr_runtime))
3160605bf00SDaniel Bristot de Oliveira 		goto out_done;
3170605bf00SDaniel Bristot de Oliveira 
3180605bf00SDaniel Bristot de Oliveira 	retval = osnoise_set_runtime_period(context, orig_runtime, orig_period);
3190605bf00SDaniel Bristot de Oliveira 	if (retval)
3200605bf00SDaniel Bristot de Oliveira 		err_msg("Could not restore original osnoise runtime/period\n");
3210605bf00SDaniel Bristot de Oliveira 
3220605bf00SDaniel Bristot de Oliveira out_done:
3230605bf00SDaniel Bristot de Oliveira 	context->runtime_us = OSNOISE_TIME_INIT_VAL;
3240605bf00SDaniel Bristot de Oliveira 	context->period_us = OSNOISE_TIME_INIT_VAL;
3250605bf00SDaniel Bristot de Oliveira }
3260605bf00SDaniel Bristot de Oliveira 
3270605bf00SDaniel Bristot de Oliveira /*
3280605bf00SDaniel Bristot de Oliveira  * osnoise_put_runtime_period - restore original values and cleanup data
3290605bf00SDaniel Bristot de Oliveira  */
osnoise_put_runtime_period(struct osnoise_context * context)3300605bf00SDaniel Bristot de Oliveira void osnoise_put_runtime_period(struct osnoise_context *context)
3310605bf00SDaniel Bristot de Oliveira {
3320605bf00SDaniel Bristot de Oliveira 	osnoise_restore_runtime_period(context);
3330605bf00SDaniel Bristot de Oliveira 
3340605bf00SDaniel Bristot de Oliveira 	if (context->orig_runtime_us != OSNOISE_TIME_INIT_VAL)
3350605bf00SDaniel Bristot de Oliveira 		context->orig_runtime_us = OSNOISE_TIME_INIT_VAL;
3360605bf00SDaniel Bristot de Oliveira 
3370605bf00SDaniel Bristot de Oliveira 	if (context->orig_period_us != OSNOISE_TIME_INIT_VAL)
3380605bf00SDaniel Bristot de Oliveira 		context->orig_period_us = OSNOISE_TIME_INIT_VAL;
3390605bf00SDaniel Bristot de Oliveira }
3400605bf00SDaniel Bristot de Oliveira 
3410605bf00SDaniel Bristot de Oliveira /*
3420605bf00SDaniel Bristot de Oliveira  * osnoise_get_timerlat_period_us - read and save the original "timerlat_period_us"
3430605bf00SDaniel Bristot de Oliveira  */
3440605bf00SDaniel Bristot de Oliveira static long long
osnoise_get_timerlat_period_us(struct osnoise_context * context)3450605bf00SDaniel Bristot de Oliveira osnoise_get_timerlat_period_us(struct osnoise_context *context)
3460605bf00SDaniel Bristot de Oliveira {
3470605bf00SDaniel Bristot de Oliveira 	long long timerlat_period_us;
3480605bf00SDaniel Bristot de Oliveira 
3490605bf00SDaniel Bristot de Oliveira 	if (context->timerlat_period_us != OSNOISE_TIME_INIT_VAL)
3500605bf00SDaniel Bristot de Oliveira 		return context->timerlat_period_us;
3510605bf00SDaniel Bristot de Oliveira 
3520605bf00SDaniel Bristot de Oliveira 	if (context->orig_timerlat_period_us != OSNOISE_TIME_INIT_VAL)
3530605bf00SDaniel Bristot de Oliveira 		return context->orig_timerlat_period_us;
3540605bf00SDaniel Bristot de Oliveira 
3550605bf00SDaniel Bristot de Oliveira 	timerlat_period_us = osnoise_read_ll_config("osnoise/timerlat_period_us");
3560605bf00SDaniel Bristot de Oliveira 	if (timerlat_period_us < 0)
3570605bf00SDaniel Bristot de Oliveira 		goto out_err;
3580605bf00SDaniel Bristot de Oliveira 
3590605bf00SDaniel Bristot de Oliveira 	context->orig_timerlat_period_us = timerlat_period_us;
3600605bf00SDaniel Bristot de Oliveira 	return timerlat_period_us;
3610605bf00SDaniel Bristot de Oliveira 
3620605bf00SDaniel Bristot de Oliveira out_err:
3630605bf00SDaniel Bristot de Oliveira 	return OSNOISE_TIME_INIT_VAL;
3640605bf00SDaniel Bristot de Oliveira }
3650605bf00SDaniel Bristot de Oliveira 
3660605bf00SDaniel Bristot de Oliveira /*
3670605bf00SDaniel Bristot de Oliveira  * osnoise_set_timerlat_period_us - set "timerlat_period_us"
3680605bf00SDaniel Bristot de Oliveira  */
osnoise_set_timerlat_period_us(struct osnoise_context * context,long long timerlat_period_us)3690605bf00SDaniel Bristot de Oliveira int osnoise_set_timerlat_period_us(struct osnoise_context *context, long long timerlat_period_us)
3700605bf00SDaniel Bristot de Oliveira {
3710605bf00SDaniel Bristot de Oliveira 	long long curr_timerlat_period_us = osnoise_get_timerlat_period_us(context);
3720605bf00SDaniel Bristot de Oliveira 	int retval;
3730605bf00SDaniel Bristot de Oliveira 
3740605bf00SDaniel Bristot de Oliveira 	if (curr_timerlat_period_us == OSNOISE_TIME_INIT_VAL)
3750605bf00SDaniel Bristot de Oliveira 		return -1;
3760605bf00SDaniel Bristot de Oliveira 
3770605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/timerlat_period_us", timerlat_period_us);
3780605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
3790605bf00SDaniel Bristot de Oliveira 		return -1;
3800605bf00SDaniel Bristot de Oliveira 
3810605bf00SDaniel Bristot de Oliveira 	context->timerlat_period_us = timerlat_period_us;
3820605bf00SDaniel Bristot de Oliveira 
3830605bf00SDaniel Bristot de Oliveira 	return 0;
3840605bf00SDaniel Bristot de Oliveira }
3850605bf00SDaniel Bristot de Oliveira 
3860605bf00SDaniel Bristot de Oliveira /*
3870605bf00SDaniel Bristot de Oliveira  * osnoise_restore_timerlat_period_us - restore "timerlat_period_us"
3880605bf00SDaniel Bristot de Oliveira  */
osnoise_restore_timerlat_period_us(struct osnoise_context * context)3890605bf00SDaniel Bristot de Oliveira void osnoise_restore_timerlat_period_us(struct osnoise_context *context)
3900605bf00SDaniel Bristot de Oliveira {
3910605bf00SDaniel Bristot de Oliveira 	int retval;
3920605bf00SDaniel Bristot de Oliveira 
3930605bf00SDaniel Bristot de Oliveira 	if (context->orig_timerlat_period_us == OSNOISE_TIME_INIT_VAL)
3940605bf00SDaniel Bristot de Oliveira 		return;
3950605bf00SDaniel Bristot de Oliveira 
3960605bf00SDaniel Bristot de Oliveira 	if (context->orig_timerlat_period_us == context->timerlat_period_us)
3970605bf00SDaniel Bristot de Oliveira 		goto out_done;
3980605bf00SDaniel Bristot de Oliveira 
3990605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/timerlat_period_us", context->orig_timerlat_period_us);
4000605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
4010605bf00SDaniel Bristot de Oliveira 		err_msg("Could not restore original osnoise timerlat_period_us\n");
4020605bf00SDaniel Bristot de Oliveira 
4030605bf00SDaniel Bristot de Oliveira out_done:
4040605bf00SDaniel Bristot de Oliveira 	context->timerlat_period_us = OSNOISE_TIME_INIT_VAL;
4050605bf00SDaniel Bristot de Oliveira }
4060605bf00SDaniel Bristot de Oliveira 
4070605bf00SDaniel Bristot de Oliveira /*
4080605bf00SDaniel Bristot de Oliveira  * osnoise_put_timerlat_period_us - restore original values and cleanup data
4090605bf00SDaniel Bristot de Oliveira  */
osnoise_put_timerlat_period_us(struct osnoise_context * context)4100605bf00SDaniel Bristot de Oliveira void osnoise_put_timerlat_period_us(struct osnoise_context *context)
4110605bf00SDaniel Bristot de Oliveira {
4120605bf00SDaniel Bristot de Oliveira 	osnoise_restore_timerlat_period_us(context);
4130605bf00SDaniel Bristot de Oliveira 
4140605bf00SDaniel Bristot de Oliveira 	if (context->orig_timerlat_period_us == OSNOISE_TIME_INIT_VAL)
4150605bf00SDaniel Bristot de Oliveira 		return;
4160605bf00SDaniel Bristot de Oliveira 
4170605bf00SDaniel Bristot de Oliveira 	context->orig_timerlat_period_us = OSNOISE_TIME_INIT_VAL;
4180605bf00SDaniel Bristot de Oliveira }
4190605bf00SDaniel Bristot de Oliveira 
4200605bf00SDaniel Bristot de Oliveira /*
4210605bf00SDaniel Bristot de Oliveira  * osnoise_get_stop_us - read and save the original "stop_tracing_us"
4220605bf00SDaniel Bristot de Oliveira  */
4230605bf00SDaniel Bristot de Oliveira static long long
osnoise_get_stop_us(struct osnoise_context * context)4240605bf00SDaniel Bristot de Oliveira osnoise_get_stop_us(struct osnoise_context *context)
4250605bf00SDaniel Bristot de Oliveira {
4260605bf00SDaniel Bristot de Oliveira 	long long stop_us;
4270605bf00SDaniel Bristot de Oliveira 
4280605bf00SDaniel Bristot de Oliveira 	if (context->stop_us != OSNOISE_OPTION_INIT_VAL)
4290605bf00SDaniel Bristot de Oliveira 		return context->stop_us;
4300605bf00SDaniel Bristot de Oliveira 
4310605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_us != OSNOISE_OPTION_INIT_VAL)
4320605bf00SDaniel Bristot de Oliveira 		return context->orig_stop_us;
4330605bf00SDaniel Bristot de Oliveira 
4340605bf00SDaniel Bristot de Oliveira 	stop_us = osnoise_read_ll_config("osnoise/stop_tracing_us");
4350605bf00SDaniel Bristot de Oliveira 	if (stop_us < 0)
4360605bf00SDaniel Bristot de Oliveira 		goto out_err;
4370605bf00SDaniel Bristot de Oliveira 
4380605bf00SDaniel Bristot de Oliveira 	context->orig_stop_us = stop_us;
4390605bf00SDaniel Bristot de Oliveira 	return stop_us;
4400605bf00SDaniel Bristot de Oliveira 
4410605bf00SDaniel Bristot de Oliveira out_err:
4420605bf00SDaniel Bristot de Oliveira 	return OSNOISE_OPTION_INIT_VAL;
4430605bf00SDaniel Bristot de Oliveira }
4440605bf00SDaniel Bristot de Oliveira 
4450605bf00SDaniel Bristot de Oliveira /*
4460605bf00SDaniel Bristot de Oliveira  * osnoise_set_stop_us - set "stop_tracing_us"
4470605bf00SDaniel Bristot de Oliveira  */
osnoise_set_stop_us(struct osnoise_context * context,long long stop_us)4480605bf00SDaniel Bristot de Oliveira int osnoise_set_stop_us(struct osnoise_context *context, long long stop_us)
4490605bf00SDaniel Bristot de Oliveira {
4500605bf00SDaniel Bristot de Oliveira 	long long curr_stop_us = osnoise_get_stop_us(context);
4510605bf00SDaniel Bristot de Oliveira 	int retval;
4520605bf00SDaniel Bristot de Oliveira 
4530605bf00SDaniel Bristot de Oliveira 	if (curr_stop_us == OSNOISE_OPTION_INIT_VAL)
4540605bf00SDaniel Bristot de Oliveira 		return -1;
4550605bf00SDaniel Bristot de Oliveira 
4560605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/stop_tracing_us", stop_us);
4570605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
4580605bf00SDaniel Bristot de Oliveira 		return -1;
4590605bf00SDaniel Bristot de Oliveira 
4600605bf00SDaniel Bristot de Oliveira 	context->stop_us = stop_us;
4610605bf00SDaniel Bristot de Oliveira 
4620605bf00SDaniel Bristot de Oliveira 	return 0;
4630605bf00SDaniel Bristot de Oliveira }
4640605bf00SDaniel Bristot de Oliveira 
4650605bf00SDaniel Bristot de Oliveira /*
4660605bf00SDaniel Bristot de Oliveira  * osnoise_restore_stop_us - restore the original "stop_tracing_us"
4670605bf00SDaniel Bristot de Oliveira  */
osnoise_restore_stop_us(struct osnoise_context * context)4680605bf00SDaniel Bristot de Oliveira void osnoise_restore_stop_us(struct osnoise_context *context)
4690605bf00SDaniel Bristot de Oliveira {
4700605bf00SDaniel Bristot de Oliveira 	int retval;
4710605bf00SDaniel Bristot de Oliveira 
4720605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_us == OSNOISE_OPTION_INIT_VAL)
4730605bf00SDaniel Bristot de Oliveira 		return;
4740605bf00SDaniel Bristot de Oliveira 
4750605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_us == context->stop_us)
4760605bf00SDaniel Bristot de Oliveira 		goto out_done;
4770605bf00SDaniel Bristot de Oliveira 
4780605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/stop_tracing_us", context->orig_stop_us);
4790605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
4800605bf00SDaniel Bristot de Oliveira 		err_msg("Could not restore original osnoise stop_us\n");
4810605bf00SDaniel Bristot de Oliveira 
4820605bf00SDaniel Bristot de Oliveira out_done:
4830605bf00SDaniel Bristot de Oliveira 	context->stop_us = OSNOISE_OPTION_INIT_VAL;
4840605bf00SDaniel Bristot de Oliveira }
4850605bf00SDaniel Bristot de Oliveira 
4860605bf00SDaniel Bristot de Oliveira /*
4870605bf00SDaniel Bristot de Oliveira  * osnoise_put_stop_us - restore original values and cleanup data
4880605bf00SDaniel Bristot de Oliveira  */
osnoise_put_stop_us(struct osnoise_context * context)4890605bf00SDaniel Bristot de Oliveira void osnoise_put_stop_us(struct osnoise_context *context)
4900605bf00SDaniel Bristot de Oliveira {
4910605bf00SDaniel Bristot de Oliveira 	osnoise_restore_stop_us(context);
4920605bf00SDaniel Bristot de Oliveira 
4930605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_us == OSNOISE_OPTION_INIT_VAL)
4940605bf00SDaniel Bristot de Oliveira 		return;
4950605bf00SDaniel Bristot de Oliveira 
4960605bf00SDaniel Bristot de Oliveira 	context->orig_stop_us = OSNOISE_OPTION_INIT_VAL;
4970605bf00SDaniel Bristot de Oliveira }
4980605bf00SDaniel Bristot de Oliveira 
4990605bf00SDaniel Bristot de Oliveira /*
5000605bf00SDaniel Bristot de Oliveira  * osnoise_get_stop_total_us - read and save the original "stop_tracing_total_us"
5010605bf00SDaniel Bristot de Oliveira  */
5020605bf00SDaniel Bristot de Oliveira static long long
osnoise_get_stop_total_us(struct osnoise_context * context)5030605bf00SDaniel Bristot de Oliveira osnoise_get_stop_total_us(struct osnoise_context *context)
5040605bf00SDaniel Bristot de Oliveira {
5050605bf00SDaniel Bristot de Oliveira 	long long stop_total_us;
5060605bf00SDaniel Bristot de Oliveira 
5070605bf00SDaniel Bristot de Oliveira 	if (context->stop_total_us != OSNOISE_OPTION_INIT_VAL)
5080605bf00SDaniel Bristot de Oliveira 		return context->stop_total_us;
5090605bf00SDaniel Bristot de Oliveira 
5100605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_total_us != OSNOISE_OPTION_INIT_VAL)
5110605bf00SDaniel Bristot de Oliveira 		return context->orig_stop_total_us;
5120605bf00SDaniel Bristot de Oliveira 
5130605bf00SDaniel Bristot de Oliveira 	stop_total_us = osnoise_read_ll_config("osnoise/stop_tracing_total_us");
5140605bf00SDaniel Bristot de Oliveira 	if (stop_total_us < 0)
5150605bf00SDaniel Bristot de Oliveira 		goto out_err;
5160605bf00SDaniel Bristot de Oliveira 
5170605bf00SDaniel Bristot de Oliveira 	context->orig_stop_total_us = stop_total_us;
5180605bf00SDaniel Bristot de Oliveira 	return stop_total_us;
5190605bf00SDaniel Bristot de Oliveira 
5200605bf00SDaniel Bristot de Oliveira out_err:
5210605bf00SDaniel Bristot de Oliveira 	return OSNOISE_OPTION_INIT_VAL;
5220605bf00SDaniel Bristot de Oliveira }
5230605bf00SDaniel Bristot de Oliveira 
5240605bf00SDaniel Bristot de Oliveira /*
5250605bf00SDaniel Bristot de Oliveira  * osnoise_set_stop_total_us - set "stop_tracing_total_us"
5260605bf00SDaniel Bristot de Oliveira  */
osnoise_set_stop_total_us(struct osnoise_context * context,long long stop_total_us)5270605bf00SDaniel Bristot de Oliveira int osnoise_set_stop_total_us(struct osnoise_context *context, long long stop_total_us)
5280605bf00SDaniel Bristot de Oliveira {
5290605bf00SDaniel Bristot de Oliveira 	long long curr_stop_total_us = osnoise_get_stop_total_us(context);
5300605bf00SDaniel Bristot de Oliveira 	int retval;
5310605bf00SDaniel Bristot de Oliveira 
5320605bf00SDaniel Bristot de Oliveira 	if (curr_stop_total_us == OSNOISE_OPTION_INIT_VAL)
5330605bf00SDaniel Bristot de Oliveira 		return -1;
5340605bf00SDaniel Bristot de Oliveira 
5350605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/stop_tracing_total_us", stop_total_us);
5360605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
5370605bf00SDaniel Bristot de Oliveira 		return -1;
5380605bf00SDaniel Bristot de Oliveira 
5390605bf00SDaniel Bristot de Oliveira 	context->stop_total_us = stop_total_us;
5400605bf00SDaniel Bristot de Oliveira 
5410605bf00SDaniel Bristot de Oliveira 	return 0;
5420605bf00SDaniel Bristot de Oliveira }
5430605bf00SDaniel Bristot de Oliveira 
5440605bf00SDaniel Bristot de Oliveira /*
5450605bf00SDaniel Bristot de Oliveira  * osnoise_restore_stop_total_us - restore the original "stop_tracing_total_us"
5460605bf00SDaniel Bristot de Oliveira  */
osnoise_restore_stop_total_us(struct osnoise_context * context)5470605bf00SDaniel Bristot de Oliveira void osnoise_restore_stop_total_us(struct osnoise_context *context)
5480605bf00SDaniel Bristot de Oliveira {
5490605bf00SDaniel Bristot de Oliveira 	int retval;
5500605bf00SDaniel Bristot de Oliveira 
5510605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_total_us == OSNOISE_OPTION_INIT_VAL)
5520605bf00SDaniel Bristot de Oliveira 		return;
5530605bf00SDaniel Bristot de Oliveira 
5540605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_total_us == context->stop_total_us)
5550605bf00SDaniel Bristot de Oliveira 		goto out_done;
5560605bf00SDaniel Bristot de Oliveira 
5570605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/stop_tracing_total_us",
5580605bf00SDaniel Bristot de Oliveira 			context->orig_stop_total_us);
5590605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
5600605bf00SDaniel Bristot de Oliveira 		err_msg("Could not restore original osnoise stop_total_us\n");
5610605bf00SDaniel Bristot de Oliveira 
5620605bf00SDaniel Bristot de Oliveira out_done:
5630605bf00SDaniel Bristot de Oliveira 	context->stop_total_us = OSNOISE_OPTION_INIT_VAL;
5640605bf00SDaniel Bristot de Oliveira }
5650605bf00SDaniel Bristot de Oliveira 
5660605bf00SDaniel Bristot de Oliveira /*
5670605bf00SDaniel Bristot de Oliveira  * osnoise_put_stop_total_us - restore original values and cleanup data
5680605bf00SDaniel Bristot de Oliveira  */
osnoise_put_stop_total_us(struct osnoise_context * context)5690605bf00SDaniel Bristot de Oliveira void osnoise_put_stop_total_us(struct osnoise_context *context)
5700605bf00SDaniel Bristot de Oliveira {
5710605bf00SDaniel Bristot de Oliveira 	osnoise_restore_stop_total_us(context);
5720605bf00SDaniel Bristot de Oliveira 
5730605bf00SDaniel Bristot de Oliveira 	if (context->orig_stop_total_us == OSNOISE_OPTION_INIT_VAL)
5740605bf00SDaniel Bristot de Oliveira 		return;
5750605bf00SDaniel Bristot de Oliveira 
5760605bf00SDaniel Bristot de Oliveira 	context->orig_stop_total_us = OSNOISE_OPTION_INIT_VAL;
5770605bf00SDaniel Bristot de Oliveira }
5780605bf00SDaniel Bristot de Oliveira 
5790605bf00SDaniel Bristot de Oliveira /*
5800605bf00SDaniel Bristot de Oliveira  * osnoise_get_print_stack - read and save the original "print_stack"
5810605bf00SDaniel Bristot de Oliveira  */
5820605bf00SDaniel Bristot de Oliveira static long long
osnoise_get_print_stack(struct osnoise_context * context)5830605bf00SDaniel Bristot de Oliveira osnoise_get_print_stack(struct osnoise_context *context)
5840605bf00SDaniel Bristot de Oliveira {
5850605bf00SDaniel Bristot de Oliveira 	long long print_stack;
5860605bf00SDaniel Bristot de Oliveira 
5870605bf00SDaniel Bristot de Oliveira 	if (context->print_stack != OSNOISE_OPTION_INIT_VAL)
5880605bf00SDaniel Bristot de Oliveira 		return context->print_stack;
5890605bf00SDaniel Bristot de Oliveira 
5900605bf00SDaniel Bristot de Oliveira 	if (context->orig_print_stack != OSNOISE_OPTION_INIT_VAL)
5910605bf00SDaniel Bristot de Oliveira 		return context->orig_print_stack;
5920605bf00SDaniel Bristot de Oliveira 
5930605bf00SDaniel Bristot de Oliveira 	print_stack = osnoise_read_ll_config("osnoise/print_stack");
5940605bf00SDaniel Bristot de Oliveira 	if (print_stack < 0)
5950605bf00SDaniel Bristot de Oliveira 		goto out_err;
5960605bf00SDaniel Bristot de Oliveira 
5970605bf00SDaniel Bristot de Oliveira 	context->orig_print_stack = print_stack;
5980605bf00SDaniel Bristot de Oliveira 	return print_stack;
5990605bf00SDaniel Bristot de Oliveira 
6000605bf00SDaniel Bristot de Oliveira out_err:
6010605bf00SDaniel Bristot de Oliveira 	return OSNOISE_OPTION_INIT_VAL;
6020605bf00SDaniel Bristot de Oliveira }
6030605bf00SDaniel Bristot de Oliveira 
6040605bf00SDaniel Bristot de Oliveira /*
6050605bf00SDaniel Bristot de Oliveira  * osnoise_set_print_stack - set "print_stack"
6060605bf00SDaniel Bristot de Oliveira  */
osnoise_set_print_stack(struct osnoise_context * context,long long print_stack)6070605bf00SDaniel Bristot de Oliveira int osnoise_set_print_stack(struct osnoise_context *context, long long print_stack)
6080605bf00SDaniel Bristot de Oliveira {
6090605bf00SDaniel Bristot de Oliveira 	long long curr_print_stack = osnoise_get_print_stack(context);
6100605bf00SDaniel Bristot de Oliveira 	int retval;
6110605bf00SDaniel Bristot de Oliveira 
6120605bf00SDaniel Bristot de Oliveira 	if (curr_print_stack == OSNOISE_OPTION_INIT_VAL)
6130605bf00SDaniel Bristot de Oliveira 		return -1;
6140605bf00SDaniel Bristot de Oliveira 
6150605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/print_stack", print_stack);
6160605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
6170605bf00SDaniel Bristot de Oliveira 		return -1;
6180605bf00SDaniel Bristot de Oliveira 
6190605bf00SDaniel Bristot de Oliveira 	context->print_stack = print_stack;
6200605bf00SDaniel Bristot de Oliveira 
6210605bf00SDaniel Bristot de Oliveira 	return 0;
6220605bf00SDaniel Bristot de Oliveira }
6230605bf00SDaniel Bristot de Oliveira 
6240605bf00SDaniel Bristot de Oliveira /*
6250605bf00SDaniel Bristot de Oliveira  * osnoise_restore_print_stack - restore the original "print_stack"
6260605bf00SDaniel Bristot de Oliveira  */
osnoise_restore_print_stack(struct osnoise_context * context)6270605bf00SDaniel Bristot de Oliveira void osnoise_restore_print_stack(struct osnoise_context *context)
6280605bf00SDaniel Bristot de Oliveira {
6290605bf00SDaniel Bristot de Oliveira 	int retval;
6300605bf00SDaniel Bristot de Oliveira 
6310605bf00SDaniel Bristot de Oliveira 	if (context->orig_print_stack == OSNOISE_OPTION_INIT_VAL)
6320605bf00SDaniel Bristot de Oliveira 		return;
6330605bf00SDaniel Bristot de Oliveira 
6340605bf00SDaniel Bristot de Oliveira 	if (context->orig_print_stack == context->print_stack)
6350605bf00SDaniel Bristot de Oliveira 		goto out_done;
6360605bf00SDaniel Bristot de Oliveira 
6370605bf00SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("osnoise/print_stack", context->orig_print_stack);
6380605bf00SDaniel Bristot de Oliveira 	if (retval < 0)
6390605bf00SDaniel Bristot de Oliveira 		err_msg("Could not restore original osnoise print_stack\n");
6400605bf00SDaniel Bristot de Oliveira 
6410605bf00SDaniel Bristot de Oliveira out_done:
6420605bf00SDaniel Bristot de Oliveira 	context->print_stack = OSNOISE_OPTION_INIT_VAL;
6430605bf00SDaniel Bristot de Oliveira }
6440605bf00SDaniel Bristot de Oliveira 
6450605bf00SDaniel Bristot de Oliveira /*
6460605bf00SDaniel Bristot de Oliveira  * osnoise_put_print_stack - restore original values and cleanup data
6470605bf00SDaniel Bristot de Oliveira  */
osnoise_put_print_stack(struct osnoise_context * context)6480605bf00SDaniel Bristot de Oliveira void osnoise_put_print_stack(struct osnoise_context *context)
6490605bf00SDaniel Bristot de Oliveira {
6500605bf00SDaniel Bristot de Oliveira 	osnoise_restore_print_stack(context);
6510605bf00SDaniel Bristot de Oliveira 
6520605bf00SDaniel Bristot de Oliveira 	if (context->orig_print_stack == OSNOISE_OPTION_INIT_VAL)
6530605bf00SDaniel Bristot de Oliveira 		return;
6540605bf00SDaniel Bristot de Oliveira 
6550605bf00SDaniel Bristot de Oliveira 	context->orig_print_stack = OSNOISE_OPTION_INIT_VAL;
6560605bf00SDaniel Bristot de Oliveira }
6570605bf00SDaniel Bristot de Oliveira 
6580605bf00SDaniel Bristot de Oliveira /*
65961c57d57SDaniel Bristot de Oliveira  * osnoise_get_tracing_thresh - read and save the original "tracing_thresh"
66061c57d57SDaniel Bristot de Oliveira  */
66161c57d57SDaniel Bristot de Oliveira static long long
osnoise_get_tracing_thresh(struct osnoise_context * context)66261c57d57SDaniel Bristot de Oliveira osnoise_get_tracing_thresh(struct osnoise_context *context)
66361c57d57SDaniel Bristot de Oliveira {
66461c57d57SDaniel Bristot de Oliveira 	long long tracing_thresh;
66561c57d57SDaniel Bristot de Oliveira 
66661c57d57SDaniel Bristot de Oliveira 	if (context->tracing_thresh != OSNOISE_OPTION_INIT_VAL)
66761c57d57SDaniel Bristot de Oliveira 		return context->tracing_thresh;
66861c57d57SDaniel Bristot de Oliveira 
66961c57d57SDaniel Bristot de Oliveira 	if (context->orig_tracing_thresh != OSNOISE_OPTION_INIT_VAL)
67061c57d57SDaniel Bristot de Oliveira 		return context->orig_tracing_thresh;
67161c57d57SDaniel Bristot de Oliveira 
67261c57d57SDaniel Bristot de Oliveira 	tracing_thresh = osnoise_read_ll_config("tracing_thresh");
67361c57d57SDaniel Bristot de Oliveira 	if (tracing_thresh < 0)
67461c57d57SDaniel Bristot de Oliveira 		goto out_err;
67561c57d57SDaniel Bristot de Oliveira 
67661c57d57SDaniel Bristot de Oliveira 	context->orig_tracing_thresh = tracing_thresh;
67761c57d57SDaniel Bristot de Oliveira 	return tracing_thresh;
67861c57d57SDaniel Bristot de Oliveira 
67961c57d57SDaniel Bristot de Oliveira out_err:
68061c57d57SDaniel Bristot de Oliveira 	return OSNOISE_OPTION_INIT_VAL;
68161c57d57SDaniel Bristot de Oliveira }
68261c57d57SDaniel Bristot de Oliveira 
68361c57d57SDaniel Bristot de Oliveira /*
68461c57d57SDaniel Bristot de Oliveira  * osnoise_set_tracing_thresh - set "tracing_thresh"
68561c57d57SDaniel Bristot de Oliveira  */
osnoise_set_tracing_thresh(struct osnoise_context * context,long long tracing_thresh)68661c57d57SDaniel Bristot de Oliveira int osnoise_set_tracing_thresh(struct osnoise_context *context, long long tracing_thresh)
68761c57d57SDaniel Bristot de Oliveira {
68861c57d57SDaniel Bristot de Oliveira 	long long curr_tracing_thresh = osnoise_get_tracing_thresh(context);
68961c57d57SDaniel Bristot de Oliveira 	int retval;
69061c57d57SDaniel Bristot de Oliveira 
69161c57d57SDaniel Bristot de Oliveira 	if (curr_tracing_thresh == OSNOISE_OPTION_INIT_VAL)
69261c57d57SDaniel Bristot de Oliveira 		return -1;
69361c57d57SDaniel Bristot de Oliveira 
69461c57d57SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("tracing_thresh", tracing_thresh);
69561c57d57SDaniel Bristot de Oliveira 	if (retval < 0)
69661c57d57SDaniel Bristot de Oliveira 		return -1;
69761c57d57SDaniel Bristot de Oliveira 
69861c57d57SDaniel Bristot de Oliveira 	context->tracing_thresh = tracing_thresh;
69961c57d57SDaniel Bristot de Oliveira 
70061c57d57SDaniel Bristot de Oliveira 	return 0;
70161c57d57SDaniel Bristot de Oliveira }
70261c57d57SDaniel Bristot de Oliveira 
70361c57d57SDaniel Bristot de Oliveira /*
70461c57d57SDaniel Bristot de Oliveira  * osnoise_restore_tracing_thresh - restore the original "tracing_thresh"
70561c57d57SDaniel Bristot de Oliveira  */
osnoise_restore_tracing_thresh(struct osnoise_context * context)70661c57d57SDaniel Bristot de Oliveira void osnoise_restore_tracing_thresh(struct osnoise_context *context)
70761c57d57SDaniel Bristot de Oliveira {
70861c57d57SDaniel Bristot de Oliveira 	int retval;
70961c57d57SDaniel Bristot de Oliveira 
71061c57d57SDaniel Bristot de Oliveira 	if (context->orig_tracing_thresh == OSNOISE_OPTION_INIT_VAL)
71161c57d57SDaniel Bristot de Oliveira 		return;
71261c57d57SDaniel Bristot de Oliveira 
71361c57d57SDaniel Bristot de Oliveira 	if (context->orig_tracing_thresh == context->tracing_thresh)
71461c57d57SDaniel Bristot de Oliveira 		goto out_done;
71561c57d57SDaniel Bristot de Oliveira 
71661c57d57SDaniel Bristot de Oliveira 	retval = osnoise_write_ll_config("tracing_thresh", context->orig_tracing_thresh);
71761c57d57SDaniel Bristot de Oliveira 	if (retval < 0)
71861c57d57SDaniel Bristot de Oliveira 		err_msg("Could not restore original tracing_thresh\n");
71961c57d57SDaniel Bristot de Oliveira 
72061c57d57SDaniel Bristot de Oliveira out_done:
72161c57d57SDaniel Bristot de Oliveira 	context->tracing_thresh = OSNOISE_OPTION_INIT_VAL;
72261c57d57SDaniel Bristot de Oliveira }
72361c57d57SDaniel Bristot de Oliveira 
72461c57d57SDaniel Bristot de Oliveira /*
72561c57d57SDaniel Bristot de Oliveira  * osnoise_put_tracing_thresh - restore original values and cleanup data
72661c57d57SDaniel Bristot de Oliveira  */
osnoise_put_tracing_thresh(struct osnoise_context * context)72761c57d57SDaniel Bristot de Oliveira void osnoise_put_tracing_thresh(struct osnoise_context *context)
72861c57d57SDaniel Bristot de Oliveira {
72961c57d57SDaniel Bristot de Oliveira 	osnoise_restore_tracing_thresh(context);
73061c57d57SDaniel Bristot de Oliveira 
73161c57d57SDaniel Bristot de Oliveira 	if (context->orig_tracing_thresh == OSNOISE_OPTION_INIT_VAL)
73261c57d57SDaniel Bristot de Oliveira 		return;
73361c57d57SDaniel Bristot de Oliveira 
73461c57d57SDaniel Bristot de Oliveira 	context->orig_tracing_thresh = OSNOISE_OPTION_INIT_VAL;
73561c57d57SDaniel Bristot de Oliveira }
73661c57d57SDaniel Bristot de Oliveira 
osnoise_options_get_option(char * option)7371f428356SDaniel Bristot de Oliveira static int osnoise_options_get_option(char *option)
7381f428356SDaniel Bristot de Oliveira {
7391f428356SDaniel Bristot de Oliveira 	char *options = tracefs_instance_file_read(NULL, "osnoise/options", NULL);
7401f428356SDaniel Bristot de Oliveira 	char no_option[128];
7411f428356SDaniel Bristot de Oliveira 	int retval = 0;
7421f428356SDaniel Bristot de Oliveira 	char *opt;
7431f428356SDaniel Bristot de Oliveira 
7441f428356SDaniel Bristot de Oliveira 	if (!options)
7451f428356SDaniel Bristot de Oliveira 		return OSNOISE_OPTION_INIT_VAL;
7461f428356SDaniel Bristot de Oliveira 
7471f428356SDaniel Bristot de Oliveira 	/*
7481f428356SDaniel Bristot de Oliveira 	 * Check first if the option is disabled.
7491f428356SDaniel Bristot de Oliveira 	 */
7501f428356SDaniel Bristot de Oliveira 	snprintf(no_option, sizeof(no_option), "NO_%s", option);
7511f428356SDaniel Bristot de Oliveira 
7521f428356SDaniel Bristot de Oliveira 	opt = strstr(options, no_option);
7531f428356SDaniel Bristot de Oliveira 	if (opt)
7541f428356SDaniel Bristot de Oliveira 		goto out_free;
7551f428356SDaniel Bristot de Oliveira 
7561f428356SDaniel Bristot de Oliveira 	/*
7571f428356SDaniel Bristot de Oliveira 	 * Now that it is not disabled, if the string is there, it is
7581f428356SDaniel Bristot de Oliveira 	 * enabled. If the string is not there, the option does not exist.
7591f428356SDaniel Bristot de Oliveira 	 */
7601f428356SDaniel Bristot de Oliveira 	opt = strstr(options, option);
7611f428356SDaniel Bristot de Oliveira 	if (opt)
7621f428356SDaniel Bristot de Oliveira 		retval = 1;
7631f428356SDaniel Bristot de Oliveira 	else
7641f428356SDaniel Bristot de Oliveira 		retval = OSNOISE_OPTION_INIT_VAL;
7651f428356SDaniel Bristot de Oliveira 
7661f428356SDaniel Bristot de Oliveira out_free:
7671f428356SDaniel Bristot de Oliveira 	free(options);
7681f428356SDaniel Bristot de Oliveira 	return retval;
7691f428356SDaniel Bristot de Oliveira }
7701f428356SDaniel Bristot de Oliveira 
osnoise_options_set_option(char * option,bool onoff)7711f428356SDaniel Bristot de Oliveira static int osnoise_options_set_option(char *option, bool onoff)
7721f428356SDaniel Bristot de Oliveira {
7731f428356SDaniel Bristot de Oliveira 	char no_option[128];
7741f428356SDaniel Bristot de Oliveira 
7751f428356SDaniel Bristot de Oliveira 	if (onoff)
7761f428356SDaniel Bristot de Oliveira 		return tracefs_instance_file_write(NULL, "osnoise/options", option);
7771f428356SDaniel Bristot de Oliveira 
7781f428356SDaniel Bristot de Oliveira 	snprintf(no_option, sizeof(no_option), "NO_%s", option);
7791f428356SDaniel Bristot de Oliveira 
7801f428356SDaniel Bristot de Oliveira 	return tracefs_instance_file_write(NULL, "osnoise/options", no_option);
7811f428356SDaniel Bristot de Oliveira }
7821f428356SDaniel Bristot de Oliveira 
osnoise_get_irq_disable(struct osnoise_context * context)7831f428356SDaniel Bristot de Oliveira static int osnoise_get_irq_disable(struct osnoise_context *context)
7841f428356SDaniel Bristot de Oliveira {
7851f428356SDaniel Bristot de Oliveira 	if (context->opt_irq_disable != OSNOISE_OPTION_INIT_VAL)
7861f428356SDaniel Bristot de Oliveira 		return context->opt_irq_disable;
7871f428356SDaniel Bristot de Oliveira 
7881f428356SDaniel Bristot de Oliveira 	if (context->orig_opt_irq_disable != OSNOISE_OPTION_INIT_VAL)
7891f428356SDaniel Bristot de Oliveira 		return context->orig_opt_irq_disable;
7901f428356SDaniel Bristot de Oliveira 
7911f428356SDaniel Bristot de Oliveira 	context->orig_opt_irq_disable = osnoise_options_get_option("OSNOISE_IRQ_DISABLE");
7921f428356SDaniel Bristot de Oliveira 
7931f428356SDaniel Bristot de Oliveira 	return context->orig_opt_irq_disable;
7941f428356SDaniel Bristot de Oliveira }
7951f428356SDaniel Bristot de Oliveira 
osnoise_set_irq_disable(struct osnoise_context * context,bool onoff)7961f428356SDaniel Bristot de Oliveira int osnoise_set_irq_disable(struct osnoise_context *context, bool onoff)
7971f428356SDaniel Bristot de Oliveira {
7981f428356SDaniel Bristot de Oliveira 	int opt_irq_disable = osnoise_get_irq_disable(context);
7991f428356SDaniel Bristot de Oliveira 	int retval;
8001f428356SDaniel Bristot de Oliveira 
8011f428356SDaniel Bristot de Oliveira 	if (opt_irq_disable == OSNOISE_OPTION_INIT_VAL)
8021f428356SDaniel Bristot de Oliveira 		return -1;
8031f428356SDaniel Bristot de Oliveira 
8041f428356SDaniel Bristot de Oliveira 	if (opt_irq_disable == onoff)
8051f428356SDaniel Bristot de Oliveira 		return 0;
8061f428356SDaniel Bristot de Oliveira 
8071f428356SDaniel Bristot de Oliveira 	retval = osnoise_options_set_option("OSNOISE_IRQ_DISABLE", onoff);
8081f428356SDaniel Bristot de Oliveira 	if (retval < 0)
8091f428356SDaniel Bristot de Oliveira 		return -1;
8101f428356SDaniel Bristot de Oliveira 
8111f428356SDaniel Bristot de Oliveira 	context->opt_irq_disable = onoff;
8121f428356SDaniel Bristot de Oliveira 
8131f428356SDaniel Bristot de Oliveira 	return 0;
8141f428356SDaniel Bristot de Oliveira }
8151f428356SDaniel Bristot de Oliveira 
osnoise_restore_irq_disable(struct osnoise_context * context)8161f428356SDaniel Bristot de Oliveira static void osnoise_restore_irq_disable(struct osnoise_context *context)
8171f428356SDaniel Bristot de Oliveira {
8181f428356SDaniel Bristot de Oliveira 	int retval;
8191f428356SDaniel Bristot de Oliveira 
8201f428356SDaniel Bristot de Oliveira 	if (context->orig_opt_irq_disable == OSNOISE_OPTION_INIT_VAL)
8211f428356SDaniel Bristot de Oliveira 		return;
8221f428356SDaniel Bristot de Oliveira 
8231f428356SDaniel Bristot de Oliveira 	if (context->orig_opt_irq_disable == context->opt_irq_disable)
8241f428356SDaniel Bristot de Oliveira 		goto out_done;
8251f428356SDaniel Bristot de Oliveira 
8261f428356SDaniel Bristot de Oliveira 	retval = osnoise_options_set_option("OSNOISE_IRQ_DISABLE", context->orig_opt_irq_disable);
8271f428356SDaniel Bristot de Oliveira 	if (retval < 0)
8281f428356SDaniel Bristot de Oliveira 		err_msg("Could not restore original OSNOISE_IRQ_DISABLE option\n");
8291f428356SDaniel Bristot de Oliveira 
8301f428356SDaniel Bristot de Oliveira out_done:
8311f428356SDaniel Bristot de Oliveira 	context->orig_opt_irq_disable = OSNOISE_OPTION_INIT_VAL;
8321f428356SDaniel Bristot de Oliveira }
8331f428356SDaniel Bristot de Oliveira 
osnoise_put_irq_disable(struct osnoise_context * context)8341f428356SDaniel Bristot de Oliveira static void osnoise_put_irq_disable(struct osnoise_context *context)
8351f428356SDaniel Bristot de Oliveira {
8361f428356SDaniel Bristot de Oliveira 	osnoise_restore_irq_disable(context);
8371f428356SDaniel Bristot de Oliveira 
8381f428356SDaniel Bristot de Oliveira 	if (context->orig_opt_irq_disable == OSNOISE_OPTION_INIT_VAL)
8391f428356SDaniel Bristot de Oliveira 		return;
8401f428356SDaniel Bristot de Oliveira 
8411f428356SDaniel Bristot de Oliveira 	context->orig_opt_irq_disable = OSNOISE_OPTION_INIT_VAL;
8421f428356SDaniel Bristot de Oliveira }
8431f428356SDaniel Bristot de Oliveira 
osnoise_get_workload(struct osnoise_context * context)844*cdca4f4eSDaniel Bristot de Oliveira static int osnoise_get_workload(struct osnoise_context *context)
845*cdca4f4eSDaniel Bristot de Oliveira {
846*cdca4f4eSDaniel Bristot de Oliveira 	if (context->opt_workload != OSNOISE_OPTION_INIT_VAL)
847*cdca4f4eSDaniel Bristot de Oliveira 		return context->opt_workload;
848*cdca4f4eSDaniel Bristot de Oliveira 
849*cdca4f4eSDaniel Bristot de Oliveira 	if (context->orig_opt_workload != OSNOISE_OPTION_INIT_VAL)
850*cdca4f4eSDaniel Bristot de Oliveira 		return context->orig_opt_workload;
851*cdca4f4eSDaniel Bristot de Oliveira 
852*cdca4f4eSDaniel Bristot de Oliveira 	context->orig_opt_workload = osnoise_options_get_option("OSNOISE_WORKLOAD");
853*cdca4f4eSDaniel Bristot de Oliveira 
854*cdca4f4eSDaniel Bristot de Oliveira 	return context->orig_opt_workload;
855*cdca4f4eSDaniel Bristot de Oliveira }
856*cdca4f4eSDaniel Bristot de Oliveira 
osnoise_set_workload(struct osnoise_context * context,bool onoff)857*cdca4f4eSDaniel Bristot de Oliveira int osnoise_set_workload(struct osnoise_context *context, bool onoff)
858*cdca4f4eSDaniel Bristot de Oliveira {
859*cdca4f4eSDaniel Bristot de Oliveira 	int opt_workload = osnoise_get_workload(context);
860*cdca4f4eSDaniel Bristot de Oliveira 	int retval;
861*cdca4f4eSDaniel Bristot de Oliveira 
862*cdca4f4eSDaniel Bristot de Oliveira 	if (opt_workload == OSNOISE_OPTION_INIT_VAL)
863*cdca4f4eSDaniel Bristot de Oliveira 		return -1;
864*cdca4f4eSDaniel Bristot de Oliveira 
865*cdca4f4eSDaniel Bristot de Oliveira 	if (opt_workload == onoff)
866*cdca4f4eSDaniel Bristot de Oliveira 		return 0;
867*cdca4f4eSDaniel Bristot de Oliveira 
868*cdca4f4eSDaniel Bristot de Oliveira 	retval = osnoise_options_set_option("OSNOISE_WORKLOAD", onoff);
869*cdca4f4eSDaniel Bristot de Oliveira 	if (retval < 0)
870*cdca4f4eSDaniel Bristot de Oliveira 		return -1;
871*cdca4f4eSDaniel Bristot de Oliveira 
872*cdca4f4eSDaniel Bristot de Oliveira 	context->opt_workload = onoff;
873*cdca4f4eSDaniel Bristot de Oliveira 
874*cdca4f4eSDaniel Bristot de Oliveira 	return 0;
875*cdca4f4eSDaniel Bristot de Oliveira }
876*cdca4f4eSDaniel Bristot de Oliveira 
osnoise_restore_workload(struct osnoise_context * context)877*cdca4f4eSDaniel Bristot de Oliveira static void osnoise_restore_workload(struct osnoise_context *context)
878*cdca4f4eSDaniel Bristot de Oliveira {
879*cdca4f4eSDaniel Bristot de Oliveira 	int retval;
880*cdca4f4eSDaniel Bristot de Oliveira 
881*cdca4f4eSDaniel Bristot de Oliveira 	if (context->orig_opt_workload == OSNOISE_OPTION_INIT_VAL)
882*cdca4f4eSDaniel Bristot de Oliveira 		return;
883*cdca4f4eSDaniel Bristot de Oliveira 
884*cdca4f4eSDaniel Bristot de Oliveira 	if (context->orig_opt_workload == context->opt_workload)
885*cdca4f4eSDaniel Bristot de Oliveira 		goto out_done;
886*cdca4f4eSDaniel Bristot de Oliveira 
887*cdca4f4eSDaniel Bristot de Oliveira 	retval = osnoise_options_set_option("OSNOISE_WORKLOAD", context->orig_opt_workload);
888*cdca4f4eSDaniel Bristot de Oliveira 	if (retval < 0)
889*cdca4f4eSDaniel Bristot de Oliveira 		err_msg("Could not restore original OSNOISE_WORKLOAD option\n");
890*cdca4f4eSDaniel Bristot de Oliveira 
891*cdca4f4eSDaniel Bristot de Oliveira out_done:
892*cdca4f4eSDaniel Bristot de Oliveira 	context->orig_opt_workload = OSNOISE_OPTION_INIT_VAL;
893*cdca4f4eSDaniel Bristot de Oliveira }
894*cdca4f4eSDaniel Bristot de Oliveira 
osnoise_put_workload(struct osnoise_context * context)895*cdca4f4eSDaniel Bristot de Oliveira static void osnoise_put_workload(struct osnoise_context *context)
896*cdca4f4eSDaniel Bristot de Oliveira {
897*cdca4f4eSDaniel Bristot de Oliveira 	osnoise_restore_workload(context);
898*cdca4f4eSDaniel Bristot de Oliveira 
899*cdca4f4eSDaniel Bristot de Oliveira 	if (context->orig_opt_workload == OSNOISE_OPTION_INIT_VAL)
900*cdca4f4eSDaniel Bristot de Oliveira 		return;
901*cdca4f4eSDaniel Bristot de Oliveira 
902*cdca4f4eSDaniel Bristot de Oliveira 	context->orig_opt_workload = OSNOISE_OPTION_INIT_VAL;
903*cdca4f4eSDaniel Bristot de Oliveira }
904*cdca4f4eSDaniel Bristot de Oliveira 
90561c57d57SDaniel Bristot de Oliveira /*
9060605bf00SDaniel Bristot de Oliveira  * enable_osnoise - enable osnoise tracer in the trace_instance
9070605bf00SDaniel Bristot de Oliveira  */
enable_osnoise(struct trace_instance * trace)9080605bf00SDaniel Bristot de Oliveira int enable_osnoise(struct trace_instance *trace)
9090605bf00SDaniel Bristot de Oliveira {
9100605bf00SDaniel Bristot de Oliveira 	return enable_tracer_by_name(trace->inst, "osnoise");
9110605bf00SDaniel Bristot de Oliveira }
9120605bf00SDaniel Bristot de Oliveira 
9130605bf00SDaniel Bristot de Oliveira /*
9140605bf00SDaniel Bristot de Oliveira  * enable_timerlat - enable timerlat tracer in the trace_instance
9150605bf00SDaniel Bristot de Oliveira  */
enable_timerlat(struct trace_instance * trace)9160605bf00SDaniel Bristot de Oliveira int enable_timerlat(struct trace_instance *trace)
9170605bf00SDaniel Bristot de Oliveira {
9180605bf00SDaniel Bristot de Oliveira 	return enable_tracer_by_name(trace->inst, "timerlat");
9190605bf00SDaniel Bristot de Oliveira }
9200605bf00SDaniel Bristot de Oliveira 
9210605bf00SDaniel Bristot de Oliveira enum {
9220605bf00SDaniel Bristot de Oliveira 	FLAG_CONTEXT_NEWLY_CREATED	= (1 << 0),
9230605bf00SDaniel Bristot de Oliveira 	FLAG_CONTEXT_DELETED		= (1 << 1),
9240605bf00SDaniel Bristot de Oliveira };
9250605bf00SDaniel Bristot de Oliveira 
9260605bf00SDaniel Bristot de Oliveira /*
9270605bf00SDaniel Bristot de Oliveira  * osnoise_get_context - increase the usage of a context and return it
9280605bf00SDaniel Bristot de Oliveira  */
osnoise_get_context(struct osnoise_context * context)9290605bf00SDaniel Bristot de Oliveira int osnoise_get_context(struct osnoise_context *context)
9300605bf00SDaniel Bristot de Oliveira {
9310605bf00SDaniel Bristot de Oliveira 	int ret;
9320605bf00SDaniel Bristot de Oliveira 
9330605bf00SDaniel Bristot de Oliveira 	if (context->flags & FLAG_CONTEXT_DELETED) {
9340605bf00SDaniel Bristot de Oliveira 		ret = -1;
9350605bf00SDaniel Bristot de Oliveira 	} else {
9360605bf00SDaniel Bristot de Oliveira 		context->ref++;
9370605bf00SDaniel Bristot de Oliveira 		ret = 0;
9380605bf00SDaniel Bristot de Oliveira 	}
9390605bf00SDaniel Bristot de Oliveira 
9400605bf00SDaniel Bristot de Oliveira 	return ret;
9410605bf00SDaniel Bristot de Oliveira }
9420605bf00SDaniel Bristot de Oliveira 
9430605bf00SDaniel Bristot de Oliveira /*
9440605bf00SDaniel Bristot de Oliveira  * osnoise_context_alloc - alloc an osnoise_context
9450605bf00SDaniel Bristot de Oliveira  *
9460605bf00SDaniel Bristot de Oliveira  * The osnoise context contains the information of the "osnoise/" configs.
9470605bf00SDaniel Bristot de Oliveira  * It is used to set and restore the config.
9480605bf00SDaniel Bristot de Oliveira  */
osnoise_context_alloc(void)9490605bf00SDaniel Bristot de Oliveira struct osnoise_context *osnoise_context_alloc(void)
9500605bf00SDaniel Bristot de Oliveira {
9510605bf00SDaniel Bristot de Oliveira 	struct osnoise_context *context;
9520605bf00SDaniel Bristot de Oliveira 
9530605bf00SDaniel Bristot de Oliveira 	context = calloc(1, sizeof(*context));
9540605bf00SDaniel Bristot de Oliveira 	if (!context)
9550605bf00SDaniel Bristot de Oliveira 		return NULL;
9560605bf00SDaniel Bristot de Oliveira 
9570605bf00SDaniel Bristot de Oliveira 	context->orig_stop_us		= OSNOISE_OPTION_INIT_VAL;
9580605bf00SDaniel Bristot de Oliveira 	context->stop_us		= OSNOISE_OPTION_INIT_VAL;
9590605bf00SDaniel Bristot de Oliveira 
9600605bf00SDaniel Bristot de Oliveira 	context->orig_stop_total_us	= OSNOISE_OPTION_INIT_VAL;
9610605bf00SDaniel Bristot de Oliveira 	context->stop_total_us		= OSNOISE_OPTION_INIT_VAL;
9620605bf00SDaniel Bristot de Oliveira 
9630605bf00SDaniel Bristot de Oliveira 	context->orig_print_stack	= OSNOISE_OPTION_INIT_VAL;
9640605bf00SDaniel Bristot de Oliveira 	context->print_stack		= OSNOISE_OPTION_INIT_VAL;
9650605bf00SDaniel Bristot de Oliveira 
96661c57d57SDaniel Bristot de Oliveira 	context->orig_tracing_thresh	= OSNOISE_OPTION_INIT_VAL;
96761c57d57SDaniel Bristot de Oliveira 	context->tracing_thresh		= OSNOISE_OPTION_INIT_VAL;
96861c57d57SDaniel Bristot de Oliveira 
9691f428356SDaniel Bristot de Oliveira 	context->orig_opt_irq_disable	= OSNOISE_OPTION_INIT_VAL;
9701f428356SDaniel Bristot de Oliveira 	context->opt_irq_disable	= OSNOISE_OPTION_INIT_VAL;
9711f428356SDaniel Bristot de Oliveira 
972*cdca4f4eSDaniel Bristot de Oliveira 	context->orig_opt_workload	= OSNOISE_OPTION_INIT_VAL;
973*cdca4f4eSDaniel Bristot de Oliveira 	context->opt_workload		= OSNOISE_OPTION_INIT_VAL;
974*cdca4f4eSDaniel Bristot de Oliveira 
9750605bf00SDaniel Bristot de Oliveira 	osnoise_get_context(context);
9760605bf00SDaniel Bristot de Oliveira 
9770605bf00SDaniel Bristot de Oliveira 	return context;
9780605bf00SDaniel Bristot de Oliveira }
9790605bf00SDaniel Bristot de Oliveira 
9800605bf00SDaniel Bristot de Oliveira /*
9810605bf00SDaniel Bristot de Oliveira  * osnoise_put_context - put the osnoise_put_context
9820605bf00SDaniel Bristot de Oliveira  *
9830605bf00SDaniel Bristot de Oliveira  * If there is no other user for the context, the original data
9840605bf00SDaniel Bristot de Oliveira  * is restored.
9850605bf00SDaniel Bristot de Oliveira  */
osnoise_put_context(struct osnoise_context * context)9860605bf00SDaniel Bristot de Oliveira void osnoise_put_context(struct osnoise_context *context)
9870605bf00SDaniel Bristot de Oliveira {
9880605bf00SDaniel Bristot de Oliveira 	if (--context->ref < 1)
9890605bf00SDaniel Bristot de Oliveira 		context->flags |= FLAG_CONTEXT_DELETED;
9900605bf00SDaniel Bristot de Oliveira 
9910605bf00SDaniel Bristot de Oliveira 	if (!(context->flags & FLAG_CONTEXT_DELETED))
9920605bf00SDaniel Bristot de Oliveira 		return;
9930605bf00SDaniel Bristot de Oliveira 
9940605bf00SDaniel Bristot de Oliveira 	osnoise_put_cpus(context);
9950605bf00SDaniel Bristot de Oliveira 	osnoise_put_runtime_period(context);
9960605bf00SDaniel Bristot de Oliveira 	osnoise_put_stop_us(context);
9970605bf00SDaniel Bristot de Oliveira 	osnoise_put_stop_total_us(context);
9980605bf00SDaniel Bristot de Oliveira 	osnoise_put_timerlat_period_us(context);
9990605bf00SDaniel Bristot de Oliveira 	osnoise_put_print_stack(context);
100061c57d57SDaniel Bristot de Oliveira 	osnoise_put_tracing_thresh(context);
10011f428356SDaniel Bristot de Oliveira 	osnoise_put_irq_disable(context);
1002*cdca4f4eSDaniel Bristot de Oliveira 	osnoise_put_workload(context);
10030605bf00SDaniel Bristot de Oliveira 
10040605bf00SDaniel Bristot de Oliveira 	free(context);
10050605bf00SDaniel Bristot de Oliveira }
10060605bf00SDaniel Bristot de Oliveira 
10070605bf00SDaniel Bristot de Oliveira /*
10080605bf00SDaniel Bristot de Oliveira  * osnoise_destroy_tool - disable trace, restore configs and free data
10090605bf00SDaniel Bristot de Oliveira  */
osnoise_destroy_tool(struct osnoise_tool * top)10100605bf00SDaniel Bristot de Oliveira void osnoise_destroy_tool(struct osnoise_tool *top)
10110605bf00SDaniel Bristot de Oliveira {
10124bbf59a9SDaniel Bristot de Oliveira 	if (!top)
10134bbf59a9SDaniel Bristot de Oliveira 		return;
10144bbf59a9SDaniel Bristot de Oliveira 
10150605bf00SDaniel Bristot de Oliveira 	trace_instance_destroy(&top->trace);
10160605bf00SDaniel Bristot de Oliveira 
10170605bf00SDaniel Bristot de Oliveira 	if (top->context)
10180605bf00SDaniel Bristot de Oliveira 		osnoise_put_context(top->context);
10190605bf00SDaniel Bristot de Oliveira 
10200605bf00SDaniel Bristot de Oliveira 	free(top);
10210605bf00SDaniel Bristot de Oliveira }
10220605bf00SDaniel Bristot de Oliveira 
10230605bf00SDaniel Bristot de Oliveira /*
10240605bf00SDaniel Bristot de Oliveira  * osnoise_init_tool - init an osnoise tool
10250605bf00SDaniel Bristot de Oliveira  *
10260605bf00SDaniel Bristot de Oliveira  * It allocs data, create a context to store data and
10270605bf00SDaniel Bristot de Oliveira  * creates a new trace instance for the tool.
10280605bf00SDaniel Bristot de Oliveira  */
osnoise_init_tool(char * tool_name)10290605bf00SDaniel Bristot de Oliveira struct osnoise_tool *osnoise_init_tool(char *tool_name)
10300605bf00SDaniel Bristot de Oliveira {
10310605bf00SDaniel Bristot de Oliveira 	struct osnoise_tool *top;
10320605bf00SDaniel Bristot de Oliveira 	int retval;
10330605bf00SDaniel Bristot de Oliveira 
10340605bf00SDaniel Bristot de Oliveira 	top = calloc(1, sizeof(*top));
10350605bf00SDaniel Bristot de Oliveira 	if (!top)
10360605bf00SDaniel Bristot de Oliveira 		return NULL;
10370605bf00SDaniel Bristot de Oliveira 
10380605bf00SDaniel Bristot de Oliveira 	top->context = osnoise_context_alloc();
10390605bf00SDaniel Bristot de Oliveira 	if (!top->context)
10400605bf00SDaniel Bristot de Oliveira 		goto out_err;
10410605bf00SDaniel Bristot de Oliveira 
10420605bf00SDaniel Bristot de Oliveira 	retval = trace_instance_init(&top->trace, tool_name);
10430605bf00SDaniel Bristot de Oliveira 	if (retval)
10440605bf00SDaniel Bristot de Oliveira 		goto out_err;
10450605bf00SDaniel Bristot de Oliveira 
10460605bf00SDaniel Bristot de Oliveira 	return top;
10470605bf00SDaniel Bristot de Oliveira out_err:
10480605bf00SDaniel Bristot de Oliveira 	osnoise_destroy_tool(top);
10490605bf00SDaniel Bristot de Oliveira 	return NULL;
10500605bf00SDaniel Bristot de Oliveira }
10510605bf00SDaniel Bristot de Oliveira 
10520605bf00SDaniel Bristot de Oliveira /*
10530605bf00SDaniel Bristot de Oliveira  * osnoise_init_trace_tool - init a tracer instance to trace osnoise events
10540605bf00SDaniel Bristot de Oliveira  */
osnoise_init_trace_tool(char * tracer)10550605bf00SDaniel Bristot de Oliveira struct osnoise_tool *osnoise_init_trace_tool(char *tracer)
10560605bf00SDaniel Bristot de Oliveira {
10570605bf00SDaniel Bristot de Oliveira 	struct osnoise_tool *trace;
10580605bf00SDaniel Bristot de Oliveira 	int retval;
10590605bf00SDaniel Bristot de Oliveira 
10600605bf00SDaniel Bristot de Oliveira 	trace = osnoise_init_tool("osnoise_trace");
10610605bf00SDaniel Bristot de Oliveira 	if (!trace)
10620605bf00SDaniel Bristot de Oliveira 		return NULL;
10630605bf00SDaniel Bristot de Oliveira 
10640605bf00SDaniel Bristot de Oliveira 	retval = tracefs_event_enable(trace->trace.inst, "osnoise", NULL);
10650605bf00SDaniel Bristot de Oliveira 	if (retval < 0 && !errno) {
10660605bf00SDaniel Bristot de Oliveira 		err_msg("Could not find osnoise events\n");
10670605bf00SDaniel Bristot de Oliveira 		goto out_err;
10680605bf00SDaniel Bristot de Oliveira 	}
10690605bf00SDaniel Bristot de Oliveira 
10700605bf00SDaniel Bristot de Oliveira 	retval = enable_tracer_by_name(trace->trace.inst, tracer);
10710605bf00SDaniel Bristot de Oliveira 	if (retval) {
107290f59ee4SDaniel Bristot de Oliveira 		err_msg("Could not enable %s tracer for tracing\n", tracer);
10730605bf00SDaniel Bristot de Oliveira 		goto out_err;
10740605bf00SDaniel Bristot de Oliveira 	}
10750605bf00SDaniel Bristot de Oliveira 
10760605bf00SDaniel Bristot de Oliveira 	return trace;
10770605bf00SDaniel Bristot de Oliveira out_err:
10780605bf00SDaniel Bristot de Oliveira 	osnoise_destroy_tool(trace);
10790605bf00SDaniel Bristot de Oliveira 	return NULL;
10800605bf00SDaniel Bristot de Oliveira }
10810605bf00SDaniel Bristot de Oliveira 
osnoise_usage(int err)10824c687437SJohn Kacur static void osnoise_usage(int err)
10830605bf00SDaniel Bristot de Oliveira {
10840605bf00SDaniel Bristot de Oliveira 	int i;
10850605bf00SDaniel Bristot de Oliveira 
10860605bf00SDaniel Bristot de Oliveira 	static const char *msg[] = {
10870605bf00SDaniel Bristot de Oliveira 		"",
10880605bf00SDaniel Bristot de Oliveira 		"osnoise version " VERSION,
10890605bf00SDaniel Bristot de Oliveira 		"",
10900605bf00SDaniel Bristot de Oliveira 		"  usage: [rtla] osnoise [MODE] ...",
10910605bf00SDaniel Bristot de Oliveira 		"",
10920605bf00SDaniel Bristot de Oliveira 		"  modes:",
10930605bf00SDaniel Bristot de Oliveira 		"     top   - prints the summary from osnoise tracer",
1094829a6c0bSDaniel Bristot de Oliveira 		"     hist  - prints a histogram of osnoise samples",
10950605bf00SDaniel Bristot de Oliveira 		"",
10960605bf00SDaniel Bristot de Oliveira 		"if no MODE is given, the top mode is called, passing the arguments",
10970605bf00SDaniel Bristot de Oliveira 		NULL,
10980605bf00SDaniel Bristot de Oliveira 	};
10990605bf00SDaniel Bristot de Oliveira 
11000605bf00SDaniel Bristot de Oliveira 	for (i = 0; msg[i]; i++)
11010605bf00SDaniel Bristot de Oliveira 		fprintf(stderr, "%s\n", msg[i]);
11024c687437SJohn Kacur 	exit(err);
11030605bf00SDaniel Bristot de Oliveira }
11040605bf00SDaniel Bristot de Oliveira 
osnoise_main(int argc,char * argv[])11050605bf00SDaniel Bristot de Oliveira int osnoise_main(int argc, char *argv[])
11060605bf00SDaniel Bristot de Oliveira {
11070605bf00SDaniel Bristot de Oliveira 	if (argc == 0)
11080605bf00SDaniel Bristot de Oliveira 		goto usage;
11090605bf00SDaniel Bristot de Oliveira 
11101eceb2fcSDaniel Bristot de Oliveira 	/*
11111eceb2fcSDaniel Bristot de Oliveira 	 * if osnoise was called without any argument, run the
11121eceb2fcSDaniel Bristot de Oliveira 	 * default cmdline.
11131eceb2fcSDaniel Bristot de Oliveira 	 */
11141eceb2fcSDaniel Bristot de Oliveira 	if (argc == 1) {
11151eceb2fcSDaniel Bristot de Oliveira 		osnoise_top_main(argc, argv);
11161eceb2fcSDaniel Bristot de Oliveira 		exit(0);
11171eceb2fcSDaniel Bristot de Oliveira 	}
11181eceb2fcSDaniel Bristot de Oliveira 
11190605bf00SDaniel Bristot de Oliveira 	if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {
11204c687437SJohn Kacur 		osnoise_usage(0);
11211eceb2fcSDaniel Bristot de Oliveira 	} else if (strncmp(argv[1], "-", 1) == 0) {
11221eceb2fcSDaniel Bristot de Oliveira 		/* the user skipped the tool, call the default one */
11231eceb2fcSDaniel Bristot de Oliveira 		osnoise_top_main(argc, argv);
11241eceb2fcSDaniel Bristot de Oliveira 		exit(0);
11251eceb2fcSDaniel Bristot de Oliveira 	} else if (strcmp(argv[1], "top") == 0) {
11261eceb2fcSDaniel Bristot de Oliveira 		osnoise_top_main(argc-1, &argv[1]);
11271eceb2fcSDaniel Bristot de Oliveira 		exit(0);
1128829a6c0bSDaniel Bristot de Oliveira 	} else if (strcmp(argv[1], "hist") == 0) {
1129829a6c0bSDaniel Bristot de Oliveira 		osnoise_hist_main(argc-1, &argv[1]);
1130829a6c0bSDaniel Bristot de Oliveira 		exit(0);
11310605bf00SDaniel Bristot de Oliveira 	}
11320605bf00SDaniel Bristot de Oliveira 
11330605bf00SDaniel Bristot de Oliveira usage:
11344c687437SJohn Kacur 	osnoise_usage(1);
11350605bf00SDaniel Bristot de Oliveira 	exit(1);
11360605bf00SDaniel Bristot de Oliveira }
11371f428356SDaniel Bristot de Oliveira 
hwnoise_main(int argc,char * argv[])11381f428356SDaniel Bristot de Oliveira int hwnoise_main(int argc, char *argv[])
11391f428356SDaniel Bristot de Oliveira {
11401f428356SDaniel Bristot de Oliveira 	osnoise_top_main(argc, argv);
11411f428356SDaniel Bristot de Oliveira 	exit(0);
11421f428356SDaniel Bristot de Oliveira }
1143