Commit 89d5c48c authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf test: Simplify "object code reading" test

It tries cycles (or cpu-clock on s390) event with exclude_kernel bit to
open.  But other arch on a VM can fail with the hardware event and need
to fallback to the software event in the same way.

So let's get rid of the cpuid check and use generic fallback mechanism
using an array of event candidates.  Now event in the odd index excludes
the kernel so use that for the return value.
Reviewed-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Tested-by: default avatarJames Clark <james.clark@arm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Link: https://lore.kernel.org/r/20231103195541.67788-1-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 9ffa6c75
...@@ -511,38 +511,6 @@ static void fs_something(void) ...@@ -511,38 +511,6 @@ static void fs_something(void)
} }
} }
#ifdef __s390x__
#include "header.h" // for get_cpuid()
#endif
static const char *do_determine_event(bool excl_kernel)
{
const char *event = excl_kernel ? "cycles:u" : "cycles";
#ifdef __s390x__
char cpuid[128], model[16], model_c[16], cpum_cf_v[16];
unsigned int family;
int ret, cpum_cf_a;
if (get_cpuid(cpuid, sizeof(cpuid)))
goto out_clocks;
ret = sscanf(cpuid, "%*[^,],%u,%[^,],%[^,],%[^,],%x", &family, model_c,
model, cpum_cf_v, &cpum_cf_a);
if (ret != 5) /* Not available */
goto out_clocks;
if (excl_kernel && (cpum_cf_a & 4))
return event;
if (!excl_kernel && (cpum_cf_a & 2))
return event;
/* Fall through: missing authorization */
out_clocks:
event = excl_kernel ? "cpu-clock:u" : "cpu-clock";
#endif
return event;
}
static void do_something(void) static void do_something(void)
{ {
fs_something(); fs_something();
...@@ -583,8 +551,10 @@ static int do_test_code_reading(bool try_kcore) ...@@ -583,8 +551,10 @@ static int do_test_code_reading(bool try_kcore)
int err = -1, ret; int err = -1, ret;
pid_t pid; pid_t pid;
struct map *map; struct map *map;
bool have_vmlinux, have_kcore, excl_kernel = false; bool have_vmlinux, have_kcore;
struct dso *dso; struct dso *dso;
const char *events[] = { "cycles", "cycles:u", "cpu-clock", "cpu-clock:u", NULL };
int evidx = 0;
pid = getpid(); pid = getpid();
...@@ -618,7 +588,7 @@ static int do_test_code_reading(bool try_kcore) ...@@ -618,7 +588,7 @@ static int do_test_code_reading(bool try_kcore)
/* No point getting kernel events if there is no kernel object */ /* No point getting kernel events if there is no kernel object */
if (!have_vmlinux && !have_kcore) if (!have_vmlinux && !have_kcore)
excl_kernel = true; evidx++;
threads = thread_map__new_by_tid(pid); threads = thread_map__new_by_tid(pid);
if (!threads) { if (!threads) {
...@@ -646,7 +616,7 @@ static int do_test_code_reading(bool try_kcore) ...@@ -646,7 +616,7 @@ static int do_test_code_reading(bool try_kcore)
goto out_put; goto out_put;
} }
while (1) { while (events[evidx]) {
const char *str; const char *str;
evlist = evlist__new(); evlist = evlist__new();
...@@ -657,7 +627,7 @@ static int do_test_code_reading(bool try_kcore) ...@@ -657,7 +627,7 @@ static int do_test_code_reading(bool try_kcore)
perf_evlist__set_maps(&evlist->core, cpus, threads); perf_evlist__set_maps(&evlist->core, cpus, threads);
str = do_determine_event(excl_kernel); str = events[evidx];
pr_debug("Parsing event '%s'\n", str); pr_debug("Parsing event '%s'\n", str);
ret = parse_event(evlist, str); ret = parse_event(evlist, str);
if (ret < 0) { if (ret < 0) {
...@@ -675,8 +645,14 @@ static int do_test_code_reading(bool try_kcore) ...@@ -675,8 +645,14 @@ static int do_test_code_reading(bool try_kcore)
ret = evlist__open(evlist); ret = evlist__open(evlist);
if (ret < 0) { if (ret < 0) {
if (!excl_kernel) { evidx++;
excl_kernel = true;
if (events[evidx] == NULL && verbose > 0) {
char errbuf[512];
evlist__strerror_open(evlist, errno, errbuf, sizeof(errbuf));
pr_debug("perf_evlist__open() failed!\n%s\n", errbuf);
}
/* /*
* Both cpus and threads are now owned by evlist * Both cpus and threads are now owned by evlist
* and will be freed by following perf_evlist__set_maps * and will be freed by following perf_evlist__set_maps
...@@ -689,17 +665,11 @@ static int do_test_code_reading(bool try_kcore) ...@@ -689,17 +665,11 @@ static int do_test_code_reading(bool try_kcore)
evlist = NULL; evlist = NULL;
continue; continue;
} }
break;
if (verbose > 0) {
char errbuf[512];
evlist__strerror_open(evlist, errno, errbuf, sizeof(errbuf));
pr_debug("perf_evlist__open() failed!\n%s\n", errbuf);
} }
if (events[evidx] == NULL)
goto out_put; goto out_put;
}
break;
}
ret = evlist__mmap(evlist, UINT_MAX); ret = evlist__mmap(evlist, UINT_MAX);
if (ret < 0) { if (ret < 0) {
...@@ -721,7 +691,7 @@ static int do_test_code_reading(bool try_kcore) ...@@ -721,7 +691,7 @@ static int do_test_code_reading(bool try_kcore)
err = TEST_CODE_READING_NO_KERNEL_OBJ; err = TEST_CODE_READING_NO_KERNEL_OBJ;
else if (!have_vmlinux && !try_kcore) else if (!have_vmlinux && !try_kcore)
err = TEST_CODE_READING_NO_VMLINUX; err = TEST_CODE_READING_NO_VMLINUX;
else if (excl_kernel) else if (strstr(events[evidx], ":u"))
err = TEST_CODE_READING_NO_ACCESS; err = TEST_CODE_READING_NO_ACCESS;
else else
err = TEST_CODE_READING_OK; err = TEST_CODE_READING_OK;
......
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