From: Adrian Hunter <adrian.hunter@intel.com>
To: Thomas Gleixner <tglx@linutronix.de>,
Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Andy Lutomirski <luto@kernel.org>,
"H. Peter Anvin" <hpa@zytor.com>, Andi Kleen <ak@linux.intel.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Joerg Roedel <joro@8bytes.org>, Jiri Olsa <jolsa@redhat.com>,
linux-kernel@vger.kernel.org, x86@kernel.org
Subject: [PATCH RFC 00/19] perf tools and x86_64 KPTI entry trampolines
Date: Wed, 9 May 2018 14:43:29 +0300 [thread overview]
Message-ID: <1525866228-30321-1-git-send-email-adrian.hunter@intel.com> (raw)
Hi
Perf tools do not know about x86_64 KPTI entry trampolines - see example
below. These patches add a workaround, namely "perf tools: Workaround
missing maps for x86_64 KPTI entry trampolines", which has the limitation
that it hard codes the addresses. Note that the workaround will work for
old kernels and old perf.data files, but not for future kernels if the
trampoline addresses are ever changed.
At present, perf tools uses /proc/kallsyms to construct a memory map for
the kernel. Recording such a map in the perf.data file is necessary to
deal with kernel relocation and KASLR.
While it is reasonable on its own terms, to add symbols for the trampolines
to /proc/kallsyms, the motivation here is to have perf tools use them to
create memory maps in the same fashion as is done for the kernel text.
So the first 2 patches add symbols to /proc/kallsyms for the trampolines:
kallsyms: Simplify update_iter_mod()
kallsyms, x86: Export addresses of syscall trampolines
perf tools have the ability to use /proc/kcore (in conjunction with
/proc/kallsyms) as the kernel image. So the next 2 patches add program
headers for the trampolines to the kcore ELF:
x86: Add entry trampolines to kcore
x86: kcore: Give entry trampolines all the same offset in kcore
It is worth noting that, with the kcore changes alone, perf tools require
no changes to recognise the trampolines when using /proc/kcore.
Similarly, if perf tools are used with a matching kallsyms only (by denying
access to /proc/kcore or a vmlinux image), then the kallsyms patches are
sufficient to recognise the trampolines with no changes needed to the
tools.
However, in the general case, when using vmlinux or dealing with
relocations, perf tools needs memory maps for the trampolines. Because the
kernel text map is constructed as a special case, using the same approach
for the trampolines means treating them as a special case also, which
requires a number of changes to perf tools, and the remaining patches deal
with that.
Example: make a program that does lots of small syscalls e.g.
$ cat uname_x_n.c
#include <sys/utsname.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long n = argc > 1 ? strtol(argv[1], NULL, 0) : 0;
struct utsname u;
while (n--)
uname(&u);
return 0;
}
and then:
sudo perf record uname_x_n 100000
sudo perf report --stdio
Before the changes, there are unknown symbols:
# Overhead Command Shared Object Symbol
# ........ ......... ................ ..................................
#
41.91% uname_x_n [kernel.vmlinux] [k] syscall_return_via_sysret
19.22% uname_x_n [kernel.vmlinux] [k] copy_user_enhanced_fast_string
18.70% uname_x_n [unknown] [k] 0xfffffe00000e201b
4.09% uname_x_n libc-2.19.so [.] __GI___uname
3.08% uname_x_n [kernel.vmlinux] [k] do_syscall_64
3.02% uname_x_n [unknown] [k] 0xfffffe00000e2025
2.32% uname_x_n [kernel.vmlinux] [k] down_read
2.27% uname_x_n ld-2.19.so [.] _dl_start
1.97% uname_x_n [unknown] [k] 0xfffffe00000e201e
1.25% uname_x_n [kernel.vmlinux] [k] up_read
1.02% uname_x_n [unknown] [k] 0xfffffe00000e200c
0.99% uname_x_n [kernel.vmlinux] [k] entry_SYSCALL_64
0.16% uname_x_n [kernel.vmlinux] [k] flush_signal_handlers
0.01% perf [kernel.vmlinux] [k] native_sched_clock
0.00% perf [kernel.vmlinux] [k] native_write_msr
After the changes there are not:
# Overhead Command Shared Object Symbol
# ........ ......... ................ ..................................
#
41.91% uname_x_n [kernel.vmlinux] [k] syscall_return_via_sysret
24.70% uname_x_n [kernel.vmlinux] [k] entry_SYSCALL_64_trampoline
19.22% uname_x_n [kernel.vmlinux] [k] copy_user_enhanced_fast_string
4.09% uname_x_n libc-2.19.so [.] __GI___uname
3.08% uname_x_n [kernel.vmlinux] [k] do_syscall_64
2.32% uname_x_n [kernel.vmlinux] [k] down_read
2.27% uname_x_n ld-2.19.so [.] _dl_start
1.25% uname_x_n [kernel.vmlinux] [k] up_read
0.99% uname_x_n [kernel.vmlinux] [k] entry_SYSCALL_64
0.16% uname_x_n [kernel.vmlinux] [k] flush_signal_handlers
0.01% perf [kernel.vmlinux] [k] native_sched_clock
0.00% perf [kernel.vmlinux] [k] native_write_msr
Adrian Hunter (17):
kallsyms: Simplify update_iter_mod()
x86: kcore: Give entry trampolines all the same offset in kcore
perf tools: Use the _stest symbol to identify the kernel map when loading kcore
perf tools: Fix kernel_start for KPTI on x86_64
perf tools: Workaround missing maps for x86_64 KPTI entry trampolines
perf tools: Fix map_groups__split_kallsyms() for entry trampoline symbols
perf tools: Allow for special kernel maps
perf tools: Create maps for x86_64 KPTI entry trampolines
perf tools: Synthesize and process mmap events for x86_64 KPTI entry trampolines
perf buildid-cache: kcore_copy: Keep phdr data in a list
perf buildid-cache: kcore_copy: Keep a count of phdrs
perf buildid-cache: kcore_copy: Calculate offset from phnum
perf buildid-cache: kcore_copy: Layout sections
perf buildid-cache: kcore_copy: Iterate phdrs
perf buildid-cache: kcore_copy: Get rid of kernel_map
perf buildid-cache: kcore_copy: Copy x86_64 entry trampoline sections
perf buildid-cache: kcore_copy: Amend the offset of sections that remap kernel text
Alexander Shishkin (2):
kallsyms, x86: Export addresses of syscall trampolines
x86: Add entry trampolines to kcore
arch/x86/mm/cpu_entry_area.c | 28 +++++
fs/proc/kcore.c | 7 +-
include/linux/kcore.h | 13 ++
kernel/kallsyms.c | 46 ++++---
tools/perf/util/event.c | 92 +++++++++++++-
tools/perf/util/machine.c | 288 ++++++++++++++++++++++++++++++++++++++++++-
tools/perf/util/machine.h | 6 +
tools/perf/util/map.c | 22 +++-
tools/perf/util/map.h | 15 ++-
tools/perf/util/symbol-elf.c | 209 ++++++++++++++++++++++++++-----
tools/perf/util/symbol.c | 65 +++++++---
11 files changed, 709 insertions(+), 82 deletions(-)
Regards
Adrian
next reply other threads:[~2018-05-09 11:45 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-09 11:43 Adrian Hunter [this message]
2018-05-09 11:43 ` [PATCH RFC 01/19] kallsyms: Simplify update_iter_mod() Adrian Hunter
2018-05-10 13:01 ` Jiri Olsa
2018-05-10 17:02 ` Hunter, Adrian
2018-05-14 17:55 ` Arnaldo Carvalho de Melo
2018-05-09 11:43 ` [PATCH RFC 02/19] kallsyms, x86: Export addresses of syscall trampolines Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 03/19] x86: Add entry trampolines to kcore Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 04/19] x86: kcore: Give entry trampolines all the same offset in kcore Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 05/19] perf tools: Use the _stest symbol to identify the kernel map when loading kcore Adrian Hunter
2018-05-16 18:04 ` [tip:perf/core] perf tools: Use the "_stest" " tip-bot for Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 06/19] perf tools: Fix kernel_start for KPTI on x86_64 Adrian Hunter
2018-05-09 17:08 ` Arnaldo Carvalho de Melo
2018-05-09 11:43 ` [PATCH RFC 07/19] perf tools: Workaround missing maps for x86_64 KPTI entry trampolines Adrian Hunter
2018-05-09 17:07 ` Arnaldo Carvalho de Melo
2018-05-10 19:08 ` Hunter, Adrian
2018-05-10 20:15 ` Arnaldo Carvalho de Melo
2018-05-10 20:19 ` Arnaldo Carvalho de Melo
2018-05-10 20:47 ` Arnaldo Carvalho de Melo
2018-05-11 11:18 ` Adrian Hunter
2018-05-11 14:45 ` Arnaldo Carvalho de Melo
2018-05-14 13:02 ` Adrian Hunter
2018-05-11 11:15 ` Adrian Hunter
2018-05-15 10:30 ` Jiri Olsa
2018-05-15 10:40 ` Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 08/19] perf tools: Fix map_groups__split_kallsyms() for entry trampoline symbols Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 09/19] perf tools: Allow for special kernel maps Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 10/19] perf tools: Create maps for x86_64 KPTI entry trampolines Adrian Hunter
2018-05-14 8:32 ` Ingo Molnar
2018-05-09 11:43 ` [PATCH RFC 11/19] perf tools: Synthesize and process mmap events " Adrian Hunter
2018-05-15 10:49 ` Jiri Olsa
2018-05-09 11:43 ` [PATCH RFC 12/19] perf buildid-cache: kcore_copy: Keep phdr data in a list Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 13/19] perf buildid-cache: kcore_copy: Keep a count of phdrs Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 14/19] perf buildid-cache: kcore_copy: Calculate offset from phnum Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 15/19] perf buildid-cache: kcore_copy: Layout sections Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 16/19] perf buildid-cache: kcore_copy: Iterate phdrs Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 17/19] perf buildid-cache: kcore_copy: Get rid of kernel_map Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 18/19] perf buildid-cache: kcore_copy: Copy x86_64 entry trampoline sections Adrian Hunter
2018-05-09 11:43 ` [PATCH RFC 19/19] perf buildid-cache: kcore_copy: Amend the offset of sections that remap kernel text Adrian Hunter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1525866228-30321-1-git-send-email-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jolsa@redhat.com \
--cc=joro@8bytes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).