Commit 6c8cb747 authored by Ilpo Järvinen's avatar Ilpo Järvinen Committed by Shuah Khan

selftests/resctrl: Restore the CPU affinity after CAT test

CAT test does not reset the CPU affinity after the benchmark.
This is relatively harmless as is because CAT test is the last
benchmark to run, however, more tests may be added later.

Store the CPU affinity the first time taskset_benchmark() is run and
add taskset_restore() which the test can call to reset the CPU mask to
its original value.
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 205de6dd
...@@ -156,6 +156,7 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long ...@@ -156,6 +156,7 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
char *resctrl_val = param->resctrl_val; char *resctrl_val = param->resctrl_val;
struct perf_event_read pe_read; struct perf_event_read pe_read;
struct perf_event_attr pea; struct perf_event_attr pea;
cpu_set_t old_affinity;
unsigned char *buf; unsigned char *buf;
char schemata[64]; char schemata[64];
int ret, i, pe_fd; int ret, i, pe_fd;
...@@ -167,7 +168,7 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long ...@@ -167,7 +168,7 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
bm_pid = getpid(); bm_pid = getpid();
/* Taskset benchmark to specified cpu */ /* Taskset benchmark to specified cpu */
ret = taskset_benchmark(bm_pid, param->cpu_no); ret = taskset_benchmark(bm_pid, param->cpu_no, &old_affinity);
if (ret) if (ret)
return ret; return ret;
...@@ -175,13 +176,15 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long ...@@ -175,13 +176,15 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
ret = write_bm_pid_to_resctrl(bm_pid, param->ctrlgrp, param->mongrp, ret = write_bm_pid_to_resctrl(bm_pid, param->ctrlgrp, param->mongrp,
resctrl_val); resctrl_val);
if (ret) if (ret)
return ret; goto reset_affinity;
perf_event_attr_initialize(&pea, PERF_COUNT_HW_CACHE_MISSES); perf_event_attr_initialize(&pea, PERF_COUNT_HW_CACHE_MISSES);
perf_event_initialize_read_format(&pe_read); perf_event_initialize_read_format(&pe_read);
pe_fd = perf_open(&pea, bm_pid, param->cpu_no); pe_fd = perf_open(&pea, bm_pid, param->cpu_no);
if (pe_fd < 0) if (pe_fd < 0) {
return pe_fd; ret = -1;
goto reset_affinity;
}
buf = alloc_buffer(span, 1); buf = alloc_buffer(span, 1);
if (!buf) { if (!buf) {
...@@ -220,6 +223,8 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long ...@@ -220,6 +223,8 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
free(buf); free(buf);
pe_close: pe_close:
close(pe_fd); close(pe_fd);
reset_affinity:
taskset_restore(bm_pid, &old_affinity);
return ret; return ret;
} }
......
...@@ -98,7 +98,8 @@ int umount_resctrlfs(void); ...@@ -98,7 +98,8 @@ int umount_resctrlfs(void);
int validate_bw_report_request(char *bw_report); int validate_bw_report_request(char *bw_report);
bool validate_resctrl_feature_request(const char *resource, const char *feature); bool validate_resctrl_feature_request(const char *resource, const char *feature);
char *fgrep(FILE *inf, const char *str); char *fgrep(FILE *inf, const char *str);
int taskset_benchmark(pid_t bm_pid, int cpu_no); int taskset_benchmark(pid_t bm_pid, int cpu_no, cpu_set_t *old_affinity);
int taskset_restore(pid_t bm_pid, cpu_set_t *old_affinity);
int write_schemata(char *ctrlgrp, char *schemata, int cpu_no, int write_schemata(char *ctrlgrp, char *schemata, int cpu_no,
char *resctrl_val); char *resctrl_val);
int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp, int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp,
......
...@@ -777,7 +777,7 @@ int resctrl_val(const char * const *benchmark_cmd, struct resctrl_val_param *par ...@@ -777,7 +777,7 @@ int resctrl_val(const char * const *benchmark_cmd, struct resctrl_val_param *par
value.sival_ptr = (void *)benchmark_cmd; value.sival_ptr = (void *)benchmark_cmd;
/* Taskset benchmark to specified cpu */ /* Taskset benchmark to specified cpu */
ret = taskset_benchmark(bm_pid, param->cpu_no); ret = taskset_benchmark(bm_pid, param->cpu_no, NULL);
if (ret) if (ret)
goto out; goto out;
......
...@@ -347,13 +347,23 @@ int get_mask_no_shareable(const char *cache_type, unsigned long *mask) ...@@ -347,13 +347,23 @@ int get_mask_no_shareable(const char *cache_type, unsigned long *mask)
* taskset_benchmark - Taskset PID (i.e. benchmark) to a specified cpu * taskset_benchmark - Taskset PID (i.e. benchmark) to a specified cpu
* @bm_pid: PID that should be binded * @bm_pid: PID that should be binded
* @cpu_no: CPU number at which the PID would be binded * @cpu_no: CPU number at which the PID would be binded
* @old_affinity: When not NULL, set to old CPU affinity
* *
* Return: 0 on success, < 0 on error. * Return: 0 on success, < 0 on error.
*/ */
int taskset_benchmark(pid_t bm_pid, int cpu_no) int taskset_benchmark(pid_t bm_pid, int cpu_no, cpu_set_t *old_affinity)
{ {
cpu_set_t my_set; cpu_set_t my_set;
if (old_affinity) {
CPU_ZERO(old_affinity);
if (sched_getaffinity(bm_pid, sizeof(*old_affinity),
old_affinity)) {
ksft_perror("Unable to read CPU affinity");
return -1;
}
}
CPU_ZERO(&my_set); CPU_ZERO(&my_set);
CPU_SET(cpu_no, &my_set); CPU_SET(cpu_no, &my_set);
...@@ -366,6 +376,23 @@ int taskset_benchmark(pid_t bm_pid, int cpu_no) ...@@ -366,6 +376,23 @@ int taskset_benchmark(pid_t bm_pid, int cpu_no)
return 0; return 0;
} }
/*
* taskset_restore - Taskset PID to the earlier CPU affinity
* @bm_pid: PID that should be reset
* @old_affinity: The old CPU affinity to restore
*
* Return: 0 on success, < 0 on error.
*/
int taskset_restore(pid_t bm_pid, cpu_set_t *old_affinity)
{
if (sched_setaffinity(bm_pid, sizeof(*old_affinity), old_affinity)) {
ksft_perror("Unable to restore CPU affinity");
return -1;
}
return 0;
}
/* /*
* create_grp - Create a group only if one doesn't exist * create_grp - Create a group only if one doesn't exist
* @grp_name: Name of the group * @grp_name: Name of the group
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment