Merge remote-tracking branch 'torvalds/master' into perf/core
[sfrench/cifs-2.6.git] / tools / perf / util / evsel.c
index 9e8a1294c9818f0fccced4735e26565c93851f3a..999dd1700502cec6394ebdbbea49ea5e43c06de0 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/bitops.h>
 #include <api/fs/fs.h>
 #include <api/fs/tracing_path.h>
-#include <traceevent/event-parse.h>
 #include <linux/hw_breakpoint.h>
 #include <linux/perf_event.h>
 #include <linux/compiler.h>
 #include "string2.h"
 #include "memswap.h"
 #include "util.h"
-#ifdef HAVE_LIBBPF_SUPPORT
-#include <bpf/hashmap.h>
-#else
 #include "util/hashmap.h"
-#endif
 #include "pmu-hybrid.h"
 #include "off_cpu.h"
 #include "../perf-sys.h"
 #include "util/parse-branch-options.h"
 #include <internal/xyarray.h>
 #include <internal/lib.h>
+#include <internal/threadmap.h>
 
 #include <linux/ctype.h>
 
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
 struct perf_missing_features perf_missing_features;
 
 static clockid_t clockid;
@@ -442,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
                        goto out_err;
        }
        evsel->cgrp = cgroup__get(orig->cgrp);
+#ifdef HAVE_LIBTRACEEVENT
        evsel->tp_format = orig->tp_format;
+#endif
        evsel->handler = orig->handler;
        evsel->core.leader = orig->core.leader;
 
@@ -467,6 +469,7 @@ struct evsel *evsel__clone(struct evsel *orig)
        evsel->collect_stat = orig->collect_stat;
        evsel->weak_group = orig->weak_group;
        evsel->use_config_name = orig->use_config_name;
+       evsel->pmu = orig->pmu;
 
        if (evsel__copy_config_terms(evsel, orig) < 0)
                goto out_err;
@@ -481,6 +484,7 @@ out_err:
 /*
  * Returns pointer with encoded error via <linux/err.h> interface.
  */
+#ifdef HAVE_LIBTRACEEVENT
 struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
 {
        struct evsel *evsel = zalloc(perf_evsel__object.size);
@@ -518,6 +522,7 @@ out_free:
 out_err:
        return ERR_PTR(err);
 }
+#endif
 
 const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
        "cycles",
@@ -1525,13 +1530,8 @@ void evsel__compute_deltas(struct evsel *evsel, int cpu_map_idx, int thread,
        if (!evsel->prev_raw_counts)
                return;
 
-       if (cpu_map_idx == -1) {
-               tmp = evsel->prev_raw_counts->aggr;
-               evsel->prev_raw_counts->aggr = *count;
-       } else {
-               tmp = *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread);
-               *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread) = *count;
-       }
+       tmp = *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread);
+       *perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread) = *count;
 
        count->val = count->val - tmp.val;
        count->ena = count->ena - tmp.ena;
@@ -1966,17 +1966,16 @@ bool evsel__detect_missing_features(struct evsel *evsel)
                perf_missing_features.mmap2 = true;
                pr_debug2_peo("switching off mmap2\n");
                return true;
-       } else if ((evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host) &&
-                  (evsel->pmu == NULL || evsel->pmu->missing_features.exclude_guest)) {
-               if (evsel->pmu == NULL) {
+       } else if (evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host) {
+               if (evsel->pmu == NULL)
                        evsel->pmu = evsel__find_pmu(evsel);
-                       if (evsel->pmu)
-                               evsel->pmu->missing_features.exclude_guest = true;
-                       else {
-                               /* we cannot find PMU, disable attrs now */
-                               evsel->core.attr.exclude_host = false;
-                               evsel->core.attr.exclude_guest = false;
-                       }
+
+               if (evsel->pmu)
+                       evsel->pmu->missing_features.exclude_guest = true;
+               else {
+                       /* we cannot find PMU, disable attrs now */
+                       evsel->core.attr.exclude_host = false;
+                       evsel->core.attr.exclude_guest = false;
                }
 
                if (evsel->exclude_GH) {
@@ -2328,11 +2327,8 @@ u64 evsel__bitfield_swap_branch_flags(u64 value)
         * as it has variable bit-field sizes. Instead the
         * macro takes the bit-field position/size,
         * swaps it based on the host endianness.
-        *
-        * tep_is_bigendian() is used here instead of
-        * bigendian() to avoid python test fails.
         */
-       if (tep_is_bigendian()) {
+       if (host_is_bigendian()) {
                new_val = bitfield_swap(value, 0, 1);
                new_val |= bitfield_swap(value, 1, 1);
                new_val |= bitfield_swap(value, 2, 1);
@@ -2769,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
        return size;
 }
 
+#ifdef HAVE_LIBTRACEEVENT
 struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
 {
        return tep_find_field(evsel->tp_format, name);
@@ -2787,8 +2784,10 @@ void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char
        if (field->flags & TEP_FIELD_IS_DYNAMIC) {
                offset = *(int *)(sample->raw_data + field->offset);
                offset &= 0xffff;
+#ifdef HAVE_LIBTRACEEVENT_TEP_FIELD_IS_RELATIVE
                if (field->flags & TEP_FIELD_IS_RELATIVE)
                        offset += field->offset + field->size;
+#endif
        }
 
        return sample->raw_data + offset;
@@ -2842,6 +2841,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
 
        return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
 }
+#endif
 
 bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
 {
@@ -3129,7 +3129,7 @@ void evsel__zero_per_pkg(struct evsel *evsel)
        }
 }
 
-bool evsel__is_hybrid(struct evsel *evsel)
+bool evsel__is_hybrid(const struct evsel *evsel)
 {
        return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name);
 }