2009-05-02 00:29:57 +08:00
|
|
|
#ifndef _PERF_PERF_H
|
|
|
|
#define _PERF_PERF_H
|
|
|
|
|
2009-05-24 00:28:58 +08:00
|
|
|
#include <time.h>
|
2014-05-05 18:58:31 +08:00
|
|
|
#include <stdbool.h>
|
2014-04-26 03:31:02 +08:00
|
|
|
#include <linux/types.h>
|
2012-11-20 06:21:03 +08:00
|
|
|
#include <linux/perf_event.h>
|
2009-05-24 00:28:58 +08:00
|
|
|
|
2014-05-05 18:58:31 +08:00
|
|
|
extern bool test_attr__enabled;
|
|
|
|
void test_attr__init(void);
|
|
|
|
void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
|
|
|
|
int fd, int group_fd, unsigned long flags);
|
|
|
|
|
|
|
|
#define HAVE_ATTR_TEST
|
|
|
|
#include "perf-sys.h"
|
|
|
|
|
2009-05-02 00:39:47 +08:00
|
|
|
static inline unsigned long long rdclock(void)
|
|
|
|
{
|
|
|
|
struct timespec ts;
|
|
|
|
|
|
|
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
|
|
return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
|
|
|
|
}
|
2009-05-02 00:29:57 +08:00
|
|
|
|
2015-03-25 00:10:38 +08:00
|
|
|
#define MAX_NR_CPUS 1024
|
2009-05-02 00:29:57 +08:00
|
|
|
|
2012-10-30 11:56:02 +08:00
|
|
|
extern const char *input_name;
|
2010-05-18 02:51:10 +08:00
|
|
|
extern bool perf_host, perf_guest;
|
perf tools: Make perf.data more self-descriptive (v8)
The goal of this patch is to include more information about the host
environment into the perf.data so it is more self-descriptive. Overtime,
profiles are captured on various machines and it becomes hard to track
what was recorded, on what machine and when.
This patch provides a way to solve this by extending the perf.data file
with basic information about the host machine. To add those extensions,
we leverage the feature bits capabilities of the perf.data format. The
change is backward compatible with existing perf.data files.
We define the following useful new extensions:
- HEADER_HOSTNAME: the hostname
- HEADER_OSRELEASE: the kernel release number
- HEADER_ARCH: the hw architecture
- HEADER_CPUDESC: generic CPU description
- HEADER_NRCPUS: number of online/avail cpus
- HEADER_CMDLINE: perf command line
- HEADER_VERSION: perf version
- HEADER_TOPOLOGY: cpu topology
- HEADER_EVENT_DESC: full event description (attrs)
- HEADER_CPUID: easy-to-parse low level CPU identication
The small granularity for the entries is to make it easier to extend
without breaking backward compatiblity. Many entries are provided as
ASCII strings.
Perf report/script have been modified to print the basic information as
easy-to-parse ASCII strings. Extended information about CPU and NUMA
topology may be requested with the -I option.
Thanks to David Ahern for reviewing and testing the many versions of
this patch.
$ perf report --stdio
# ========
# captured on : Mon Sep 26 15:22:14 2011
# hostname : quad
# os release : 3.1.0-rc4-tip
# perf version : 3.1.0-rc4
# arch : x86_64
# nrcpus online : 4
# nrcpus avail : 4
# cpudesc : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
# cpuid : GenuineIntel,6,15,11
# total memory : 8105360 kB
# cmdline : /home/eranian/perfmon/official/tip/build/tools/perf/perf record date
# event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, id = { 29, 30, 31,
# HEADER_CPU_TOPOLOGY info available, use -I to display
# HEADER_NUMA_TOPOLOGY info available, use -I to display
# ========
#
...
$ perf report --stdio -I
# ========
# captured on : Mon Sep 26 15:22:14 2011
# hostname : quad
# os release : 3.1.0-rc4-tip
# perf version : 3.1.0-rc4
# arch : x86_64
# nrcpus online : 4
# nrcpus avail : 4
# cpudesc : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
# cpuid : GenuineIntel,6,15,11
# total memory : 8105360 kB
# cmdline : /home/eranian/perfmon/official/tip/build/tools/perf/perf record date
# event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, id = { 29, 30, 31,
# sibling cores : 0-3
# sibling threads : 0
# sibling threads : 1
# sibling threads : 2
# sibling threads : 3
# node0 meminfo : total = 8320608 kB, free = 7571024 kB
# node0 cpu list : 0-3
# ========
#
...
Reviewed-by: David Ahern <dsahern@gmail.com>
Tested-by: David Ahern <dsahern@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Andi Kleen <ak@linux.intel.com>
Link: http://lkml.kernel.org/r/20110930134040.GA5575@quad
Signed-off-by: Stephane Eranian <eranian@google.com>
[ committer notes: Use --show-info in the tools as was in the docs, rename
perf_header_fprintf_info to perf_file_section__fprintf_info, fixup
conflict with f69b64f7 "perf: Support setting the disassembler style" ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2011-09-30 21:40:40 +08:00
|
|
|
extern const char perf_version_string[];
|
2010-04-19 13:32:50 +08:00
|
|
|
|
2011-10-13 19:52:46 +08:00
|
|
|
void pthread__unblock_sigwinch(void);
|
|
|
|
|
2012-04-26 13:15:22 +08:00
|
|
|
#include "util/target.h"
|
2012-04-26 13:15:15 +08:00
|
|
|
|
2013-12-20 01:43:45 +08:00
|
|
|
struct record_opts {
|
2013-11-13 03:46:16 +08:00
|
|
|
struct target target;
|
2011-11-12 01:12:56 +08:00
|
|
|
bool group;
|
2011-11-09 00:41:57 +08:00
|
|
|
bool inherit_stat;
|
2014-01-15 04:52:14 +08:00
|
|
|
bool no_buffering;
|
2011-11-09 00:41:57 +08:00
|
|
|
bool no_inherit;
|
2013-11-18 17:55:57 +08:00
|
|
|
bool no_inherit_set;
|
2011-11-09 00:41:57 +08:00
|
|
|
bool no_samples;
|
|
|
|
bool raw_samples;
|
|
|
|
bool sample_address;
|
2013-01-24 23:10:29 +08:00
|
|
|
bool sample_weight;
|
2011-11-09 00:41:57 +08:00
|
|
|
bool sample_time;
|
2015-07-06 19:51:01 +08:00
|
|
|
bool sample_time_set;
|
2016-08-02 02:02:35 +08:00
|
|
|
bool sample_cpu;
|
2011-12-20 22:32:45 +08:00
|
|
|
bool period;
|
2015-02-25 07:13:40 +08:00
|
|
|
bool running_time;
|
2015-04-09 23:53:44 +08:00
|
|
|
bool full_auxtrace;
|
2015-04-30 22:37:31 +08:00
|
|
|
bool auxtrace_snapshot_mode;
|
2015-07-21 17:44:04 +08:00
|
|
|
bool record_switch_events;
|
2016-02-15 16:34:31 +08:00
|
|
|
bool all_kernel;
|
|
|
|
bool all_user;
|
perf record: Add --tail-synthesize option
When working with overwritable ring buffer there's a inconvenience
problem: if perf dumps data after a long period after it starts,
non-sample events may lost, which makes following 'perf report' unable
to identify proc name and mmap layout. For example:
# perf record -m 4 -e raw_syscalls:* -g --overwrite --switch-output \
dd if=/dev/zero of=/dev/null
send SIGUSR2 after dd runs long enough. The resuling perf.data lost
correct comm and mmap events:
# perf script -i perf.data.2016061522374354
perf 24478 [004] 2581325.601789: raw_syscalls:sys_exit: NR 0 = 512
^^^^
Should be 'dd'
27b2e8 syscall_slow_exit_work+0xfe2000e3 (/lib/modules/4.6.0-rc3+/build/vmlinux)
203cc7 do_syscall_64+0xfe200117 (/lib/modules/4.6.0-rc3+/build/vmlinux)
b18d83 return_from_SYSCALL_64+0xfe200000 (/lib/modules/4.6.0-rc3+/build/vmlinux)
7f47c417edf0 [unknown] ([unknown])
^^^^^^^^^^^^
Fail to unwind
This patch provides a '--tail-synthesize' option, allows perf to collect
system status when finalizing output file. In resuling output file, the
non-sample events reflect system status when dumping data.
After this patch:
# perf record -m 4 -e raw_syscalls:* -g --overwrite --switch-output --tail-synthesize \
dd if=/dev/zero of=/dev/null
# perf script -i perf.data.2016061600544998
dd 27364 [004] 2583244.994464: raw_syscalls:sys_enter: NR 1 (1, ...
^^
Correct comm
203a18 syscall_trace_enter_phase2+0xfe2001a8 ([kernel.kallsyms])
203aa5 syscall_trace_enter+0xfe200055 ([kernel.kallsyms])
203caa do_syscall_64+0xfe2000fa ([kernel.kallsyms])
b18d83 return_from_SYSCALL_64+0xfe200000 ([kernel.kallsyms])
d8e50 __GI___libc_write+0xffff01d9639f4010 (/tmp/oxygen_root-w00229757/lib64/libc-2.18.so)
^^^^^
Correct unwind
This option doesn't aim to solve this problem completely. If a process
terminates before SIGUSR2, we still lost its COMM and MMAP events. For
example, we can't unwind correctly from the final perf.data we get from
the previous example, because when perf collects the final output file
(when we press C-c), 'dd' has been terminated so its '/proc/<pid>/mmap'
becomes empty.
However, this is a cheaper choice. To completely solve this problem we
need to continously output non-sample events. To satisify the
requirement of daemonization, we need to merge them periodically. It is
possible but requires much more code and cycles.
Automatically select --tail-synthesize when --overwrite is provided.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468485287-33422-16-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2016-07-14 16:34:47 +08:00
|
|
|
bool tail_synthesize;
|
perf tools: Enable overwrite settings
This patch allows following config terms and option:
Globally setting events to overwrite;
# perf record --overwrite ...
Set specific events to be overwrite or no-overwrite.
# perf record --event cycles/overwrite/ ...
# perf record --event cycles/no-overwrite/ ...
Add missing config terms and update the config term array size because
the longest string length has changed.
For overwritable events, it automatically selects attr.write_backward
since perf requires it to be backward for reading.
Test result:
# perf record --overwrite -e syscalls:*enter_nanosleep* usleep 1
[ perf record: Woken up 2 times to write data ]
[ perf record: Captured and wrote 0.011 MB perf.data (1 samples) ]
# perf evlist -v
syscalls:sys_enter_nanosleep: type: 2, size: 112, config: 0x134, { sample_period, sample_freq }: 1, sample_type: IP|TID|TIME|CPU|PERIOD|RAW, disabled: 1, inherit: 1, mmap: 1, comm: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1, write_backward: 1
# Tip: use 'perf evlist --trace-fields' to show fields for tracepoint events
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468485287-33422-14-git-send-email-wangnan0@huawei.com
Signed-off-by: He Kuang <hekuang@huawei.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2016-07-14 16:34:45 +08:00
|
|
|
bool overwrite;
|
2011-11-09 00:41:57 +08:00
|
|
|
unsigned int freq;
|
2011-11-09 19:16:26 +08:00
|
|
|
unsigned int mmap_pages;
|
2015-04-09 23:53:44 +08:00
|
|
|
unsigned int auxtrace_mmap_pages;
|
2011-11-09 00:41:57 +08:00
|
|
|
unsigned int user_freq;
|
2012-05-26 05:13:44 +08:00
|
|
|
u64 branch_stack;
|
perf record: Add ability to name registers to record
This patch modifies the -I/--int-regs option to enablepassing the name
of the registers to sample on interrupt. Registers can be specified by
their symbolic names. For instance on x86, --intr-regs=ax,si.
The motivation is to reduce the size of the perf.data file and the
overhead of sampling by only collecting the registers useful to a
specific analysis. For instance, for value profiling, sampling only the
registers used to passed arguements to functions.
With no parameter, the --intr-regs still records all possible registers
based on the architecture.
To name registers, it is necessary to use the long form of the option,
i.e., --intr-regs:
$ perf record --intr-regs=si,di,r8,r9 .....
To record any possible registers:
$ perf record -I .....
$ perf report --intr-regs ...
To display the register, one can use perf report -D
To list the available registers:
$ perf record --intr-regs=\?
available registers: AX BX CX DX SI DI BP SP IP FLAGS CS SS R8 R9 R10 R11 R12 R13 R14 R15
Signed-off-by: Stephane Eranian <eranian@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1441039273-16260-4-git-send-email-eranian@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-09-01 00:41:12 +08:00
|
|
|
u64 sample_intr_regs;
|
2011-11-09 00:41:57 +08:00
|
|
|
u64 default_interval;
|
|
|
|
u64 user_interval;
|
2015-04-30 22:37:31 +08:00
|
|
|
size_t auxtrace_snapshot_size;
|
|
|
|
const char *auxtrace_snapshot_opts;
|
2013-09-20 22:40:43 +08:00
|
|
|
bool sample_transaction;
|
2014-01-12 05:38:27 +08:00
|
|
|
unsigned initial_delay;
|
2015-03-31 06:19:31 +08:00
|
|
|
bool use_clockid;
|
|
|
|
clockid_t clockid;
|
2015-06-17 21:51:11 +08:00
|
|
|
unsigned int proc_map_timeout;
|
2011-11-09 00:41:57 +08:00
|
|
|
};
|
|
|
|
|
2014-10-22 23:15:46 +08:00
|
|
|
struct option;
|
|
|
|
extern const char * const *record_usage;
|
|
|
|
extern struct option *record_options;
|
2009-05-02 00:29:57 +08:00
|
|
|
#endif
|