]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - tools/perf/util/header.c
perf tools: Add event_update event unit type
[mirror_ubuntu-bionic-kernel.git] / tools / perf / util / header.c
index 6b4e00220a5a1e22800819bc82fe65f1f9bc8f0b..5759ebfde6667c62c6b2c5fb2cca5f1975b6ebc5 100644 (file)
@@ -2686,6 +2686,43 @@ int perf_event__synthesize_attr(struct perf_tool *tool,
        return err;
 }
 
+static struct event_update_event *
+event_update_event__new(size_t size, u64 type, u64 id)
+{
+       struct event_update_event *ev;
+
+       size += sizeof(*ev);
+       size  = PERF_ALIGN(size, sizeof(u64));
+
+       ev = zalloc(size);
+       if (ev) {
+               ev->header.type = PERF_RECORD_EVENT_UPDATE;
+               ev->header.size = (u16)size;
+               ev->type = type;
+               ev->id = id;
+       }
+       return ev;
+}
+
+int
+perf_event__synthesize_event_update_unit(struct perf_tool *tool,
+                                        struct perf_evsel *evsel,
+                                        perf_event__handler_t process)
+{
+       struct event_update_event *ev;
+       size_t size = strlen(evsel->unit);
+       int err;
+
+       ev = event_update_event__new(size + 1, PERF_EVENT_UPDATE__UNIT, evsel->id[0]);
+       if (ev == NULL)
+               return -ENOMEM;
+
+       strncpy(ev->data, evsel->unit, size);
+       err = process(tool, (union perf_event *)ev, NULL, NULL);
+       free(ev);
+       return err;
+}
+
 int perf_event__synthesize_attrs(struct perf_tool *tool,
                                   struct perf_session *session,
                                   perf_event__handler_t process)
@@ -2762,6 +2799,13 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
        if (evsel == NULL)
                return -EINVAL;
 
+       switch (ev->type) {
+       case PERF_EVENT_UPDATE__UNIT:
+               evsel->unit = strdup(ev->data);
+       default:
+               break;
+       }
+
        return 0;
 }