pmu-scan.c (f24ebe8053514936d4e8cffb707af3a275fa32e5) pmu-scan.c (1eaf496ed386934f1c2439a120fe84a05194f91a)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Benchmark scanning sysfs files for PMU information.
4 *
5 * Copyright 2023 Google LLC.
6 */
7#include <stdio.h>
8#include "bench.h"

--- 30 unchanged lines hidden (view full) ---

39static struct pmu_scan_result *results;
40
41static int save_result(void)
42{
43 struct perf_pmu *pmu = NULL;
44 struct list_head *list;
45 struct pmu_scan_result *r;
46
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Benchmark scanning sysfs files for PMU information.
4 *
5 * Copyright 2023 Google LLC.
6 */
7#include <stdio.h>
8#include "bench.h"

--- 30 unchanged lines hidden (view full) ---

39static struct pmu_scan_result *results;
40
41static int save_result(void)
42{
43 struct perf_pmu *pmu = NULL;
44 struct list_head *list;
45 struct pmu_scan_result *r;
46
47 while ((pmu = perf_pmu__scan(pmu)) != NULL) {
47 while ((pmu = perf_pmus__scan(pmu)) != NULL) {
48 r = realloc(results, (nr_pmus + 1) * sizeof(*r));
49 if (r == NULL)
50 return -ENOMEM;
51
52 results = r;
53 r = results + nr_pmus;
54
55 r->name = strdup(pmu->name);

--- 7 unchanged lines hidden (view full) ---

63 list_for_each(list, &pmu->format)
64 r->nr_formats++;
65
66 pr_debug("pmu[%d] name=%s, nr_caps=%d, nr_aliases=%d, nr_formats=%d\n",
67 nr_pmus, r->name, r->nr_caps, r->nr_aliases, r->nr_formats);
68 nr_pmus++;
69 }
70
48 r = realloc(results, (nr_pmus + 1) * sizeof(*r));
49 if (r == NULL)
50 return -ENOMEM;
51
52 results = r;
53 r = results + nr_pmus;
54
55 r->name = strdup(pmu->name);

--- 7 unchanged lines hidden (view full) ---

63 list_for_each(list, &pmu->format)
64 r->nr_formats++;
65
66 pr_debug("pmu[%d] name=%s, nr_caps=%d, nr_aliases=%d, nr_formats=%d\n",
67 nr_pmus, r->name, r->nr_caps, r->nr_aliases, r->nr_formats);
68 nr_pmus++;
69 }
70
71 perf_pmu__destroy();
71 perf_pmus__destroy();
72 return 0;
73}
74
75static int check_result(void)
76{
77 struct pmu_scan_result *r;
78 struct perf_pmu *pmu;
79 struct list_head *list;
80 int nr;
81
82 for (int i = 0; i < nr_pmus; i++) {
83 r = &results[i];
72 return 0;
73}
74
75static int check_result(void)
76{
77 struct pmu_scan_result *r;
78 struct perf_pmu *pmu;
79 struct list_head *list;
80 int nr;
81
82 for (int i = 0; i < nr_pmus; i++) {
83 r = &results[i];
84 pmu = perf_pmu__find(r->name);
84 pmu = perf_pmus__find(r->name);
85 if (pmu == NULL) {
86 pr_err("Cannot find PMU %s\n", r->name);
87 return -1;
88 }
89
90 if (pmu->nr_caps != (u32)r->nr_caps) {
91 pr_err("Unmatched number of event caps in %s: expect %d vs got %d\n",
92 pmu->name, r->nr_caps, pmu->nr_caps);

--- 46 unchanged lines hidden (view full) ---

139
140 if (save_result() < 0) {
141 pr_err("Failed to initialize PMU scan result\n");
142 return -1;
143 }
144
145 for (i = 0; i < iterations; i++) {
146 gettimeofday(&start, NULL);
85 if (pmu == NULL) {
86 pr_err("Cannot find PMU %s\n", r->name);
87 return -1;
88 }
89
90 if (pmu->nr_caps != (u32)r->nr_caps) {
91 pr_err("Unmatched number of event caps in %s: expect %d vs got %d\n",
92 pmu->name, r->nr_caps, pmu->nr_caps);

--- 46 unchanged lines hidden (view full) ---

139
140 if (save_result() < 0) {
141 pr_err("Failed to initialize PMU scan result\n");
142 return -1;
143 }
144
145 for (i = 0; i < iterations; i++) {
146 gettimeofday(&start, NULL);
147 perf_pmu__scan(NULL);
147 perf_pmus__scan(NULL);
148 gettimeofday(&end, NULL);
149
150 timersub(&end, &start, &diff);
151 runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec;
152 update_stats(&stats, runtime_us);
153
154 ret = check_result();
148 gettimeofday(&end, NULL);
149
150 timersub(&end, &start, &diff);
151 runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec;
152 update_stats(&stats, runtime_us);
153
154 ret = check_result();
155 perf_pmu__destroy();
155 perf_pmus__destroy();
156 if (ret < 0)
157 break;
158 }
159
160 time_average = avg_stats(&stats);
161 time_stddev = stddev_stats(&stats);
162 pr_info(" Average PMU scanning took: %.3f usec (+- %.3f usec)\n",
163 time_average, time_stddev);

--- 19 unchanged lines hidden ---
156 if (ret < 0)
157 break;
158 }
159
160 time_average = avg_stats(&stats);
161 time_stddev = stddev_stats(&stats);
162 pr_info(" Average PMU scanning took: %.3f usec (+- %.3f usec)\n",
163 time_average, time_stddev);

--- 19 unchanged lines hidden ---