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 --- |