Lines Matching +full:static +full:- +full:trace +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0
3 * in kernel monitor support: allows rv to control in-kernel monitors.
13 #include <trace.h>
17 static int config_has_id;
18 static int config_my_pid;
19 static int config_trace;
21 static char *config_initial_reactor;
22 static char *config_reactor;
25 * __ikm_read_enable - reads monitor's enable status
29 * Returns the current status, or -1 if the monitor does not exist,
32 static int __ikm_read_enable(char *monitor_name) in __ikm_read_enable()
42 return -1; in __ikm_read_enable()
48 * ikm_read_enable - reads monitor's enable status
50 * Returns the current status, or -1 on error.
52 static int ikm_read_enable(char *monitor_name) in ikm_read_enable()
59 return -1; in ikm_read_enable()
68 * ikm_write_enable - write to the monitor's enable file
70 * Return the number of bytes written, -1 on error.
72 static int ikm_write_enable(char *monitor_name, char *enable_disable) in ikm_write_enable()
83 return -1; in ikm_write_enable()
90 * ikm_enable - enable a monitor
92 * Returns -1 on failure. Success otherwise.
94 static int ikm_enable(char *monitor_name) in ikm_enable()
100 * ikm_disable - disable a monitor
102 * Returns -1 on failure. Success otherwise.
104 static int ikm_disable(char *monitor_name) in ikm_disable()
110 * ikm_read_desc - read monitors' description
115 static char *ikm_read_desc(char *monitor_name) in ikm_read_desc()
133 * ikm_fill_monitor_definition - fill monitor's definition
135 * Returns -1 on error, 0 otherwise.
137 static int ikm_fill_monitor_definition(char *name, struct monitor *ikm) in ikm_fill_monitor_definition()
145 return -1; in ikm_fill_monitor_definition()
151 return -1; in ikm_fill_monitor_definition()
154 strncpy(ikm->name, name, MAX_DA_NAME_LEN); in ikm_fill_monitor_definition()
155 ikm->enabled = enabled; in ikm_fill_monitor_definition()
156 strncpy(ikm->desc, desc, MAX_DESCRIPTION); in ikm_fill_monitor_definition()
164 * ikm_write_reactor - switch the reactor to *reactor
166 * Return the number or characters written, -1 on error.
168 static int ikm_write_reactor(char *monitor_name, char *reactor) in ikm_write_reactor()
181 * ikm_read_reactor - read the reactors file
186 static char *ikm_read_reactor(char *monitor_name) in ikm_read_reactor()
202 * ikm_get_current_reactor - get the current enabled reactor
210 static char *ikm_get_current_reactor(char *monitor_name) in ikm_get_current_reactor()
245 static int ikm_has_id(char *monitor_name) in ikm_has_id()
255 return -1; in ikm_has_id()
258 /* print fmt: "%d: %s x %s -> %s %s", REC->id, ... */ in ikm_has_id()
259 has_id = !!strstr(format, "REC->id"); in ikm_has_id()
261 debug_msg("ikm: monitor %s has id: %s\n", monitor_name, has_id ? "yes" : "no"); in ikm_has_id()
269 * ikm_list_monitors - list all available monitors
271 * Returns 0 on success, -1 otherwise.
284 return -1; in ikm_list_monitors()
296 printf("%-24s %s %s\n", ikm.name, ikm.desc, ikm.enabled ? "[ON]" : "[OFF]"); in ikm_list_monitors()
306 static void ikm_print_header(struct trace_seq *s) in ikm_print_header()
308 trace_seq_printf(s, "%16s-%-8s %5s %5s ", "<TASK>", "PID", "[CPU]", "TYPE"); in ikm_print_header()
310 trace_seq_printf(s, "%8s ", "ID"); in ikm_print_header()
312 trace_seq_printf(s, "%24s x %-24s -> %-24s %s\n", in ikm_print_header()
318 trace_seq_printf(s, "%16s %-8s %5s %5s ", " | ", " | ", " | ", " | "); in ikm_print_header()
323 trace_seq_printf(s, "%24s %-24s %-24s %s\n", in ikm_print_header()
332 * ikm_event_handler - callback to handle event events
337 static int
345 unsigned long long id; in ikm_event_handler() local
346 int cpu = record->cpu; in ikm_event_handler()
350 tep_get_field_val(s, trace_event, "id", record, &id, 1); in ikm_event_handler()
354 if (config_has_id && (config_my_pid == id)) in ikm_event_handler()
359 tep_print_event(trace_event->tep, s, record, "%16s-%-8d ", TEP_PRINT_COMM, TEP_PRINT_PID); in ikm_event_handler()
364 trace_seq_printf(s, "%8llu ", id); in ikm_event_handler()
371 trace_seq_printf(s, "%24s x %-24s -> %-24s %s\n", in ikm_event_handler()
384 * ikm_error_handler - callback to handle error events
389 static int
393 unsigned long long pid, id; in ikm_error_handler() local
394 int cpu = record->cpu; in ikm_error_handler()
399 tep_get_field_val(s, trace_event, "id", record, &id, 1); in ikm_error_handler()
403 if (config_has_id && config_my_pid == id) in ikm_error_handler()
411 trace_seq_printf(s, "%8llu ", id); in ikm_error_handler()
425 * ikm_setup_trace_instance - set up a tracing instance to collect data
427 * Create a trace instance, enable rv: events and enable the trace.
431 static struct trace_instance *ikm_setup_trace_instance(char *monitor_name) in ikm_setup_trace_instance()
449 err_msg("ikm: failed to allocate trace instance"); in ikm_setup_trace_instance()
459 retval = tracefs_event_enable(inst->inst, "rv", event); in ikm_setup_trace_instance()
463 tep_register_event_handler(inst->tep, -1, "rv", event, in ikm_setup_trace_instance()
467 retval = tracefs_event_enable(inst->inst, "rv", event); in ikm_setup_trace_instance()
471 tep_register_event_handler(inst->tep, -1, "rv", event, in ikm_setup_trace_instance()
475 tracefs_trace_on(inst->inst); in ikm_setup_trace_instance()
488 * ikm_destroy_trace_instance - destroy a previously created instance
490 static void ikm_destroy_trace_instance(struct trace_instance *inst) in ikm_destroy_trace_instance()
500 * ikm_usage_print_reactors - print all available reactors, one per line.
502 static void ikm_usage_print_reactors(void) in ikm_usage_print_reactors()
527 * ikm_usage - print usage
529 static void ikm_usage(int exit_val, char *monitor_name, const char *fmt, ...) in ikm_usage()
536 static const char *const usage[] = { in ikm_usage()
538 " -h/--help: print this menu and the reactor list", in ikm_usage()
539 " -r/--reactor 'reactor': enables the 'reactor'", in ikm_usage()
540 " -s/--self: when tracing (-t), also trace rv command", in ikm_usage()
541 " -t/--trace: trace monitor's event", in ikm_usage()
542 " -v/--verbose: print debug messages", in ikm_usage()
553 fprintf(stderr, "\n usage: rv mon %s [-h] [-q] [-r reactor] [-s] [-v]", monitor_name); in ikm_usage()
563 * parse_arguments - parse arguments and set config
565 static int parse_arguments(char *monitor_name, int argc, char **argv) in parse_arguments()
572 static struct option long_options[] = { in parse_arguments()
576 {"trace", no_argument, 0, 't'}, in parse_arguments()
587 if (c == -1) in parse_arguments()
628 * ikm_run_monitor - apply configs and run the monitor
631 * monitors were found, or -1 on error.
646 err_msg("ikm: monitor %s (in-kernel) is already enabled\n", monitor_name); in ikm_run_monitor()
647 return -1; in ikm_run_monitor()
658 return -1; in ikm_run_monitor()
666 ikm_print_header(inst->seq); in ikm_run_monitor()
670 retval = tracefs_iterate_raw_events(inst->tep, in ikm_run_monitor()
671 inst->inst, in ikm_run_monitor()
677 err_msg("ikm: error reading trace buffer\n"); in ikm_run_monitor()
697 return -1; in ikm_run_monitor()