Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2#pragma once
3
4#include "utils.h"
5#include "trace.h"
6
7enum osnoise_mode {
8 MODE_OSNOISE = 0,
9 MODE_HWNOISE
10};
11
12struct osnoise_params {
13 /* Common params */
14 char *cpus;
15 cpu_set_t monitored_cpus;
16 char *trace_output;
17 char *cgroup_name;
18 unsigned long long runtime;
19 unsigned long long period;
20 long long threshold;
21 long long stop_us;
22 long long stop_total_us;
23 int sleep_time;
24 int duration;
25 int set_sched;
26 int cgroup;
27 int hk_cpus;
28 cpu_set_t hk_cpu_set;
29 struct sched_attr sched_param;
30 struct trace_events *events;
31 int warmup;
32 int buffer_size;
33 union {
34 struct {
35 /* top only */
36 int quiet;
37 int pretty_output;
38 enum osnoise_mode mode;
39 };
40 struct {
41 /* hist only */
42 int output_divisor;
43 char no_header;
44 char no_summary;
45 char no_index;
46 char with_zeros;
47 int bucket_size;
48 int entries;
49 };
50 };
51};
52
53/*
54 * osnoise_context - read, store, write, restore osnoise configs.
55 */
56struct osnoise_context {
57 int flags;
58 int ref;
59
60 char *curr_cpus;
61 char *orig_cpus;
62
63 /* 0 as init value */
64 unsigned long long orig_runtime_us;
65 unsigned long long runtime_us;
66
67 /* 0 as init value */
68 unsigned long long orig_period_us;
69 unsigned long long period_us;
70
71 /* 0 as init value */
72 long long orig_timerlat_period_us;
73 long long timerlat_period_us;
74
75 /* 0 as init value */
76 long long orig_tracing_thresh;
77 long long tracing_thresh;
78
79 /* -1 as init value because 0 is disabled */
80 long long orig_stop_us;
81 long long stop_us;
82
83 /* -1 as init value because 0 is disabled */
84 long long orig_stop_total_us;
85 long long stop_total_us;
86
87 /* -1 as init value because 0 is disabled */
88 long long orig_print_stack;
89 long long print_stack;
90
91 /* -1 as init value because 0 is off */
92 int orig_opt_irq_disable;
93 int opt_irq_disable;
94
95 /* -1 as init value because 0 is off */
96 int orig_opt_workload;
97 int opt_workload;
98};
99
100/*
101 * *_INIT_VALs are also invalid values, they are used to
102 * communicate errors.
103 */
104#define OSNOISE_OPTION_INIT_VAL (-1)
105#define OSNOISE_TIME_INIT_VAL (0)
106
107struct osnoise_context *osnoise_context_alloc(void);
108int osnoise_get_context(struct osnoise_context *context);
109void osnoise_put_context(struct osnoise_context *context);
110
111int osnoise_set_cpus(struct osnoise_context *context, char *cpus);
112void osnoise_restore_cpus(struct osnoise_context *context);
113
114int osnoise_set_runtime_period(struct osnoise_context *context,
115 unsigned long long runtime,
116 unsigned long long period);
117void osnoise_restore_runtime_period(struct osnoise_context *context);
118
119int osnoise_set_stop_us(struct osnoise_context *context,
120 long long stop_us);
121void osnoise_restore_stop_us(struct osnoise_context *context);
122
123int osnoise_set_stop_total_us(struct osnoise_context *context,
124 long long stop_total_us);
125void osnoise_restore_stop_total_us(struct osnoise_context *context);
126
127int osnoise_set_timerlat_period_us(struct osnoise_context *context,
128 long long timerlat_period_us);
129void osnoise_restore_timerlat_period_us(struct osnoise_context *context);
130
131int osnoise_set_tracing_thresh(struct osnoise_context *context,
132 long long tracing_thresh);
133void osnoise_restore_tracing_thresh(struct osnoise_context *context);
134
135void osnoise_restore_print_stack(struct osnoise_context *context);
136int osnoise_set_print_stack(struct osnoise_context *context,
137 long long print_stack);
138
139int osnoise_set_irq_disable(struct osnoise_context *context, bool onoff);
140int osnoise_set_workload(struct osnoise_context *context, bool onoff);
141
142/*
143 * osnoise_tool - osnoise based tool definition.
144 */
145struct osnoise_tool {
146 struct trace_instance trace;
147 struct osnoise_context *context;
148 void *data;
149 void *params;
150 time_t start_time;
151};
152
153void osnoise_destroy_tool(struct osnoise_tool *top);
154struct osnoise_tool *osnoise_init_tool(char *tool_name);
155struct osnoise_tool *osnoise_init_trace_tool(char *tracer);
156void osnoise_report_missed_events(struct osnoise_tool *tool);
157bool osnoise_trace_is_off(struct osnoise_tool *tool, struct osnoise_tool *record);
158int osnoise_apply_config(struct osnoise_tool *tool, struct osnoise_params *params);
159
160int osnoise_hist_main(int argc, char *argv[]);
161int osnoise_top_main(int argc, char **argv);
162int osnoise_main(int argc, char **argv);
163int hwnoise_main(int argc, char **argv);