OSDN Git Service

perf evsel: Probe for precise_ip with simple attr
[uclinux-h8/linux.git] / tools / perf / util / evlist.c
index 08cedb6..ed20f43 100644 (file)
@@ -230,18 +230,33 @@ void perf_evlist__set_leader(struct perf_evlist *evlist)
        }
 }
 
-void perf_event_attr__set_max_precise_ip(struct perf_event_attr *attr)
+void perf_event_attr__set_max_precise_ip(struct perf_event_attr *pattr)
 {
-       attr->precise_ip = 3;
+       struct perf_event_attr attr = {
+               .type           = PERF_TYPE_HARDWARE,
+               .config         = PERF_COUNT_HW_CPU_CYCLES,
+               .exclude_kernel = 1,
+               .precise_ip     = 3,
+       };
 
-       while (attr->precise_ip != 0) {
-               int fd = sys_perf_event_open(attr, 0, -1, -1, 0);
+       event_attr_init(&attr);
+
+       /*
+        * Unnamed union member, not supported as struct member named
+        * initializer in older compilers such as gcc 4.4.7
+        */
+       attr.sample_period = 1;
+
+       while (attr.precise_ip != 0) {
+               int fd = sys_perf_event_open(&attr, 0, -1, -1, 0);
                if (fd != -1) {
                        close(fd);
                        break;
                }
-               --attr->precise_ip;
+               --attr.precise_ip;
        }
+
+       pattr->precise_ip = attr.precise_ip;
 }
 
 int __perf_evlist__add_default(struct perf_evlist *evlist, bool precise)