From: "Steven Rostedt (Google)" <rostedt@xxxxxxxxxxx> Sometimes the only thing that is needed from the tracefs directory is how to parse the sub-buffers. The tracefs_fill_local_events() has a lot of overhead as it reads pretty much everything. But if the only thing needed is the header file parsing, add this helper function to do it. Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx> --- Documentation/libtracefs-events-tep.txt | 7 ++++++- Documentation/libtracefs.txt | 1 + include/tracefs.h | 2 ++ src/tracefs-events.c | 22 ++++++++++++++++++++++ src/tracefs-record.c | 9 +-------- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Documentation/libtracefs-events-tep.txt b/Documentation/libtracefs-events-tep.txt index 22d3dd5fdfd0..ba46532a8db1 100644 --- a/Documentation/libtracefs-events-tep.txt +++ b/Documentation/libtracefs-events-tep.txt @@ -4,7 +4,7 @@ libtracefs(3) NAME ---- tracefs_local_events, tracefs_local_events_system, tracefs_fill_local_events, -tracefs_load_cmdlines - +tracefs_load_cmdlines, tracefs_load_headers - Initialize a tep handler with trace events from the local system. SYNOPSIS @@ -17,6 +17,7 @@ struct tep_handle pass:[*]*tracefs_local_events*(const char pass:[*]_tracing_dir struct tep_handle pass:[*]*tracefs_local_events_system*(const char pass:[*]_tracing_dir_, const char pass:[*] const pass:[*]_sys_names_); int *tracefs_fill_local_events*(const char pass:[*]_tracing_dir_, struct tep_handle pass:[*]_tep_, int pass:[*]_parsing_failures_); int *tracefs_load_cmdlines*(const char pass:[*]_tracing_dir_, struct tep_handle pass:[*]_tep_); +int *tracefs_load_headers*(const char pass:[*]_tracing_dir_, struct tep_handle pass:[*]_tep_); -- DESCRIPTION @@ -55,6 +56,10 @@ The *tracefs_load_cmdlines()* does just that. The _tracing_dir_ is the directory of the mount point to load from, or NULL to use the mount point of the tracefs file system. +The *tracefs_load_headers()* will reade the "header_page" of the events +directory that will update the _tep_ handle with information on how to parse the +tracing ring buffer sub-buffer. + RETURN VALUE ------------ The *tracefs_local_events()* and *tracefs_local_events_system()* functions diff --git a/Documentation/libtracefs.txt b/Documentation/libtracefs.txt index 273423cecf4a..70bd8116b2b1 100644 --- a/Documentation/libtracefs.txt +++ b/Documentation/libtracefs.txt @@ -80,6 +80,7 @@ Trace events: struct tep_handle pass:[*]*tracefs_local_events_system*(const char pass:[*]_tracing_dir_, const char pass:[*] const pass:[*]_sys_names_); int *tracefs_fill_local_events*(const char pass:[*]_tracing_dir_, struct tep_handle pass:[*]_tep_, int pass:[*]_parsing_failures_); int *tracefs_load_cmdlines*(const char pass:[*]_tracing_dir_, struct tep_handle pass:[*]_tep_); + int *tracefs_load_headers*(const char pass:[*]_tracing_dir_, struct tep_handle pass:[*]_tep_); char pass:[*]*tracefs_event_get_file*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_system_, const char pass:[*]_event_, const char pass:[*]_file_); char pass:[*]*tracefs_event_file_read*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_system_, const char pass:[*]_event_, diff --git a/include/tracefs.h b/include/tracefs.h index 31aba92d9a16..95bff1f244f9 100644 --- a/include/tracefs.h +++ b/include/tracefs.h @@ -180,6 +180,8 @@ int tracefs_fill_local_events(const char *tracing_dir, int tracefs_load_cmdlines(const char *tracing_dir, struct tep_handle *tep); +int tracefs_load_headers(const char *tracing_dir, struct tep_handle *tep); + char *tracefs_get_clock(struct tracefs_instance *instance); enum tracefs_option_id { diff --git a/src/tracefs-events.c b/src/tracefs-events.c index 2e87f9aa3af7..413c2df19998 100644 --- a/src/tracefs-events.c +++ b/src/tracefs-events.c @@ -1216,6 +1216,28 @@ int tracefs_load_cmdlines(const char *tracing_dir, struct tep_handle *tep) return load_saved_cmdlines(tracing_dir, tep, true); } +/** + * tracefs_load_headers - load just the headers into a tep handle + * @tracing_dir: The directory to load from (NULL to figure it out) + * @tep: The tep handle to load the headers into. + * + * Updates the @tep handle with the event and sub-buffer header + * information. + * + * Returns 0 on success and -1 on error. + */ +int tracefs_load_headers(const char *tracing_dir, struct tep_handle *tep) +{ + int ret; + + if (!tracing_dir) + tracing_dir = tracefs_tracing_dir(); + + ret = read_header(tep, tracing_dir); + + return ret < 0 ? -1 : 0; +} + static int fill_local_events_system(const char *tracing_dir, struct tep_handle *tep, const char * const *sys_names, diff --git a/src/tracefs-record.c b/src/tracefs-record.c index bfeae18fd77f..1eede996631d 100644 --- a/src/tracefs-record.c +++ b/src/tracefs-record.c @@ -110,10 +110,8 @@ tracefs_cpu_open(struct tracefs_instance *instance, int cpu, bool nonblock) struct tep_handle *tep; struct kbuffer *kbuf; char path[128]; - char *buf; int mode = O_RDONLY; int subbuf_size; - int len; int ret; int fd; @@ -131,12 +129,7 @@ tracefs_cpu_open(struct tracefs_instance *instance, int cpu, bool nonblock) goto fail; /* Get the size of the page */ - buf = tracefs_instance_file_read(NULL, "events/header_page", &len); - if (!buf) - goto fail; - - ret = tep_parse_header_page(tep, buf, len, sizeof(long)); - free(buf); + ret = tracefs_load_headers(NULL, tep); if (ret < 0) goto fail; -- 2.42.0