]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
perf test: Support external tests for separate objdir
authorAndi Kleen <ak@linux.intel.com>
Tue, 13 Aug 2024 21:36:49 +0000 (14:36 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 26 Aug 2024 14:30:52 +0000 (11:30 -0300)
Extend the searching for the test files so that it works when running
perf from a separate objdir, and also when the perf executable is
symlinked.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240813213651.1057362-2-ak@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/tests-scripts.c

index e2042b368269b19a3aa0bdb855dd456d1f321ed4..8dc1e398288cbe850b1980b6ab88b23e24e1f898 100644 (file)
 
 static int shell_tests__dir_fd(void)
 {
-       char path[PATH_MAX], *exec_path;
-       static const char * const devel_dirs[] = { "./tools/perf/tests/shell", "./tests/shell", };
+       struct stat st;
+       char path[PATH_MAX], path2[PATH_MAX], *exec_path;
+       static const char * const devel_dirs[] = {
+               "./tools/perf/tests/shell",
+               "./tests/shell",
+               "./source/tests/shell"
+       };
+       int fd;
+       char *p;
 
        for (size_t i = 0; i < ARRAY_SIZE(devel_dirs); ++i) {
-               int fd = open(devel_dirs[i], O_PATH);
+               fd = open(devel_dirs[i], O_PATH);
 
                if (fd >= 0)
                        return fd;
        }
 
+       /* Use directory of executable */
+       if (readlink("/proc/self/exe", path2, sizeof path2) < 0)
+               return -1;
+       /* Follow another level of symlink if there */
+       if (lstat(path2, &st) == 0 && (st.st_mode & S_IFMT) == S_IFLNK) {
+               scnprintf(path, sizeof(path), path2);
+               if (readlink(path, path2, sizeof path2) < 0)
+                       return -1;
+       }
+       /* Get directory */
+       p = strrchr(path2, '/');
+       if (p)
+               *p = 0;
+       scnprintf(path, sizeof(path), "%s/tests/shell", path2);
+       fd = open(path, O_PATH);
+       if (fd >= 0)
+               return fd;
+       scnprintf(path, sizeof(path), "%s/source/tests/shell", path2);
+       fd = open(path, O_PATH);
+       if (fd >= 0)
+               return fd;
+
        /* Then installed path. */
        exec_path = get_argv_exec_path();
        scnprintf(path, sizeof(path), "%s/tests/shell", exec_path);