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