Skip to content

Commit

Permalink
selftests/resctrl: Open perf fd before start & add error handling
Browse files Browse the repository at this point in the history
Perf fd (pe_fd) is opened, reset, and enabled during every test the CAT
selftest runs. Also, ioctl(pe_fd, ...) calls are not error checked even
if ioctl() could return an error.

Open perf fd only once before the tests and only reset and enable the
counter within the test loop. Add error checking to pe_fd ioctl()
calls.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
  • Loading branch information
Ilpo Järvinen authored and Shuah Khan committed Feb 13, 2024
1 parent 433f437 commit 2892731
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 11 deletions.
19 changes: 15 additions & 4 deletions tools/testing/selftests/resctrl/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
14 changes: 7 additions & 7 deletions tools/testing/selftests/resctrl/cat_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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");
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/resctrl/resctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 2892731

Please sign in to comment.