[PATCH 42/73] tools lib traceevent: Man pages for event filter APIs

From: Arnaldo Carvalho de Melo
Date: Fri May 17 2019 - 15:41:44 EST

From: Tzvetomir Stoyanov <tstoyanov@xxxxxxxxxx>

Added new man pages, describing libtraceevent event filter APIs:


Signed-off-by: Tzvetomir Stoyanov <tstoyanov@xxxxxxxxxx>
Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
Cc: linux-trace-devel@xxxxxxxxxxxxxxx
Link: http://lore.kernel.org/linux-trace-devel/20190503091119.23399-23-tstoyanov@xxxxxxxxxx
Link: http://lkml.kernel.org/r/20190510200109.638838141@xxxxxxxxxxx
Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx>
Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
.../Documentation/libtraceevent-filter.txt | 209 ++++++++++++++++++
1 file changed, 209 insertions(+)
create mode 100644 tools/lib/traceevent/Documentation/libtraceevent-filter.txt

diff --git a/tools/lib/traceevent/Documentation/libtraceevent-filter.txt b/tools/lib/traceevent/Documentation/libtraceevent-filter.txt
new file mode 100644
index 000000000000..4a9962d8cb59
--- /dev/null
+++ b/tools/lib/traceevent/Documentation/libtraceevent-filter.txt
@@ -0,0 +1,209 @@
+tep_filter_alloc, tep_filter_free, tep_filter_reset, tep_filter_make_string,
+tep_filter_copy, tep_filter_compare, tep_filter_match, tep_event_filtered,
+tep_filter_remove_event, tep_filter_strerror, tep_filter_add_filter_str -
+Event filter related APIs.
+*#include <event-parse.h>*
+struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
+void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
+void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
+enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
+int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
+int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
+enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
+int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
+int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
+char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
+int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
+Filters can be attached to traced events. They can be used to filter out various
+events when outputting them. Each event can be filtered based on its parameters,
+described in the event's format file. This set of functions can be used to
+create, delete, modify and attach event filters.
+The _tep_filter_alloc()_ function creates a new event filter. The _tep_ argument
+is the trace event parser context.
+The _tep_filter_free()_ function frees an event filter and all resources that it
+had used.
+The _tep_filter_reset()_ function removes all rules from an event filter and
+resets it.
+The _tep_filter_add_filter_str()_ function adds a new rule to the _filter_. The
+_filter_str_ argument is the filter string, that contains the rule.
+The _tep_event_filtered()_ function checks if the event with _event_id_ has
+The _tep_filter_remove_event()_ function removes a _filter_ for an event with
+The _tep_filter_match()_ function tests if a _record_ matches given _filter_.
+The _tep_filter_copy()_ function copies a _source_ filter into a _dest_ filter.
+The _tep_filter_compare()_ function compares two filers - _filter1_ and _filter2_.
+The _tep_filter_make_string()_ function constructs a string, displaying
+the _filter_ contents for given _event_id_.
+The _tep_filter_strerror()_ function copies the _filter_ error buffer into the
+given _buf_ with the size _buflen_. If the error buffer is empty, in the _buf_
+is copied a string, describing the error _err_.
+The _tep_filter_alloc()_ function returns a pointer to the newly created event
+filter, or NULL in case of an error.
+The _tep_filter_add_filter_str()_ function returns 0 if the rule was
+successfully added or a negative error code. Use _tep_filter_strerror()_ to see
+actual error message in case of an error.
+The _tep_event_filtered()_ function returns 1 if the filter is found for given
+event, or 0 otherwise.
+The _tep_filter_remove_event()_ function returns 1 if the vent was removed, or
+0 if the event was not found.
+The _tep_filter_match()_ function returns _tep_errno_, according to the result:
+_pass:[TEP_ERRNO__FILTER_MATCH]_ - filter found for event, the record matches.
+_pass:[TEP_ERRNO__FILTER_MISS]_ - filter found for event, the record does not match.
+_pass:[TEP_ERRNO__FILTER_NOT_FOUND]_ - no filter found for record's event.
+_pass:[TEP_ERRNO__NO_FILTER]_ - no rules in the filter.
+or any other _tep_errno_, if an error occurred during the test.
+The _tep_filter_copy()_ function returns 0 on success or -1 if not all rules
+ were copied.
+The _tep_filter_compare()_ function returns 1 if the two filters hold the same
+content, or 0 if they do not.
+The _tep_filter_make_string()_ function returns a string, which must be freed
+with free(), or NULL in case of an error.
+The _tep_filter_strerror()_ function returns 0 if message was filled
+successfully, or -1 in case of an error.
+#include <event-parse.h>
+struct tep_handle *tep = tep_alloc();
+char errstr[200];
+int ret;
+struct tep_event_filter *filter = tep_filter_alloc(tep);
+struct tep_event_filter *filter1 = tep_filter_alloc(tep);
+ret = tep_filter_add_filter_str(filter, "sched/sched_wakeup:target_cpu==1");
+if(ret < 0) {
+ tep_filter_strerror(filter, ret, errstr, sizeof(errstr));
+ /* Failed to add a new rule to the filter, the error string is in errstr */
+if (tep_filter_copy(filter1, filter) != 0) {
+ /* Failed to copy filter in filter1 */
+if (tep_filter_compare(filter, filter1) != 1) {
+ /* Both filters are different */
+void process_record(struct tep_handle *tep, struct tep_record *record)
+ struct tep_event *event;
+ char *fstring;
+ event = tep_find_event_by_record(tep, record);
+ if (tep_event_filtered(filter, event->id) == 1) {
+ /* The event has filter */
+ fstring = tep_filter_make_string(filter, event->id);
+ if (fstring != NULL) {
+ /* The filter for the event is in fstring */
+ free(fstring);
+ }
+ }
+ switch (tep_filter_match(filter, record)) {
+ /* The filter matches the record */
+ break;
+ /* The filter does not match the record */
+ break;
+ /* No filter found for record's event */
+ break;
+ /* There are no rules in the filter */
+ break
+ default:
+ /* An error occurred during the test */
+ break;
+ }
+ if (tep_filter_remove_event(filter, event->id) == 1) {
+ /* The event was removed from the filter */
+ }
+ Header file to include in order to have access to the library APIs.
+ Linker switch to add when building a program that uses the library.
+_libtraceevent(3)_, _trace-cmd(1)_
+*Steven Rostedt* <rostedt@xxxxxxxxxxx>, author of *libtraceevent*.
+*Tzvetomir Stoyanov* <tz.stoyanov@xxxxxxxxx>, author of this man page.
+Report bugs to <linux-trace-devel@xxxxxxxxxxxxxxx>
+libtraceevent is Free Software licensed under the GNU LGPL 2.1