perf: Track the perf_context when converting
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 May 2016 16:48:45 +0000 (12:48 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jun 2016 15:48:37 +0000 (11:48 -0400)
perfconv.c was originally its own program, completely decoupled from the
rest of perf.  It got its info from the kernel only, which limits the
things we can do with it.  For instance, any accounting info or parameters
for a perf event would need to be communicated to the kernel and then
shipped back out to userspace to be reported.  This design is rather
lacking.

Now we'll keep track of the perf_context, so that we can look up the
original perf_event during conversion time.  This is similar to tracking
the perf_event_attr throughout the life of the perf run.  That's something
Linux does internally, so it makes sense for us to do it in our perf.

For an example of where the old system failed, we don't know the
sample_period for any given event.  The kernel only gives us 64 bits per
event, and that doesn't include pev->trigger_count.  That was submitted to
the kernel, but subsequently lost.  Userspace still knows what it asked
for, and the kernel also knows, but it disappears as we flow through the
system.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/profile/perf/perf.c
tools/profile/perf/perfconv.c
tools/profile/perf/perfconv.h

index bef9847..b1c69ee 100644 (file)
@@ -114,7 +114,6 @@ int main(int argc, char *argv[])
        const char *events[MAX_CPU_EVENTS];
 
        ros_get_all_cores_set(&cores);
-       cctx = perfconv_create_context();
 
        for (i = 2; i < argc; i++) {
                if (!strcmp(argv[i], "-m")) {
@@ -155,6 +154,7 @@ int main(int argc, char *argv[])
 
        perf_initialize(argc, argv);
        pctx = perf_create_context(&perf_cfg);
+       cctx = perfconv_create_context(pctx);
 
        if (!strcmp(cmd, "list")) {
                perf_show_events(show_rx, stdout);
index 27377b0..6ac3b0c 100644 (file)
@@ -499,10 +499,11 @@ static void add_event_type(struct mem_file *mf, uint64_t id, const char *name)
        mem_file_write(mf, &evt, sizeof(evt), 0);
 }
 
-struct perfconv_context *perfconv_create_context(void)
+struct perfconv_context *perfconv_create_context(struct perf_context *pctx)
 {
        struct perfconv_context *cctx = xzmalloc(sizeof(struct perfconv_context));
 
+       cctx->pctx = pctx;
        xmem_arena_init(&cctx->ma, 0);
        cctx->alloced_events = 128;
        cctx->events = xmem_arena_zalloc(
index 1071568..c64d20b 100644 (file)
@@ -60,6 +60,7 @@ struct perf_event_id {
 };
 
 struct perfconv_context {
+       struct perf_context *pctx;
        struct mem_arena ma;
        int debug_level;
        struct static_mmap64 *static_mmaps;
@@ -71,7 +72,7 @@ struct perfconv_context {
        struct mem_file fhdrs, misc, attrs, data, event_types;
 };
 
-struct perfconv_context *perfconv_create_context(void);
+struct perfconv_context *perfconv_create_context(struct perf_context *pctx);
 void perfconv_free_context(struct perfconv_context *cctx);
 void perfconv_set_dbglevel(int level, struct perfconv_context *cctx);
 void perfconv_add_kernel_mmap(struct perfconv_context *cctx);