Commit 290fa68b authored by Chengdong Li's avatar Chengdong Li Committed by Arnaldo Carvalho de Melo

perf test tsc: Fix error message when not supported

By default `perf test tsc` does not return the error message when the
child process detected kernel does not support it. Instead, the child
process prints an error message to stderr, unfortunately stderr is
redirected to /dev/null when verbose <= 0.

This patch does:

- return TEST_SKIP to the parent process instead of TEST_OK when
  perf_read_tsc_conversion() is not supported.

- Add a new subtest of testing if TSC is supported on current
  architecture by moving exist code to a separate function.
  It avoids two places in test__perf_time_to_tsc() that return
  TEST_SKIP by doing this.

- Extend the test suite definition to contain above two subtests.
  Current test_suite and test_case structs do not support printing skip
  reason when the number of subtest less than 1. To print skip reason, it
  is necessary to extend current test suite definition.
Reviewed-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarChengdong Li <chengdongli@tencent.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: likexu@tencent.com
Link: https://lore.kernel.org/r/20220408084748.43707-1-chengdongli@tencent.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3a8a0475
...@@ -47,6 +47,17 @@ ...@@ -47,6 +47,17 @@
} \ } \
} }
static int test__tsc_is_supported(struct test_suite *test __maybe_unused,
int subtest __maybe_unused)
{
if (!TSC_IS_SUPPORTED) {
pr_debug("Test not supported on this architecture\n");
return TEST_SKIP;
}
return TEST_OK;
}
/** /**
* test__perf_time_to_tsc - test converting perf time to TSC. * test__perf_time_to_tsc - test converting perf time to TSC.
* *
...@@ -70,7 +81,7 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su ...@@ -70,7 +81,7 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su
struct perf_cpu_map *cpus = NULL; struct perf_cpu_map *cpus = NULL;
struct evlist *evlist = NULL; struct evlist *evlist = NULL;
struct evsel *evsel = NULL; struct evsel *evsel = NULL;
int err = -1, ret, i; int err = TEST_FAIL, ret, i;
const char *comm1, *comm2; const char *comm1, *comm2;
struct perf_tsc_conversion tc; struct perf_tsc_conversion tc;
struct perf_event_mmap_page *pc; struct perf_event_mmap_page *pc;
...@@ -79,10 +90,6 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su ...@@ -79,10 +90,6 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su
u64 test_time, comm1_time = 0, comm2_time = 0; u64 test_time, comm1_time = 0, comm2_time = 0;
struct mmap *md; struct mmap *md;
if (!TSC_IS_SUPPORTED) {
pr_debug("Test not supported on this architecture");
return TEST_SKIP;
}
threads = thread_map__new(-1, getpid(), UINT_MAX); threads = thread_map__new(-1, getpid(), UINT_MAX);
CHECK_NOT_NULL__(threads); CHECK_NOT_NULL__(threads);
...@@ -124,8 +131,8 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su ...@@ -124,8 +131,8 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su
ret = perf_read_tsc_conversion(pc, &tc); ret = perf_read_tsc_conversion(pc, &tc);
if (ret) { if (ret) {
if (ret == -EOPNOTSUPP) { if (ret == -EOPNOTSUPP) {
fprintf(stderr, " (not supported)"); pr_debug("perf_read_tsc_conversion is not supported in current kernel\n");
return 0; err = TEST_SKIP;
} }
goto out_err; goto out_err;
} }
...@@ -191,7 +198,7 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su ...@@ -191,7 +198,7 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su
test_tsc >= comm2_tsc) test_tsc >= comm2_tsc)
goto out_err; goto out_err;
err = 0; err = TEST_OK;
out_err: out_err:
evlist__delete(evlist); evlist__delete(evlist);
...@@ -200,4 +207,15 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su ...@@ -200,4 +207,15 @@ static int test__perf_time_to_tsc(struct test_suite *test __maybe_unused, int su
return err; return err;
} }
DEFINE_SUITE("Convert perf time to TSC", perf_time_to_tsc); static struct test_case time_to_tsc_tests[] = {
TEST_CASE_REASON("TSC support", tsc_is_supported,
"This architecture does not support"),
TEST_CASE_REASON("Perf time to TSC", perf_time_to_tsc,
"perf_read_tsc_conversion is not supported"),
{ .name = NULL, }
};
struct test_suite suite__perf_time_to_tsc = {
.desc = "Convert perf time to TSC",
.test_cases = time_to_tsc_tests,
};
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