@@ -22,10 +22,19 @@ void perf_event_attr_initialize(struct perf_event_attr *pea, __u64 config)
}
/* Start counters to log values */
-static void perf_event_reset_enable(int pe_fd)
+int perf_event_reset_enable(int pe_fd)
{
- ioctl(pe_fd, PERF_EVENT_IOC_RESET, 0);
- ioctl(pe_fd, PERF_EVENT_IOC_ENABLE, 0);
+ int ret;
+
+ ret = ioctl(pe_fd, PERF_EVENT_IOC_RESET, 0);
+ if (ret < 0)
+ return ret;
+
+ ret = ioctl(pe_fd, PERF_EVENT_IOC_ENABLE, 0);
+ if (ret < 0)
+ return ret;
+
+ return 0;
}
void perf_event_initialize_read_format(struct perf_event_read *pe_read)
@@ -129,7 +138,9 @@ int perf_event_measure(int pe_fd, struct perf_event_read *pe_read,
int ret;
/* Stop counters after one span to get miss rate */
- ioctl(pe_fd, PERF_EVENT_IOC_DISABLE, 0);
+ ret = ioctl(pe_fd, PERF_EVENT_IOC_DISABLE, 0);
+ if (ret < 0)
+ return ret;
ret = read(pe_fd, pe_read, sizeof(*pe_read));
if (ret == -1) {
@@ -145,6 +145,9 @@ static int cat_test(struct resctrl_val_param *param, size_t span)
perf_event_attr_initialize(&pea, PERF_COUNT_HW_CACHE_MISSES);
perf_event_initialize_read_format(&pe_read);
+ pe_fd = perf_open(&pea, bm_pid, param->cpu_no);
+ if (pe_fd < 0)
+ return pe_fd;
/* Test runs until the callback setup() tells the test to stop. */
while (1) {
@@ -155,11 +158,10 @@ static int cat_test(struct resctrl_val_param *param, size_t span)
}
if (ret < 0)
break;
- pe_fd = perf_open(&pea, bm_pid, param->cpu_no);
- if (pe_fd < 0) {
- ret = -1;
- break;
- }
+
+ ret = perf_event_reset_enable(pe_fd);
+ if (ret)
+ goto pe_close;
if (run_fill_buf(span, memflush, operation, true)) {
fprintf(stderr, "Error-running fill buffer\n");
@@ -171,8 +173,6 @@ static int cat_test(struct resctrl_val_param *param, size_t span)
ret = perf_event_measure(pe_fd, &pe_read, param->filename, bm_pid);
if (ret)
goto pe_close;
-
- close(pe_fd);
}
return ret;
@@ -122,6 +122,7 @@ int get_core_sibling(int cpu_no);
void perf_event_attr_initialize(struct perf_event_attr *pea, __u64 config);
void perf_event_initialize_read_format(struct perf_event_read *pe_read);
int perf_open(struct perf_event_attr *pea, pid_t pid, int cpu_no);
+int perf_event_reset_enable(int pe_fd);
int perf_event_measure(int pe_fd, struct perf_event_read *pe_read,
const char *filename, int bm_pid);
int measure_llc_resctrl(const char *filename, int bm_pid);