perf machine: Record if a arch has a single user/kernel address space
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 6 Nov 2018 21:07:10 +0000 (23:07 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 17 Dec 2018 17:54:07 +0000 (14:54 -0300)
Some architectures have a single address space for kernel and user
addresses, which makes it possible to determine if an address is in
kernel space or user space. Some don't, e.g.: sparc.

Cache that info in perf_env so that, for instance, code needing to
fallback failed symbol lookups at the kernel space in single address
space arches can lookup at userspace.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: stable@vger.kernel.org # 4.19
Link: http://lkml.kernel.org/r/20181106210712.12098-2-adrian.hunter@intel.com
[ split from a larger patch ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/common.c
tools/perf/arch/common.h
tools/perf/util/machine.h
tools/perf/util/session.c

index 82657c01a3b8e13ebb8a9c82ae37297ba3448867..5f69fd0b745a45315efe5c698aac8edf7d9f3bb9 100644 (file)
@@ -200,3 +200,13 @@ int perf_env__lookup_objdump(struct perf_env *env, const char **path)
 
        return perf_env__lookup_binutils_path(env, "objdump", path);
 }
+
+/*
+ * Some architectures have a single address space for kernel and user addresses,
+ * which makes it possible to determine if an address is in kernel space or user
+ * space.
+ */
+bool perf_env__single_address_space(struct perf_env *env)
+{
+       return strcmp(perf_env__arch(env), "sparc");
+}
index 2167001b18c5ee3de53406ae729856aab6e9f1e3..c298a446d1f6f8f0a626032208565b822cd6abbd 100644 (file)
@@ -5,5 +5,6 @@
 #include "../util/env.h"
 
 int perf_env__lookup_objdump(struct perf_env *env, const char **path);
+bool perf_env__single_address_space(struct perf_env *env);
 
 #endif /* ARCH_PERF_COMMON_H */
index d856b85862e23e9cd3026979ed29c0b75094d9de..ca897a73014c2e779b3fa44ce4e15f24f1bfbc9d 100644 (file)
@@ -42,6 +42,7 @@ struct machine {
        u16               id_hdr_size;
        bool              comm_exec;
        bool              kptr_restrict_warned;
+       bool              single_address_space;
        char              *root_dir;
        char              *mmap_name;
        struct threads    threads[THREADS__TABLE_SIZE];
index 7d2c8ce6cfadb2f7c22841a671214b5bdc41c08a..f8eab197f35ccdbfd49c8b1b0e5a2d1c11393199 100644 (file)
@@ -24,6 +24,7 @@
 #include "thread.h"
 #include "thread-stack.h"
 #include "stat.h"
+#include "arch/common.h"
 
 static int perf_session__deliver_event(struct perf_session *session,
                                       union perf_event *event,
@@ -150,6 +151,9 @@ struct perf_session *perf_session__new(struct perf_data *data,
                session->machines.host.env = &perf_env;
        }
 
+       session->machines.host.single_address_space =
+               perf_env__single_address_space(session->machines.host.env);
+
        if (!data || perf_data__is_write(data)) {
                /*
                 * In O_RDONLY mode this will be performed when reading the