@@ -16,6 +16,7 @@
#include <libcxl.h>
#include <uuid/uuid.h>
#include <traceevent/event-parse.h>
+#include <tracefs/tracefs.h>
#include "json.h"
#include "event_trace.h"
@@ -164,3 +165,38 @@ err_jevent:
free(jnode);
return rc;
}
+
+static int cxl_event_parse_cb(struct tep_event *event, struct tep_record *record,
+ int cpu, void *ctx)
+{
+ struct event_ctx *event_ctx = (struct event_ctx *)ctx;
+
+ /* Filter out all the events that the caller isn't interested in. */
+ if (strcmp(event->system, event_ctx->system) != 0)
+ return 0;
+
+ if (event_ctx->event_name) {
+ if (strcmp(event->name, event_ctx->event_name) != 0)
+ return 0;
+ }
+
+ if (event_ctx->parse_event)
+ return event_ctx->parse_event(event, record, &event_ctx->jlist_head);
+
+ return cxl_event_to_json_callback(event, record, &event_ctx->jlist_head);
+}
+
+int cxl_parse_events(struct tracefs_instance *inst, struct event_ctx *ectx)
+{
+ struct tep_handle *tep;
+ int rc;
+
+ tep = tracefs_local_events(NULL);
+ if (!tep)
+ return -ENOMEM;
+
+ rc = tracefs_iterate_raw_events(tep, inst, NULL, 0,
+ cxl_event_parse_cb, ectx);
+ tep_free(tep);
+ return rc;
+}
@@ -11,4 +11,14 @@ struct jlist_node {
struct list_node list;
};
+struct event_ctx {
+ const char *system;
+ struct list_head jlist_head;
+ const char *event_name; /* optional */
+ int (*parse_event)(struct tep_event *event, struct tep_record *record,
+ struct list_head *jlist_head); /* optional */
+};
+
+int cxl_parse_events(struct tracefs_instance *inst, struct event_ctx *ectx);
+
#endif
@@ -21,6 +21,7 @@ cxl_tool = executable('cxl',
json,
versiondep,
traceevent,
+ tracefs,
],
install : true,
install_dir : rootbindir,
@@ -143,6 +143,8 @@ libudev = dependency('libudev')
uuid = dependency('uuid')
json = dependency('json-c')
traceevent = dependency('libtraceevent')
+tracefs = dependency('libtracefs')
+
if get_option('docs').enabled()
if get_option('asciidoctor').enabled()
asciidoc = find_program('asciidoctor', required : true)
Add common function to iterate through and extract the events in the current trace buffer. The function uses tracefs_iterate_raw_events() from libtracefs to go through all the events loaded into a tep_handle. A callback is provided to the API call in order to parse the event. For cxl monitor, an array of interested "systems" is provided in order to filter for the interested events. Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- cxl/event_trace.c | 36 ++++++++++++++++++++++++++++++++++++ cxl/event_trace.h | 10 ++++++++++ cxl/meson.build | 1 + meson.build | 2 ++ 4 files changed, 49 insertions(+)