Perf related variables pea_llc_miss, pe_read, and pe_fd are globals in
cache.c.

Convert them to locals for better scoping and make pea_llc_miss simpler
by renaming it to pea. Make close(pe_fd) handling easier to understand
by doing it inside cat_val().

Make also sizeof()s use safer way determine the right struct.

Signed-off-by: Ilpo Järvinen <ilpo.jarvi...@linux.intel.com>
---
 tools/testing/selftests/resctrl/cache.c | 69 ++++++++++++++-----------
 1 file changed, 38 insertions(+), 31 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cache.c 
b/tools/testing/selftests/resctrl/cache.c
index a84679a4ac0c..a65e2e35c33c 100644
--- a/tools/testing/selftests/resctrl/cache.c
+++ b/tools/testing/selftests/resctrl/cache.c
@@ -10,36 +10,35 @@ struct perf_event_read {
        } values[2];
 };
 
-static struct perf_event_attr pea_llc_miss;
-static struct perf_event_read pe_read;
-static int pe_fd;
 char llc_occup_path[1024];
 
-static void perf_event_attr_initialize(__u64 config)
+static void perf_event_attr_initialize(struct perf_event_attr *pea, __u64 
config)
 {
-       memset(&pea_llc_miss, 0, sizeof(struct perf_event_attr));
-       pea_llc_miss.type = PERF_TYPE_HARDWARE;
-       pea_llc_miss.size = sizeof(struct perf_event_attr);
-       pea_llc_miss.read_format = PERF_FORMAT_GROUP;
-       pea_llc_miss.exclude_kernel = 1;
-       pea_llc_miss.exclude_hv = 1;
-       pea_llc_miss.exclude_idle = 1;
-       pea_llc_miss.exclude_callchain_kernel = 1;
-       pea_llc_miss.inherit = 1;
-       pea_llc_miss.exclude_guest = 1;
-       pea_llc_miss.disabled = 1;
-       pea_llc_miss.config = config;
+       memset(pea, 0, sizeof(*pea));
+       pea->type = PERF_TYPE_HARDWARE;
+       pea->size = sizeof(struct perf_event_attr);
+       pea->read_format = PERF_FORMAT_GROUP;
+       pea->exclude_kernel = 1;
+       pea->exclude_hv = 1;
+       pea->exclude_idle = 1;
+       pea->exclude_callchain_kernel = 1;
+       pea->inherit = 1;
+       pea->exclude_guest = 1;
+       pea->disabled = 1;
+       pea->config = config;
 }
 
-static void perf_event_initialize_read_format(void)
+static void perf_event_initialize_read_format(struct perf_event_read *pe_read)
 {
-       memset(&pe_read, 0, sizeof(struct perf_event_read));
-       pe_read.nr = 1;
+       memset(pe_read, 0, sizeof(*pe_read));
+       pe_read->nr = 1;
 }
 
-static int perf_event_reset_enable(pid_t pid, int cpu_no)
+static int perf_event_reset_enable(struct perf_event_attr *pea, pid_t pid, int 
cpu_no)
 {
-       pe_fd = perf_event_open(&pea_llc_miss, pid, cpu_no, -1, 
PERF_FLAG_FD_CLOEXEC);
+       int pe_fd;
+
+       pe_fd = perf_event_open(pea, pid, cpu_no, -1, PERF_FLAG_FD_CLOEXEC);
        if (pe_fd == -1) {
                perror("Error opening leader");
                ctrlc_handler(0, NULL, NULL);
@@ -50,7 +49,7 @@ static int perf_event_reset_enable(pid_t pid, int cpu_no)
        ioctl(pe_fd, PERF_EVENT_IOC_RESET, 0);
        ioctl(pe_fd, PERF_EVENT_IOC_ENABLE, 0);
 
-       return 0;
+       return pe_fd;
 }
 
 /*
@@ -124,21 +123,21 @@ static int print_results_cache(char *filename, int 
bm_pid, __u64 llc_value)
  *
  * Return: =0 on success.  <0 on failure.
  */
-static int perf_event_measure(struct resctrl_val_param *param, int bm_pid)
+static int perf_event_measure(int pe_fd, struct perf_event_read *pe_read,
+                             struct resctrl_val_param *param, int bm_pid)
 {
        int ret;
 
        /* Stop counters after one span to get miss rate */
        ioctl(pe_fd, PERF_EVENT_IOC_DISABLE, 0);
 
-       ret = read(pe_fd, &pe_read, sizeof(struct perf_event_read));
-       close(pe_fd);
+       ret = read(pe_fd, pe_read, sizeof(*pe_read));
        if (ret == -1) {
                perror("Could not get perf value");
                return -1;
        }
 
-       return print_results_cache(param->filename, bm_pid, 
pe_read.values[0].value);
+       return print_results_cache(param->filename, bm_pid, 
pe_read->values[0].value);
 }
 
 int measure_llc_resctrl(struct resctrl_val_param *param, int bm_pid)
@@ -169,7 +168,10 @@ int cat_val(struct resctrl_val_param *param, size_t span)
 {
        int memflush = 1, operation = 0, ret = 0;
        char *resctrl_val = param->resctrl_val;
+       static struct perf_event_read pe_read;
+       struct perf_event_attr pea;
        pid_t bm_pid;
+       int pe_fd;
 
        if (strcmp(param->filename, "") == 0)
                sprintf(param->filename, "stdio");
@@ -187,8 +189,8 @@ int cat_val(struct resctrl_val_param *param, size_t span)
        if (ret)
                return ret;
 
-       perf_event_attr_initialize(PERF_COUNT_HW_CACHE_MISSES);
-       perf_event_initialize_read_format();
+       perf_event_attr_initialize(&pea, PERF_COUNT_HW_CACHE_MISSES);
+       perf_event_initialize_read_format(&pe_read);
 
        /* Test runs until the callback setup() tells the test to stop. */
        while (1) {
@@ -199,9 +201,12 @@ int cat_val(struct resctrl_val_param *param, size_t span)
                }
                if (ret < 0)
                        break;
-               ret = perf_event_reset_enable(bm_pid, param->cpu_no);
-               if (ret)
+
+               pe_fd = perf_event_reset_enable(&pea, bm_pid, param->cpu_no);
+               if (pe_fd < 0) {
+                       ret = -1;
                        break;
+               }
 
                if (run_fill_buf(span, memflush, operation, true)) {
                        fprintf(stderr, "Error-running fill buffer\n");
@@ -210,9 +215,11 @@ int cat_val(struct resctrl_val_param *param, size_t span)
                }
 
                sleep(1);
-               ret = perf_event_measure(param, bm_pid);
+               ret = perf_event_measure(pe_fd, &pe_read, param, bm_pid);
                if (ret)
                        goto pe_close;
+
+               close(pe_fd);
        }
 
        return ret;
-- 
2.30.2

Reply via email to