perf record: Replace option --bpf-event with --no-bpf-event
[linux-2.6-microblaze.git] / tools / perf / util / evsel.c
index dbc0466..7835e05 100644 (file)
@@ -294,20 +294,12 @@ struct perf_evsel *perf_evsel__new_cycles(bool precise)
 
        if (!precise)
                goto new_event;
-       /*
-        * Unnamed union member, not supported as struct member named
-        * initializer in older compilers such as gcc 4.4.7
-        *
-        * Just for probing the precise_ip:
-        */
-       attr.sample_period = 1;
 
        perf_event_attr__set_max_precise_ip(&attr);
        /*
         * Now let the usual logic to set up the perf_event_attr defaults
         * to kick in when we return and before perf_evsel__open() is called.
         */
-       attr.sample_period = 0;
 new_event:
        evsel = perf_evsel__new(&attr);
        if (evsel == NULL)
@@ -956,6 +948,14 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
                attr->sample_freq    = 0;
                attr->sample_period  = 0;
                attr->write_backward = 0;
+
+               /*
+                * We don't get sample for slave events, we make them
+                * when delivering group leader sample. Set the slave
+                * event to follow the master sample_type to ease up
+                * report.
+                */
+               attr->sample_type = leader->attr.sample_type;
        }
 
        if (opts->no_samples)
@@ -1035,6 +1035,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
        attr->mmap  = track;
        attr->mmap2 = track && !perf_missing_features.mmap2;
        attr->comm  = track;
+       attr->ksymbol = track && !perf_missing_features.ksymbol;
+       attr->bpf_event = track && !opts->no_bpf_event &&
+               !perf_missing_features.bpf_event;
 
        if (opts->record_namespaces)
                attr->namespaces  = track;
@@ -1289,6 +1292,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)
 {
        assert(list_empty(&evsel->node));
        assert(evsel->evlist == NULL);
+       perf_evsel__free_counts(evsel);
        perf_evsel__free_fd(evsel);
        perf_evsel__free_id(evsel);
        perf_evsel__free_config_terms(evsel);
@@ -1339,10 +1343,9 @@ void perf_counts_values__scale(struct perf_counts_values *count,
                        count->val = 0;
                } else if (count->run < count->ena) {
                        scaled = 1;
-                       count->val = (u64)((double) count->val * count->ena / count->run + 0.5);
+                       count->val = (u64)((double) count->val * count->ena / count->run);
                }
-       } else
-               count->ena = count->run = 0;
+       }
 
        if (pscaled)
                *pscaled = scaled;
@@ -1652,6 +1655,8 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
        PRINT_ATTRf(context_switch, p_unsigned);
        PRINT_ATTRf(write_backward, p_unsigned);
        PRINT_ATTRf(namespaces, p_unsigned);
+       PRINT_ATTRf(ksymbol, p_unsigned);
+       PRINT_ATTRf(bpf_event, p_unsigned);
 
        PRINT_ATTRn("{ wakeup_events, wakeup_watermark }", wakeup_events, p_unsigned);
        PRINT_ATTRf(bp_type, p_unsigned);
@@ -1811,6 +1816,10 @@ fallback_missing_features:
                                     PERF_SAMPLE_BRANCH_NO_CYCLES);
        if (perf_missing_features.group_read && evsel->attr.inherit)
                evsel->attr.read_format &= ~(PERF_FORMAT_GROUP|PERF_FORMAT_ID);
+       if (perf_missing_features.ksymbol)
+               evsel->attr.ksymbol = 0;
+       if (perf_missing_features.bpf_event)
+               evsel->attr.bpf_event = 0;
 retry_sample_id:
        if (perf_missing_features.sample_id_all)
                evsel->attr.sample_id_all = 0;
@@ -1930,7 +1939,15 @@ try_fallback:
         * Must probe features in the order they were added to the
         * perf_event_attr interface.
         */
-       if (!perf_missing_features.write_backward && evsel->attr.write_backward) {
+       if (!perf_missing_features.bpf_event && evsel->attr.bpf_event) {
+               perf_missing_features.bpf_event = true;
+               pr_debug2("switching off bpf_event\n");
+               goto fallback_missing_features;
+       } else if (!perf_missing_features.ksymbol && evsel->attr.ksymbol) {
+               perf_missing_features.ksymbol = true;
+               pr_debug2("switching off ksymbol\n");
+               goto fallback_missing_features;
+       } else if (!perf_missing_features.write_backward && evsel->attr.write_backward) {
                perf_missing_features.write_backward = true;
                pr_debug2("switching off write_backward\n");
                goto out_close;