* [PATCH v8 1/4] Create source symlink in perf object dir
@ 2024-08-01 21:28 Andi Kleen
2024-08-01 21:28 ` [PATCH v8 2/4] perf test: Support external tests for separate objdir Andi Kleen
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Andi Kleen @ 2024-08-01 21:28 UTC (permalink / raw)
To: linux-perf-users; +Cc: namhyung, Andi Kleen
Create a source symlink to the original source in the objdir.
This is similar to what the main kernel build script does.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
tools/perf/Makefile.perf | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 175e4c7898f0..d46892d8223b 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -163,6 +163,8 @@ ifneq ($(OUTPUT),)
# for flex/bison parsers.
VPATH += $(OUTPUT)
export VPATH
+# create symlink to the original source
+SOURCE := $(shell ln -sf $(srctree)/tools/perf $(OUTPUT)/source)
endif
ifeq ($(V),1)
--
2.45.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v8 2/4] perf test: Support external tests for separate objdir 2024-08-01 21:28 [PATCH v8 1/4] Create source symlink in perf object dir Andi Kleen @ 2024-08-01 21:28 ` Andi Kleen 2024-08-05 19:02 ` Namhyung Kim 2024-08-01 21:28 ` [PATCH v8 3/4] perf script: Fix perf script -F +metric Andi Kleen 2024-08-01 21:28 ` [PATCH v8 4/4] Add a test case for " Andi Kleen 2 siblings, 1 reply; 8+ messages in thread From: Andi Kleen @ 2024-08-01 21:28 UTC (permalink / raw) To: linux-perf-users; +Cc: namhyung, Andi Kleen 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> ---- v2: Fix string test (Namhyung) Handle both in source and out of source builds. --- tools/perf/tests/tests-scripts.c | 37 +++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/tools/perf/tests/tests-scripts.c b/tools/perf/tests/tests-scripts.c index e2042b368269..9f71ffed702c 100644 --- a/tools/perf/tests/tests-scripts.c +++ b/tools/perf/tests/tests-scripts.c @@ -29,16 +29,47 @@ 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; + if (p) + *p = 0; + 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); -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v8 2/4] perf test: Support external tests for separate objdir 2024-08-01 21:28 ` [PATCH v8 2/4] perf test: Support external tests for separate objdir Andi Kleen @ 2024-08-05 19:02 ` Namhyung Kim 0 siblings, 0 replies; 8+ messages in thread From: Namhyung Kim @ 2024-08-05 19:02 UTC (permalink / raw) To: Andi Kleen; +Cc: linux-perf-users On Thu, Aug 01, 2024 at 02:28:42PM -0700, Andi Kleen wrote: > 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> > > ---- > > v2: Fix string test (Namhyung) > Handle both in source and out of source builds. > --- > tools/perf/tests/tests-scripts.c | 37 +++++++++++++++++++++++++++++--- > 1 file changed, 34 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/tests/tests-scripts.c b/tools/perf/tests/tests-scripts.c > index e2042b368269..9f71ffed702c 100644 > --- a/tools/perf/tests/tests-scripts.c > +++ b/tools/perf/tests/tests-scripts.c > @@ -29,16 +29,47 @@ > > 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; > + if (p) > + *p = 0; This part looks unnecessary. Thanks, Namhyung > + 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); > -- > 2.45.2 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v8 3/4] perf script: Fix perf script -F +metric 2024-08-01 21:28 [PATCH v8 1/4] Create source symlink in perf object dir Andi Kleen 2024-08-01 21:28 ` [PATCH v8 2/4] perf test: Support external tests for separate objdir Andi Kleen @ 2024-08-01 21:28 ` Andi Kleen 2024-08-05 19:23 ` Namhyung Kim 2024-08-01 21:28 ` [PATCH v8 4/4] Add a test case for " Andi Kleen 2 siblings, 1 reply; 8+ messages in thread From: Andi Kleen @ 2024-08-01 21:28 UTC (permalink / raw) To: linux-perf-users; +Cc: namhyung, Andi Kleen This fixes a regression with perf script -F +metric originally caused by : commit 37cc8ad77cf81f3ffd226856c367b0e15333a738 Author: Ian Rogers <irogers@google.com> Date: Sun Feb 19 01:28:46 2023 -0800 perf metric: Directly use counts rather than saved_value In the perf script environment the evsel wouldn't allocate an aggr values array, which led to a -1 reference because the metric evaluation would try to reference NULL - 1 (for aggr_idx) Give the perf script evsels a single CPU aggr setup. That's enough because the groups are always contiguous, so no need to store more than one CPU's worth of values. Before % perf record -e '{cycles,instructions}:S' perf bench mem memcpy % perf script -F +metric Segmentation fault (core dumped) After: % perf record -e '{cycles,instructions}:S' perf bench mem memcpy ... [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.028 MB perf.data (90 samples) ] % perf script -F +metric perf-exec 1847557 264658.180789: 3009 cycles: ffffffff990a579a native_write_msr+0xa ([kernel.kallsyms]) perf-exec 1847557 264658.180789: 382 instructions: ffffffff990a579a native_write_msr+0xa ([kernel.kallsyms]) perf-exec 1847557 264658.180789: metric: 0.13 insn per cycle ... Fixes: 37cc8ad77cf8 ("perf metric: Directly use counts rather ...") Signed-off-by: Andi Kleen <ak@linux.intel.com> ---- v2: Reformat code v3: Work around bogus warning v4: Set up aggr map only for metrics case to keep perf stat record working v5: Broken version v6: Only set up limited aggregation mode with -F +metric. Add conflict checks with perf stat record files. v7: Remove some unnecessary conflict checks. Fix buffer overflow. Minor cleanups. v8: Add check for leader sampling. Update some comments. --- tools/perf/builtin-script.c | 50 +++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index c16224b1fef3..04378615b2ad 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -335,7 +335,6 @@ struct evsel_script { FILE *fp; u64 samples; /* For metric output */ - u64 val; int gnum; }; @@ -2127,18 +2126,30 @@ static void perf_sample__fprint_metric(struct perf_script *script, }; struct evsel *ev2; u64 val; + static int printed; if (!evsel->stats) evlist__alloc_stats(&stat_config, script->session->evlist, /*alloc_raw=*/false); if (evsel_script(leader)->gnum++ == 0) perf_stat__reset_shadow_stats(); - val = sample->period * evsel->scale; - evsel_script(evsel)->val = val; + val = sample->period; + if (!(evsel->core.attr.sample_type & PERF_SAMPLE_READ)) { + if (!printed) + fprintf(stderr, "perf script: -F metric requires {}:S for groups leader sampling\n"); + printed = 1; + return; + } + /* + * Always use the first entry as storage because the leader sampling + * groups are contiguous and there's no need to handle multiple indexes + * for anything. + */ + evsel->stats->aggr[0].counts.val = val; if (evsel_script(leader)->gnum == leader->core.nr_members) { for_each_group_member (ev2, leader) { perf_stat__print_shadow_stats(&stat_config, ev2, - evsel_script(ev2)->val, - sample->cpu, + evsel->stats->aggr[0].counts.val, + 0, &ctx, NULL); } @@ -2325,6 +2336,20 @@ static void process_event(struct perf_script *script, fflush(fp); } +static void check_metric_conflict(void) +{ + int i; + /* + * Avoid conflict with the aggregation mode used for the metric printing. + */ + for (i = 0; i < OUTPUT_TYPE_MAX; i++) { + if (output[i].fields & PERF_OUTPUT_METRIC) { + fprintf(stderr, "perf stat record files are not supported with -F metric\n"); + exit(1); + } + } +} + static struct scripting_ops *scripting_ops; static void __process_stat(struct evsel *counter, u64 tstamp) @@ -2334,6 +2359,8 @@ static void __process_stat(struct evsel *counter, u64 tstamp) struct perf_cpu cpu; static int header_printed; + check_metric_conflict(); + if (!header_printed) { printf("%3s %8s %15s %15s %15s %15s %s\n", "CPU", "THREAD", "VAL", "ENA", "RUN", "TIME", "EVENT"); @@ -3725,6 +3752,8 @@ static int process_stat_config_event(struct perf_session *session __maybe_unused { perf_event__read_stat_config(&stat_config, &event->stat_config); + check_metric_conflict(); + /* * Aggregation modes are not used since post-processing scripts are * supposed to take care of such requirements @@ -4088,6 +4117,17 @@ int cmd_script(int argc, const char **argv) argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage, PARSE_OPT_STOP_AT_NON_OPTION); + for (i = 0; i < OUTPUT_TYPE_MAX; i++) { + if (output[i].fields & PERF_OUTPUT_METRIC) { + stat_config.aggr_map = cpu_aggr_map__empty_new(1); + err = -ENOMEM; + if (!stat_config.aggr_map) + goto out; + err = 0; + stat_config.aggr_map->nr = 1; + break; + } + } if (symbol_conf.guestmount || symbol_conf.default_guest_vmlinux_name || -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v8 3/4] perf script: Fix perf script -F +metric 2024-08-01 21:28 ` [PATCH v8 3/4] perf script: Fix perf script -F +metric Andi Kleen @ 2024-08-05 19:23 ` Namhyung Kim 0 siblings, 0 replies; 8+ messages in thread From: Namhyung Kim @ 2024-08-05 19:23 UTC (permalink / raw) To: Andi Kleen; +Cc: linux-perf-users On Thu, Aug 01, 2024 at 02:28:43PM -0700, Andi Kleen wrote: > This fixes a regression with perf script -F +metric originally caused by : > > commit 37cc8ad77cf81f3ffd226856c367b0e15333a738 > Author: Ian Rogers <irogers@google.com> > Date: Sun Feb 19 01:28:46 2023 -0800 > > perf metric: Directly use counts rather than saved_value > > In the perf script environment the evsel wouldn't allocate an aggr > values array, which led to a -1 reference because the metric > evaluation would try to reference NULL - 1 (for aggr_idx) > > Give the perf script evsels a single CPU aggr setup. That's > enough because the groups are always contiguous, so no need > to store more than one CPU's worth of values. > > Before > > % perf record -e '{cycles,instructions}:S' perf bench mem memcpy > % perf script -F +metric > Segmentation fault (core dumped) > > After: > > % perf record -e '{cycles,instructions}:S' perf bench mem memcpy > ... > [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 0.028 MB perf.data (90 samples) ] > % perf script -F +metric > perf-exec 1847557 264658.180789: 3009 cycles: ffffffff990a579a native_write_msr+0xa ([kernel.kallsyms]) > perf-exec 1847557 264658.180789: 382 instructions: ffffffff990a579a native_write_msr+0xa ([kernel.kallsyms]) > perf-exec 1847557 264658.180789: metric: 0.13 insn per cycle > ... > > Fixes: 37cc8ad77cf8 ("perf metric: Directly use counts rather ...") > Signed-off-by: Andi Kleen <ak@linux.intel.com> > > ---- > > v2: Reformat code > v3: Work around bogus warning > v4: Set up aggr map only for metrics case to keep perf stat record > working > v5: Broken version > v6: Only set up limited aggregation mode with -F +metric. Add conflict > checks with perf stat record files. > v7: Remove some unnecessary conflict checks. Fix buffer overflow. Minor cleanups. > v8: Add check for leader sampling. Update some comments. > --- > tools/perf/builtin-script.c | 50 +++++++++++++++++++++++++++++++++---- > 1 file changed, 45 insertions(+), 5 deletions(-) > > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > index c16224b1fef3..04378615b2ad 100644 > --- a/tools/perf/builtin-script.c > +++ b/tools/perf/builtin-script.c > @@ -335,7 +335,6 @@ struct evsel_script { > FILE *fp; > u64 samples; > /* For metric output */ > - u64 val; > int gnum; > }; > > @@ -2127,18 +2126,30 @@ static void perf_sample__fprint_metric(struct perf_script *script, > }; > struct evsel *ev2; > u64 val; > + static int printed; > > if (!evsel->stats) > evlist__alloc_stats(&stat_config, script->session->evlist, /*alloc_raw=*/false); > if (evsel_script(leader)->gnum++ == 0) > perf_stat__reset_shadow_stats(); > - val = sample->period * evsel->scale; > - evsel_script(evsel)->val = val; > + val = sample->period; > + if (!(evsel->core.attr.sample_type & PERF_SAMPLE_READ)) { The correct check would need PERF_FORMAT_GROUP in attr.read_format for the leader event, and no attr.sample_period for member events. But I guess practically it's enough to check the leader only. Thanks, Namhyung > + if (!printed) > + fprintf(stderr, "perf script: -F metric requires {}:S for groups leader sampling\n"); > + printed = 1; > + return; > + } > + /* > + * Always use the first entry as storage because the leader sampling > + * groups are contiguous and there's no need to handle multiple indexes > + * for anything. > + */ > + evsel->stats->aggr[0].counts.val = val; > if (evsel_script(leader)->gnum == leader->core.nr_members) { > for_each_group_member (ev2, leader) { > perf_stat__print_shadow_stats(&stat_config, ev2, > - evsel_script(ev2)->val, > - sample->cpu, > + evsel->stats->aggr[0].counts.val, > + 0, > &ctx, > NULL); > } > @@ -2325,6 +2336,20 @@ static void process_event(struct perf_script *script, > fflush(fp); > } > > +static void check_metric_conflict(void) > +{ > + int i; > + /* > + * Avoid conflict with the aggregation mode used for the metric printing. > + */ > + for (i = 0; i < OUTPUT_TYPE_MAX; i++) { > + if (output[i].fields & PERF_OUTPUT_METRIC) { > + fprintf(stderr, "perf stat record files are not supported with -F metric\n"); > + exit(1); > + } > + } > +} > + > static struct scripting_ops *scripting_ops; > > static void __process_stat(struct evsel *counter, u64 tstamp) > @@ -2334,6 +2359,8 @@ static void __process_stat(struct evsel *counter, u64 tstamp) > struct perf_cpu cpu; > static int header_printed; > > + check_metric_conflict(); > + > if (!header_printed) { > printf("%3s %8s %15s %15s %15s %15s %s\n", > "CPU", "THREAD", "VAL", "ENA", "RUN", "TIME", "EVENT"); > @@ -3725,6 +3752,8 @@ static int process_stat_config_event(struct perf_session *session __maybe_unused > { > perf_event__read_stat_config(&stat_config, &event->stat_config); > > + check_metric_conflict(); > + > /* > * Aggregation modes are not used since post-processing scripts are > * supposed to take care of such requirements > @@ -4088,6 +4117,17 @@ int cmd_script(int argc, const char **argv) > > argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage, > PARSE_OPT_STOP_AT_NON_OPTION); > + for (i = 0; i < OUTPUT_TYPE_MAX; i++) { > + if (output[i].fields & PERF_OUTPUT_METRIC) { > + stat_config.aggr_map = cpu_aggr_map__empty_new(1); > + err = -ENOMEM; > + if (!stat_config.aggr_map) > + goto out; > + err = 0; > + stat_config.aggr_map->nr = 1; > + break; > + } > + } > > if (symbol_conf.guestmount || > symbol_conf.default_guest_vmlinux_name || > -- > 2.45.2 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v8 4/4] Add a test case for perf script -F +metric 2024-08-01 21:28 [PATCH v8 1/4] Create source symlink in perf object dir Andi Kleen 2024-08-01 21:28 ` [PATCH v8 2/4] perf test: Support external tests for separate objdir Andi Kleen 2024-08-01 21:28 ` [PATCH v8 3/4] perf script: Fix perf script -F +metric Andi Kleen @ 2024-08-01 21:28 ` Andi Kleen 2024-08-05 19:25 ` Namhyung Kim 2 siblings, 1 reply; 8+ messages in thread From: Andi Kleen @ 2024-08-01 21:28 UTC (permalink / raw) To: linux-perf-users; +Cc: namhyung, Andi Kleen Just a simple test Signed-off-by: Andi Kleen <ak@linux.intel.com> ---- v2: Avoid bashisms. Use noploop v3: Avoid false positive in shellcheck v4: Use :S in the test (Ian, Namhyung) --- tools/perf/tests/shell/script.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/perf/tests/shell/script.sh b/tools/perf/tests/shell/script.sh index c1a603653662..e69c3548583a 100755 --- a/tools/perf/tests/shell/script.sh +++ b/tools/perf/tests/shell/script.sh @@ -7,6 +7,7 @@ set -e temp_dir=$(mktemp -d /tmp/perf-test-script.XXXXXXXXXX) perfdatafile="${temp_dir}/perf.data" +scriptoutput="${temp_dir}/script" db_test="${temp_dir}/db_test.py" err=0 @@ -88,8 +89,21 @@ test_parallel_perf() echo "parallel-perf test [Success]" } +test_metric() +{ + echo "script metric test" + if ! perf list | grep -q cycles ; then return ; fi + if ! perf list | grep -q instructions ; then return ; fi + perf record -e '{cycles,instructions}:S' -o "${perfdatafile}" perf test -w noploop + perf script -i "${perfdatafile}" -F +metric > $scriptoutput + test "`grep -c metric $scriptoutput`" -gt 5 + grep metric $scriptoutput | head + echo "script metric test [Success]" +} + test_db test_parallel_perf +test_metric cleanup -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v8 4/4] Add a test case for perf script -F +metric 2024-08-01 21:28 ` [PATCH v8 4/4] Add a test case for " Andi Kleen @ 2024-08-05 19:25 ` Namhyung Kim 0 siblings, 0 replies; 8+ messages in thread From: Namhyung Kim @ 2024-08-05 19:25 UTC (permalink / raw) To: Andi Kleen; +Cc: linux-perf-users On Thu, Aug 01, 2024 at 02:28:44PM -0700, Andi Kleen wrote: > Just a simple test Can you please briefly describe what the test does? Ideally with an example output with 'perf test -vv'. Thanks, Namhyung > > Signed-off-by: Andi Kleen <ak@linux.intel.com> > > ---- > > v2: Avoid bashisms. Use noploop > v3: Avoid false positive in shellcheck > v4: Use :S in the test (Ian, Namhyung) > --- > tools/perf/tests/shell/script.sh | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/tools/perf/tests/shell/script.sh b/tools/perf/tests/shell/script.sh > index c1a603653662..e69c3548583a 100755 > --- a/tools/perf/tests/shell/script.sh > +++ b/tools/perf/tests/shell/script.sh > @@ -7,6 +7,7 @@ set -e > temp_dir=$(mktemp -d /tmp/perf-test-script.XXXXXXXXXX) > > perfdatafile="${temp_dir}/perf.data" > +scriptoutput="${temp_dir}/script" > db_test="${temp_dir}/db_test.py" > > err=0 > @@ -88,8 +89,21 @@ test_parallel_perf() > echo "parallel-perf test [Success]" > } > > +test_metric() > +{ > + echo "script metric test" > + if ! perf list | grep -q cycles ; then return ; fi > + if ! perf list | grep -q instructions ; then return ; fi > + perf record -e '{cycles,instructions}:S' -o "${perfdatafile}" perf test -w noploop > + perf script -i "${perfdatafile}" -F +metric > $scriptoutput > + test "`grep -c metric $scriptoutput`" -gt 5 > + grep metric $scriptoutput | head > + echo "script metric test [Success]" > +} > + > test_db > test_parallel_perf > +test_metric > > cleanup > > -- > 2.45.2 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v8 1/4] Create source symlink in perf object dir @ 2024-08-07 3:30 Andi Kleen 2024-08-07 3:30 ` [PATCH v8 4/4] Add a test case for perf script -F +metric Andi Kleen 0 siblings, 1 reply; 8+ messages in thread From: Andi Kleen @ 2024-08-07 3:30 UTC (permalink / raw) To: namhyung; +Cc: linux-perf-users, Andi Kleen Create a source symlink to the original source in the objdir. This is similar to what the main kernel build script does. Signed-off-by: Andi Kleen <ak@linux.intel.com> --- tools/perf/Makefile.perf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 175e4c7898f0..d46892d8223b 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -163,6 +163,8 @@ ifneq ($(OUTPUT),) # for flex/bison parsers. VPATH += $(OUTPUT) export VPATH +# create symlink to the original source +SOURCE := $(shell ln -sf $(srctree)/tools/perf $(OUTPUT)/source) endif ifeq ($(V),1) -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v8 4/4] Add a test case for perf script -F +metric 2024-08-07 3:30 [PATCH v8 1/4] Create source symlink in perf object dir Andi Kleen @ 2024-08-07 3:30 ` Andi Kleen 0 siblings, 0 replies; 8+ messages in thread From: Andi Kleen @ 2024-08-07 3:30 UTC (permalink / raw) To: namhyung; +Cc: linux-perf-users, Andi Kleen Sample a noploop workload with cycles and instructions and check if there is at least one metric being output by perf script. The output is % perf test -v 98 98: perf script tests ... script metric test [ perf record: Woken up 2 times to write data ] [ perf record: Captured and wrote 0.429 MB /tmp/perf-test-script.nkvvuzMOla/perf.data (8174 samples) ] perf-exec 853636 3967843.162782: metric: 0.15 insn per cycle perf 853636 3967843.163210: metric: 0.87 insn per cycle perf 853636 3967843.163226: metric: 0.84 insn per cycle perf 853636 3967843.163240: metric: 0.88 insn per cycle perf 853636 3967843.163276: metric: 1.06 insn per cycle perf 853636 3967843.163387: metric: 1.09 insn per cycle perf 853636 3967843.163578: metric: 1.17 insn per cycle perf 853636 3967843.164412: metric: 4.53 insn per cycle perf 853636 3967843.164623: metric: 1.18 insn per cycle perf 853636 3967843.164817: metric: 1.25 insn per cycle script metric test [Success] ... % Signed-off-by: Andi Kleen <ak@linux.intel.com> ---- v2: Avoid bashisms. Use noploop v3: Avoid false positive in shellcheck v4: Use :S in the test (Ian, Namhyung) v5: Update commit message. --- tools/perf/tests/shell/script.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/perf/tests/shell/script.sh b/tools/perf/tests/shell/script.sh index c1a603653662..e69c3548583a 100755 --- a/tools/perf/tests/shell/script.sh +++ b/tools/perf/tests/shell/script.sh @@ -7,6 +7,7 @@ set -e temp_dir=$(mktemp -d /tmp/perf-test-script.XXXXXXXXXX) perfdatafile="${temp_dir}/perf.data" +scriptoutput="${temp_dir}/script" db_test="${temp_dir}/db_test.py" err=0 @@ -88,8 +89,21 @@ test_parallel_perf() echo "parallel-perf test [Success]" } +test_metric() +{ + echo "script metric test" + if ! perf list | grep -q cycles ; then return ; fi + if ! perf list | grep -q instructions ; then return ; fi + perf record -e '{cycles,instructions}:S' -o "${perfdatafile}" perf test -w noploop + perf script -i "${perfdatafile}" -F +metric > $scriptoutput + test "`grep -c metric $scriptoutput`" -gt 5 + grep metric $scriptoutput | head + echo "script metric test [Success]" +} + test_db test_parallel_perf +test_metric cleanup -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-08-07 3:30 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-08-01 21:28 [PATCH v8 1/4] Create source symlink in perf object dir Andi Kleen 2024-08-01 21:28 ` [PATCH v8 2/4] perf test: Support external tests for separate objdir Andi Kleen 2024-08-05 19:02 ` Namhyung Kim 2024-08-01 21:28 ` [PATCH v8 3/4] perf script: Fix perf script -F +metric Andi Kleen 2024-08-05 19:23 ` Namhyung Kim 2024-08-01 21:28 ` [PATCH v8 4/4] Add a test case for " Andi Kleen 2024-08-05 19:25 ` Namhyung Kim -- strict thread matches above, loose matches on Subject: below -- 2024-08-07 3:30 [PATCH v8 1/4] Create source symlink in perf object dir Andi Kleen 2024-08-07 3:30 ` [PATCH v8 4/4] Add a test case for perf script -F +metric Andi Kleen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).