diff options
Diffstat (limited to 'tools/perf/util/evsel.c')
-rw-r--r-- | tools/perf/util/evsel.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 7132ee834e0e..f421f7cbc0d3 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -68,7 +68,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts) | |||
68 | struct perf_event_attr *attr = &evsel->attr; | 68 | struct perf_event_attr *attr = &evsel->attr; |
69 | int track = !evsel->idx; /* only the first counter needs these */ | 69 | int track = !evsel->idx; /* only the first counter needs these */ |
70 | 70 | ||
71 | attr->sample_id_all = opts->sample_id_all_avail ? 1 : 0; | 71 | attr->sample_id_all = opts->sample_id_all_missing ? 0 : 1; |
72 | attr->inherit = !opts->no_inherit; | 72 | attr->inherit = !opts->no_inherit; |
73 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | | 73 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | |
74 | PERF_FORMAT_TOTAL_TIME_RUNNING | | 74 | PERF_FORMAT_TOTAL_TIME_RUNNING | |
@@ -111,7 +111,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts) | |||
111 | if (opts->period) | 111 | if (opts->period) |
112 | attr->sample_type |= PERF_SAMPLE_PERIOD; | 112 | attr->sample_type |= PERF_SAMPLE_PERIOD; |
113 | 113 | ||
114 | if (opts->sample_id_all_avail && | 114 | if (!opts->sample_id_all_missing && |
115 | (opts->sample_time || opts->system_wide || | 115 | (opts->sample_time || opts->system_wide || |
116 | !opts->no_inherit || opts->cpu_list)) | 116 | !opts->no_inherit || opts->cpu_list)) |
117 | attr->sample_type |= PERF_SAMPLE_TIME; | 117 | attr->sample_type |= PERF_SAMPLE_TIME; |
@@ -126,11 +126,15 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts) | |||
126 | attr->watermark = 0; | 126 | attr->watermark = 0; |
127 | attr->wakeup_events = 1; | 127 | attr->wakeup_events = 1; |
128 | } | 128 | } |
129 | if (opts->branch_stack) { | ||
130 | attr->sample_type |= PERF_SAMPLE_BRANCH_STACK; | ||
131 | attr->branch_sample_type = opts->branch_stack; | ||
132 | } | ||
129 | 133 | ||
130 | attr->mmap = track; | 134 | attr->mmap = track; |
131 | attr->comm = track; | 135 | attr->comm = track; |
132 | 136 | ||
133 | if (opts->target_pid == -1 && opts->target_tid == -1 && !opts->system_wide) { | 137 | if (!opts->target_pid && !opts->target_tid && !opts->system_wide) { |
134 | attr->disabled = 1; | 138 | attr->disabled = 1; |
135 | attr->enable_on_exec = 1; | 139 | attr->enable_on_exec = 1; |
136 | } | 140 | } |
@@ -536,7 +540,7 @@ int perf_event__parse_sample(const union perf_event *event, u64 type, | |||
536 | } | 540 | } |
537 | 541 | ||
538 | if (type & PERF_SAMPLE_READ) { | 542 | if (type & PERF_SAMPLE_READ) { |
539 | fprintf(stderr, "PERF_SAMPLE_READ is unsuported for now\n"); | 543 | fprintf(stderr, "PERF_SAMPLE_READ is unsupported for now\n"); |
540 | return -1; | 544 | return -1; |
541 | } | 545 | } |
542 | 546 | ||
@@ -576,6 +580,16 @@ int perf_event__parse_sample(const union perf_event *event, u64 type, | |||
576 | data->raw_data = (void *) pdata; | 580 | data->raw_data = (void *) pdata; |
577 | } | 581 | } |
578 | 582 | ||
583 | if (type & PERF_SAMPLE_BRANCH_STACK) { | ||
584 | u64 sz; | ||
585 | |||
586 | data->branch_stack = (struct branch_stack *)array; | ||
587 | array++; /* nr */ | ||
588 | |||
589 | sz = data->branch_stack->nr * sizeof(struct branch_entry); | ||
590 | sz /= sizeof(u64); | ||
591 | array += sz; | ||
592 | } | ||
579 | return 0; | 593 | return 0; |
580 | } | 594 | } |
581 | 595 | ||