perf test: Remove C test wrapper for attr.py
authorIan Rogers <irogers@google.com>
Tue, 15 Oct 2024 00:01:57 +0000 (17:01 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Thu, 17 Oct 2024 20:17:36 +0000 (13:17 -0700)
Remove the C wrapper now a shell script wrapper exists. Move
perf_event_attr dumping functions to evsel.c and reduce the scope of
variables/defines. Use fprintf to avoid snprintf complexities in
WRITE_ASS.

Add __SANE_USERSPACE_TYPES__ to evsel.c to fix format flag issues on
PowerPC triggered by moving attr.c functions to evsel.c.

Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: zhaimingbing <zhaimingbing@cmss.chinamobile.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ze Gao <zegao2021@gmail.com>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Veronika Molnarova <vmolnaro@redhat.com>
Link: https://lore.kernel.org/r/20241015000158.871828-3-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/perf.c
tools/perf/tests/Build
tools/perf/tests/attr.c [deleted file]
tools/perf/tests/builtin-test.c
tools/perf/util/evsel.c
tools/perf/util/util.h

index 4def800f4089d7dbca9a68efb371d2992fd4c7f2..a2987f2cfe1a3958f53239ed1a4eec3f87d7466a 100644 (file)
@@ -542,8 +542,6 @@ int main(int argc, const char **argv)
        }
        cmd = argv[0];
 
-       test_attr__init();
-
        /*
         * We use PATH to find perf commands, but we prepend some higher
         * precedence paths: the "--exec-path" option, the PERF_EXEC_PATH
index a771e49282471240c4d6988a0d66c013ab73756a..03cbdf7c50a09be4bc69c29601aa436228868556 100644 (file)
@@ -4,7 +4,6 @@ perf-test-y += builtin-test.o
 perf-test-y += tests-scripts.o
 perf-test-y += parse-events.o
 perf-test-y += dso-data.o
-perf-test-y += attr.o
 perf-test-y += vmlinux-kallsyms.o
 perf-test-$(CONFIG_LIBTRACEEVENT) += openat-syscall.o
 perf-test-$(CONFIG_LIBTRACEEVENT) += openat-syscall-all-cpus.o
diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c
deleted file mode 100644 (file)
index 97e1bdd..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * The struct perf_event_attr test support.
- *
- * This test is embedded inside into perf directly and is governed
- * by the PERF_TEST_ATTR environment variable and hook inside
- * sys_perf_event_open function.
- *
- * The general idea is to store 'struct perf_event_attr' details for
- * each event created within single perf command. Each event details
- * are stored into separate text file. Once perf command is finished
- * these files can be checked for values we expect for command.
- *
- * Besides 'struct perf_event_attr' values we also store 'fd' and
- * 'group_fd' values to allow checking for groups created.
- *
- * This all is triggered by setting PERF_TEST_ATTR environment variable.
- * It must contain name of existing directory with access and write
- * permissions. All the event text files are stored there.
- */
-
-#include <debug.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <subcmd/exec-cmd.h>
-#include "event.h"
-#include "util.h"
-#include "tests.h"
-#include "pmus.h"
-
-#define ENV "PERF_TEST_ATTR"
-
-static char *dir;
-static bool ready;
-
-void test_attr__init(void)
-{
-       dir = getenv(ENV);
-       test_attr__enabled = (dir != NULL);
-}
-
-#define BUFSIZE 1024
-
-#define __WRITE_ASS(str, fmt, data)                                    \
-do {                                                                   \
-       char buf[BUFSIZE];                                              \
-       size_t size;                                                    \
-                                                                       \
-       size = snprintf(buf, BUFSIZE, #str "=%"fmt "\n", data);         \
-       if (1 != fwrite(buf, size, 1, file)) {                          \
-               perror("test attr - failed to write event file");       \
-               fclose(file);                                           \
-               return -1;                                              \
-       }                                                               \
-                                                                       \
-} while (0)
-
-#define WRITE_ASS(field, fmt) __WRITE_ASS(field, fmt, attr->field)
-
-static int store_event(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu,
-                      int fd, int group_fd, unsigned long flags)
-{
-       FILE *file;
-       char path[PATH_MAX];
-
-       if (!ready)
-               return 0;
-
-       snprintf(path, PATH_MAX, "%s/event-%d-%llu-%d", dir,
-                attr->type, attr->config, fd);
-
-       file = fopen(path, "w+");
-       if (!file) {
-               perror("test attr - failed to open event file");
-               return -1;
-       }
-
-       if (fprintf(file, "[event-%d-%llu-%d]\n",
-                   attr->type, attr->config, fd) < 0) {
-               perror("test attr - failed to write event file");
-               fclose(file);
-               return -1;
-       }
-
-       /* syscall arguments */
-       __WRITE_ASS(fd,       "d", fd);
-       __WRITE_ASS(group_fd, "d", group_fd);
-       __WRITE_ASS(cpu,      "d", cpu.cpu);
-       __WRITE_ASS(pid,      "d", pid);
-       __WRITE_ASS(flags,   "lu", flags);
-
-       /* struct perf_event_attr */
-       WRITE_ASS(type,   PRIu32);
-       WRITE_ASS(size,   PRIu32);
-       WRITE_ASS(config,  "llu");
-       WRITE_ASS(sample_period, "llu");
-       WRITE_ASS(sample_type,   "llu");
-       WRITE_ASS(read_format,   "llu");
-       WRITE_ASS(disabled,       "d");
-       WRITE_ASS(inherit,        "d");
-       WRITE_ASS(pinned,         "d");
-       WRITE_ASS(exclusive,      "d");
-       WRITE_ASS(exclude_user,   "d");
-       WRITE_ASS(exclude_kernel, "d");
-       WRITE_ASS(exclude_hv,     "d");
-       WRITE_ASS(exclude_idle,   "d");
-       WRITE_ASS(mmap,           "d");
-       WRITE_ASS(comm,           "d");
-       WRITE_ASS(freq,           "d");
-       WRITE_ASS(inherit_stat,   "d");
-       WRITE_ASS(enable_on_exec, "d");
-       WRITE_ASS(task,           "d");
-       WRITE_ASS(watermark,      "d");
-       WRITE_ASS(precise_ip,     "d");
-       WRITE_ASS(mmap_data,      "d");
-       WRITE_ASS(sample_id_all,  "d");
-       WRITE_ASS(exclude_host,   "d");
-       WRITE_ASS(exclude_guest,  "d");
-       WRITE_ASS(exclude_callchain_kernel, "d");
-       WRITE_ASS(exclude_callchain_user, "d");
-       WRITE_ASS(mmap2,          "d");
-       WRITE_ASS(comm_exec,      "d");
-       WRITE_ASS(context_switch, "d");
-       WRITE_ASS(write_backward, "d");
-       WRITE_ASS(namespaces,     "d");
-       WRITE_ASS(use_clockid,    "d");
-       WRITE_ASS(wakeup_events, PRIu32);
-       WRITE_ASS(bp_type, PRIu32);
-       WRITE_ASS(config1, "llu");
-       WRITE_ASS(config2, "llu");
-       WRITE_ASS(branch_sample_type, "llu");
-       WRITE_ASS(sample_regs_user,   "llu");
-       WRITE_ASS(sample_stack_user,  PRIu32);
-
-       fclose(file);
-       return 0;
-}
-
-void test_attr__open(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu,
-                    int fd, int group_fd, unsigned long flags)
-{
-       int errno_saved = errno;
-
-       if ((fd != -1) && store_event(attr, pid, cpu, fd, group_fd, flags)) {
-               pr_err("test attr FAILED");
-               exit(128);
-       }
-
-       errno = errno_saved;
-}
-
-void test_attr__ready(void)
-{
-       if (unlikely(test_attr__enabled) && !ready)
-               ready = true;
-}
-
-static int run_dir(const char *d, const char *perf)
-{
-       char v[] = "-vvvvv";
-       int vcnt = min(verbose, (int) sizeof(v) - 1);
-       char cmd[3*PATH_MAX];
-
-       if (verbose > 0)
-               vcnt++;
-
-       scnprintf(cmd, 3*PATH_MAX, PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s",
-                 d, d, perf, vcnt, v);
-
-       return system(cmd) ? TEST_FAIL : TEST_OK;
-}
-
-static int test__attr(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
-{
-       struct stat st;
-       char path_perf[PATH_MAX];
-       char path_dir[PATH_MAX];
-       char *exec_path;
-
-       if (perf_pmus__num_core_pmus() > 1) {
-               /*
-                * TODO: Attribute tests hard code the PMU type. If there are >1
-                * core PMU then each PMU will have a different type which
-                * requires additional support.
-                */
-               pr_debug("Skip test on hybrid systems");
-               return TEST_SKIP;
-       }
-
-       /* First try development tree tests. */
-       if (!lstat("./tests", &st))
-               return run_dir("./tests", "./perf");
-
-       exec_path = get_argv_exec_path();
-       if (exec_path == NULL)
-               return -1;
-
-       /* Then installed path. */
-       snprintf(path_dir,  PATH_MAX, "%s/tests", exec_path);
-       snprintf(path_perf, PATH_MAX, "%s/perf", BINDIR);
-       free(exec_path);
-
-       if (!lstat(path_dir, &st) &&
-           !lstat(path_perf, &st))
-               return run_dir(path_dir, path_perf);
-
-       return TEST_SKIP;
-}
-
-DEFINE_SUITE("Setup struct perf_event_attr", attr);
index 3b30f258c39592fc4b9e323c03125168a7682b08..50533446e7478fcbd44660bf8768d85267043e9b 100644 (file)
@@ -80,7 +80,6 @@ static struct test_suite *generic_tests[] = {
        &suite__perf_evsel__tp_sched_test,
        &suite__syscall_openat_tp_fields,
 #endif
-       &suite__attr,
        &suite__hists_link,
        &suite__python_use,
        &suite__bp_signal,
index e9e1f576d34ddf6482fffb1c21d2bd18370ad4d3..14663ad14c531a5030cf182cebd70587a8bd41d2 100644 (file)
@@ -5,6 +5,11 @@
  * Parts came from builtin-{top,stat,record}.c, see those files for further
  * copyright notes.
  */
+/*
+ * Powerpc needs __SANE_USERSPACE_TYPES__ before <linux/types.h> to select
+ * 'int-ll64.h' and avoid compile warnings when printing __u64 with %llu.
+ */
+#define __SANE_USERSPACE_TYPES__
 
 #include <byteswap.h>
 #include <errno.h>
@@ -76,7 +81,123 @@ static int evsel__no_extra_init(struct evsel *evsel __maybe_unused)
        return 0;
 }
 
-void __weak test_attr__ready(void) { }
+static bool test_attr__enabled(void)
+{
+       static bool test_attr__enabled;
+       static bool test_attr__enabled_tested;
+
+       if (!test_attr__enabled_tested) {
+               char *dir = getenv("PERF_TEST_ATTR");
+
+               test_attr__enabled = (dir != NULL);
+               test_attr__enabled_tested = true;
+       }
+       return test_attr__enabled;
+}
+
+#define __WRITE_ASS(str, fmt, data)                                    \
+do {                                                                   \
+       if (fprintf(file, #str "=%"fmt "\n", data) < 0) {               \
+               perror("test attr - failed to write event file");       \
+               fclose(file);                                           \
+               return -1;                                              \
+       }                                                               \
+} while (0)
+
+#define WRITE_ASS(field, fmt) __WRITE_ASS(field, fmt, attr->field)
+
+static int store_event(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu,
+                      int fd, int group_fd, unsigned long flags)
+{
+       FILE *file;
+       char path[PATH_MAX];
+       char *dir = getenv("PERF_TEST_ATTR");
+
+       snprintf(path, PATH_MAX, "%s/event-%d-%llu-%d", dir,
+                attr->type, attr->config, fd);
+
+       file = fopen(path, "w+");
+       if (!file) {
+               perror("test attr - failed to open event file");
+               return -1;
+       }
+
+       if (fprintf(file, "[event-%d-%llu-%d]\n",
+                   attr->type, attr->config, fd) < 0) {
+               perror("test attr - failed to write event file");
+               fclose(file);
+               return -1;
+       }
+
+       /* syscall arguments */
+       __WRITE_ASS(fd,       "d", fd);
+       __WRITE_ASS(group_fd, "d", group_fd);
+       __WRITE_ASS(cpu,      "d", cpu.cpu);
+       __WRITE_ASS(pid,      "d", pid);
+       __WRITE_ASS(flags,   "lu", flags);
+
+       /* struct perf_event_attr */
+       WRITE_ASS(type,   PRIu32);
+       WRITE_ASS(size,   PRIu32);
+       WRITE_ASS(config,  "llu");
+       WRITE_ASS(sample_period, "llu");
+       WRITE_ASS(sample_type,   "llu");
+       WRITE_ASS(read_format,   "llu");
+       WRITE_ASS(disabled,       "d");
+       WRITE_ASS(inherit,        "d");
+       WRITE_ASS(pinned,         "d");
+       WRITE_ASS(exclusive,      "d");
+       WRITE_ASS(exclude_user,   "d");
+       WRITE_ASS(exclude_kernel, "d");
+       WRITE_ASS(exclude_hv,     "d");
+       WRITE_ASS(exclude_idle,   "d");
+       WRITE_ASS(mmap,           "d");
+       WRITE_ASS(comm,           "d");
+       WRITE_ASS(freq,           "d");
+       WRITE_ASS(inherit_stat,   "d");
+       WRITE_ASS(enable_on_exec, "d");
+       WRITE_ASS(task,           "d");
+       WRITE_ASS(watermark,      "d");
+       WRITE_ASS(precise_ip,     "d");
+       WRITE_ASS(mmap_data,      "d");
+       WRITE_ASS(sample_id_all,  "d");
+       WRITE_ASS(exclude_host,   "d");
+       WRITE_ASS(exclude_guest,  "d");
+       WRITE_ASS(exclude_callchain_kernel, "d");
+       WRITE_ASS(exclude_callchain_user, "d");
+       WRITE_ASS(mmap2,          "d");
+       WRITE_ASS(comm_exec,      "d");
+       WRITE_ASS(context_switch, "d");
+       WRITE_ASS(write_backward, "d");
+       WRITE_ASS(namespaces,     "d");
+       WRITE_ASS(use_clockid,    "d");
+       WRITE_ASS(wakeup_events, PRIu32);
+       WRITE_ASS(bp_type, PRIu32);
+       WRITE_ASS(config1, "llu");
+       WRITE_ASS(config2, "llu");
+       WRITE_ASS(branch_sample_type, "llu");
+       WRITE_ASS(sample_regs_user,   "llu");
+       WRITE_ASS(sample_stack_user,  PRIu32);
+
+       fclose(file);
+       return 0;
+}
+
+#undef __WRITE_ASS
+#undef WRITE_ASS
+
+static void test_attr__open(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu,
+                    int fd, int group_fd, unsigned long flags)
+{
+       int errno_saved = errno;
+
+       if ((fd != -1) && store_event(attr, pid, cpu, fd, group_fd, flags)) {
+               pr_err("test attr FAILED");
+               exit(128);
+       }
+
+       errno = errno_saved;
+}
 
 static void evsel__no_extra_fini(struct evsel *evsel __maybe_unused)
 {
@@ -2145,8 +2266,6 @@ retry_open:
                                goto out_close;
                        }
 
-                       test_attr__ready();
-
                        /* Debug message used by test scripts */
                        pr_debug2_peo("sys_perf_event_open: pid %d  cpu %d  group_fd %d  flags %#lx",
                                pid, perf_cpu_map__cpu(cpus, idx).cpu, group_fd, evsel->open_flags);
@@ -2167,7 +2286,7 @@ retry_open:
 
                        bpf_counter__install_pe(evsel, idx, fd);
 
-                       if (unlikely(test_attr__enabled)) {
+                       if (unlikely(test_attr__enabled())) {
                                test_attr__open(&evsel->core.attr, pid,
                                                perf_cpu_map__cpu(cpus, idx),
                                                fd, group_fd, evsel->open_flags);
index 9966c21aaf0484797586855c10b6185414a4cb11..14f2c70906be8684e63788054d57c4359db80f26 100644 (file)
@@ -81,13 +81,6 @@ char *perf_exe(char *buf, int len);
 #endif
 #endif
 
-extern bool test_attr__enabled;
-void test_attr__ready(void);
-void test_attr__init(void);
-struct perf_event_attr;
-void test_attr__open(struct perf_event_attr *attr, pid_t pid, struct perf_cpu cpu,
-                    int fd, int group_fd, unsigned long flags);
-
 struct perf_debuginfod {
        const char      *urls;
        bool             set;