summaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_dynevent.h
diff options
context:
space:
mode:
authorTom Zanussi <zanussi@kernel.org>2020-01-29 19:59:24 +0100
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2020-01-30 15:46:28 +0100
commit86c5426baddae9ff192e3159b9c2e7c14e3964c6 (patch)
tree8b88a510fc8b50de5323b4e5644e56ec2315cd7b /kernel/trace/trace_dynevent.h
parenttracing: Add synth_event_delete() (diff)
downloadlinux-86c5426baddae9ff192e3159b9c2e7c14e3964c6.tar.xz
linux-86c5426baddae9ff192e3159b9c2e7c14e3964c6.zip
tracing: Add dynamic event command creation interface
Add an interface used to build up dynamic event creation commands, such as synthetic and kprobe events. Interfaces specific to those particular types of events and others can be built on top of this interface. Command creation is started by first using the dynevent_cmd_init() function to initialize the dynevent_cmd object. Following that, args are appended and optionally checked by the dynevent_arg_add() and dynevent_arg_pair_add() functions, which use objects representing arguments and pairs of arguments, initialized respectively by dynevent_arg_init() and dynevent_arg_pair_init(). Finally, once all args have been successfully added, the command is finalized and actually created using dynevent_create(). The code here for actually printing into the dyn_event->cmd buffer using snprintf() etc was adapted from v4 of Masami's 'tracing/boot: Add synthetic event support' patch. Link: http://lkml.kernel.org/r/1f65fa44390b6f238f6036777c3784ced1dcc6a0.1580323897.git.zanussi@kernel.org Signed-off-by: Tom Zanussi <zanussi@kernel.org> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace_dynevent.h')
-rw-r--r--kernel/trace/trace_dynevent.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/kernel/trace/trace_dynevent.h b/kernel/trace/trace_dynevent.h
index 46898138d2df..b593fc34c5b1 100644
--- a/kernel/trace/trace_dynevent.h
+++ b/kernel/trace/trace_dynevent.h
@@ -117,4 +117,37 @@ int dyn_event_release(int argc, char **argv, struct dyn_event_operations *type);
#define for_each_dyn_event_safe(pos, n) \
list_for_each_entry_safe(pos, n, &dyn_event_list, list)
+extern void dynevent_cmd_init(struct dynevent_cmd *cmd, char *buf, int maxlen,
+ enum dynevent_type type,
+ dynevent_create_fn_t run_command);
+
+typedef int (*dynevent_check_arg_fn_t)(void *data);
+
+struct dynevent_arg {
+ const char *str;
+ char separator; /* e.g. ';', ',', or nothing */
+ dynevent_check_arg_fn_t check_arg;
+};
+
+extern void dynevent_arg_init(struct dynevent_arg *arg,
+ dynevent_check_arg_fn_t check_arg,
+ char separator);
+extern int dynevent_arg_add(struct dynevent_cmd *cmd,
+ struct dynevent_arg *arg);
+
+struct dynevent_arg_pair {
+ const char *lhs;
+ const char *rhs;
+ char operator; /* e.g. '=' or nothing */
+ char separator; /* e.g. ';', ',', or nothing */
+ dynevent_check_arg_fn_t check_arg;
+};
+
+extern void dynevent_arg_pair_init(struct dynevent_arg_pair *arg_pair,
+ dynevent_check_arg_fn_t check_arg,
+ char operator, char separator);
+extern int dynevent_arg_pair_add(struct dynevent_cmd *cmd,
+ struct dynevent_arg_pair *arg_pair);
+extern int dynevent_str_add(struct dynevent_cmd *cmd, const char *str);
+
#endif