diff options
author | Takashi Iwai <tiwai@suse.de> | 2018-03-19 11:59:34 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2018-03-19 12:00:01 -0400 |
commit | 4654eba8cbb3fcf48c6fc24fbaffa0623d9faea2 (patch) | |
tree | 0b3056c04bda1988a3705f315680224387d5a68b /tools/perf | |
parent | 09b9ddfaa18317f463085d602cf5f60a5fa88665 (diff) | |
parent | a6618f4aedb2b60932d766bd82ae7ce866e842aa (diff) |
Merge branch 'for-linus' into for-next
Back-merge of for-linus branch for applying the further UAC3 patches.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'tools/perf')
36 files changed, 953 insertions, 186 deletions
diff --git a/tools/perf/Documentation/perf-data.txt b/tools/perf/Documentation/perf-data.txt index f0796a47dfa3..90bb4aabe4f8 100644 --- a/tools/perf/Documentation/perf-data.txt +++ b/tools/perf/Documentation/perf-data.txt | |||
@@ -30,6 +30,10 @@ OPTIONS for 'convert' | |||
30 | -i:: | 30 | -i:: |
31 | Specify input perf data file path. | 31 | Specify input perf data file path. |
32 | 32 | ||
33 | -f:: | ||
34 | --force:: | ||
35 | Don't complain, do it. | ||
36 | |||
33 | -v:: | 37 | -v:: |
34 | --verbose:: | 38 | --verbose:: |
35 | Be more verbose (show counter open errors, etc). | 39 | Be more verbose (show counter open errors, etc). |
diff --git a/tools/perf/Documentation/perf-kallsyms.txt b/tools/perf/Documentation/perf-kallsyms.txt index 954ea9e21236..cf9f4040ea5c 100644 --- a/tools/perf/Documentation/perf-kallsyms.txt +++ b/tools/perf/Documentation/perf-kallsyms.txt | |||
@@ -8,7 +8,7 @@ perf-kallsyms - Searches running kernel for symbols | |||
8 | SYNOPSIS | 8 | SYNOPSIS |
9 | -------- | 9 | -------- |
10 | [verse] | 10 | [verse] |
11 | 'perf kallsyms <options> symbol_name[,symbol_name...]' | 11 | 'perf kallsyms' [<options>] symbol_name[,symbol_name...] |
12 | 12 | ||
13 | DESCRIPTION | 13 | DESCRIPTION |
14 | ----------- | 14 | ----------- |
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 9b0351d3ce34..012328038594 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
@@ -146,12 +146,6 @@ define allow-override | |||
146 | $(eval $(1) = $(2))) | 146 | $(eval $(1) = $(2))) |
147 | endef | 147 | endef |
148 | 148 | ||
149 | # Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix. | ||
150 | $(call allow-override,CC,$(CROSS_COMPILE)gcc) | ||
151 | $(call allow-override,AR,$(CROSS_COMPILE)ar) | ||
152 | $(call allow-override,LD,$(CROSS_COMPILE)ld) | ||
153 | $(call allow-override,CXX,$(CROSS_COMPILE)g++) | ||
154 | |||
155 | LD += $(EXTRA_LDFLAGS) | 149 | LD += $(EXTRA_LDFLAGS) |
156 | 150 | ||
157 | HOSTCC ?= gcc | 151 | HOSTCC ?= gcc |
diff --git a/tools/perf/arch/s390/Makefile b/tools/perf/arch/s390/Makefile index 48228de415d0..dfa6e3103437 100644 --- a/tools/perf/arch/s390/Makefile +++ b/tools/perf/arch/s390/Makefile | |||
@@ -10,15 +10,19 @@ PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1 | |||
10 | 10 | ||
11 | out := $(OUTPUT)arch/s390/include/generated/asm | 11 | out := $(OUTPUT)arch/s390/include/generated/asm |
12 | header := $(out)/syscalls_64.c | 12 | header := $(out)/syscalls_64.c |
13 | sysdef := $(srctree)/tools/arch/s390/include/uapi/asm/unistd.h | 13 | syskrn := $(srctree)/arch/s390/kernel/syscalls/syscall.tbl |
14 | sysprf := $(srctree)/tools/perf/arch/s390/entry/syscalls/ | 14 | sysprf := $(srctree)/tools/perf/arch/s390/entry/syscalls |
15 | sysdef := $(sysprf)/syscall.tbl | ||
15 | systbl := $(sysprf)/mksyscalltbl | 16 | systbl := $(sysprf)/mksyscalltbl |
16 | 17 | ||
17 | # Create output directory if not already present | 18 | # Create output directory if not already present |
18 | _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)') | 19 | _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)') |
19 | 20 | ||
20 | $(header): $(sysdef) $(systbl) | 21 | $(header): $(sysdef) $(systbl) |
21 | $(Q)$(SHELL) '$(systbl)' '$(CC)' $(sysdef) > $@ | 22 | @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \ |
23 | (diff -B $(sysdef) $(syskrn) >/dev/null) \ | ||
24 | || echo "Warning: Kernel ABI header at '$(sysdef)' differs from latest version at '$(syskrn)'" >&2 )) || true | ||
25 | $(Q)$(SHELL) '$(systbl)' $(sysdef) > $@ | ||
22 | 26 | ||
23 | clean:: | 27 | clean:: |
24 | $(call QUIET_CLEAN, s390) $(RM) $(header) | 28 | $(call QUIET_CLEAN, s390) $(RM) $(header) |
diff --git a/tools/perf/arch/s390/entry/syscalls/mksyscalltbl b/tools/perf/arch/s390/entry/syscalls/mksyscalltbl index 7fa0d0abd419..72ecbb676370 100755 --- a/tools/perf/arch/s390/entry/syscalls/mksyscalltbl +++ b/tools/perf/arch/s390/entry/syscalls/mksyscalltbl | |||
@@ -3,25 +3,23 @@ | |||
3 | # | 3 | # |
4 | # Generate system call table for perf | 4 | # Generate system call table for perf |
5 | # | 5 | # |
6 | # | 6 | # Copyright IBM Corp. 2017, 2018 |
7 | # Copyright IBM Corp. 2017 | ||
8 | # Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | 7 | # Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> |
9 | # | 8 | # |
10 | 9 | ||
11 | gcc=$1 | 10 | SYSCALL_TBL=$1 |
12 | input=$2 | ||
13 | 11 | ||
14 | if ! test -r $input; then | 12 | if ! test -r $SYSCALL_TBL; then |
15 | echo "Could not read input file" >&2 | 13 | echo "Could not read input file" >&2 |
16 | exit 1 | 14 | exit 1 |
17 | fi | 15 | fi |
18 | 16 | ||
19 | create_table() | 17 | create_table() |
20 | { | 18 | { |
21 | local max_nr | 19 | local max_nr nr abi sc discard |
22 | 20 | ||
23 | echo 'static const char *syscalltbl_s390_64[] = {' | 21 | echo 'static const char *syscalltbl_s390_64[] = {' |
24 | while read sc nr; do | 22 | while read nr abi sc discard; do |
25 | printf '\t[%d] = "%s",\n' $nr $sc | 23 | printf '\t[%d] = "%s",\n' $nr $sc |
26 | max_nr=$nr | 24 | max_nr=$nr |
27 | done | 25 | done |
@@ -29,8 +27,6 @@ create_table() | |||
29 | echo "#define SYSCALLTBL_S390_64_MAX_ID $max_nr" | 27 | echo "#define SYSCALLTBL_S390_64_MAX_ID $max_nr" |
30 | } | 28 | } |
31 | 29 | ||
32 | 30 | grep -E "^[[:digit:]]+[[:space:]]+(common|64)" $SYSCALL_TBL \ | |
33 | $gcc -m64 -E -dM -x c $input \ | 31 | |sort -k1 -n \ |
34 | |sed -ne 's/^#define __NR_//p' \ | ||
35 | |sort -t' ' -k2 -nu \ | ||
36 | |create_table | 32 | |create_table |
diff --git a/tools/perf/arch/s390/entry/syscalls/syscall.tbl b/tools/perf/arch/s390/entry/syscalls/syscall.tbl new file mode 100644 index 000000000000..b38d48464368 --- /dev/null +++ b/tools/perf/arch/s390/entry/syscalls/syscall.tbl | |||
@@ -0,0 +1,390 @@ | |||
1 | # SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note | ||
2 | # | ||
3 | # System call table for s390 | ||
4 | # | ||
5 | # Format: | ||
6 | # | ||
7 | # <nr> <abi> <syscall> <entry-64bit> <compat-entry> | ||
8 | # | ||
9 | # where <abi> can be common, 64, or 32 | ||
10 | |||
11 | 1 common exit sys_exit sys_exit | ||
12 | 2 common fork sys_fork sys_fork | ||
13 | 3 common read sys_read compat_sys_s390_read | ||
14 | 4 common write sys_write compat_sys_s390_write | ||
15 | 5 common open sys_open compat_sys_open | ||
16 | 6 common close sys_close sys_close | ||
17 | 7 common restart_syscall sys_restart_syscall sys_restart_syscall | ||
18 | 8 common creat sys_creat compat_sys_creat | ||
19 | 9 common link sys_link compat_sys_link | ||
20 | 10 common unlink sys_unlink compat_sys_unlink | ||
21 | 11 common execve sys_execve compat_sys_execve | ||
22 | 12 common chdir sys_chdir compat_sys_chdir | ||
23 | 13 32 time - compat_sys_time | ||
24 | 14 common mknod sys_mknod compat_sys_mknod | ||
25 | 15 common chmod sys_chmod compat_sys_chmod | ||
26 | 16 32 lchown - compat_sys_s390_lchown16 | ||
27 | 19 common lseek sys_lseek compat_sys_lseek | ||
28 | 20 common getpid sys_getpid sys_getpid | ||
29 | 21 common mount sys_mount compat_sys_mount | ||
30 | 22 common umount sys_oldumount compat_sys_oldumount | ||
31 | 23 32 setuid - compat_sys_s390_setuid16 | ||
32 | 24 32 getuid - compat_sys_s390_getuid16 | ||
33 | 25 32 stime - compat_sys_stime | ||
34 | 26 common ptrace sys_ptrace compat_sys_ptrace | ||
35 | 27 common alarm sys_alarm sys_alarm | ||
36 | 29 common pause sys_pause sys_pause | ||
37 | 30 common utime sys_utime compat_sys_utime | ||
38 | 33 common access sys_access compat_sys_access | ||
39 | 34 common nice sys_nice sys_nice | ||
40 | 36 common sync sys_sync sys_sync | ||
41 | 37 common kill sys_kill sys_kill | ||
42 | 38 common rename sys_rename compat_sys_rename | ||
43 | 39 common mkdir sys_mkdir compat_sys_mkdir | ||
44 | 40 common rmdir sys_rmdir compat_sys_rmdir | ||
45 | 41 common dup sys_dup sys_dup | ||
46 | 42 common pipe sys_pipe compat_sys_pipe | ||
47 | 43 common times sys_times compat_sys_times | ||
48 | 45 common brk sys_brk compat_sys_brk | ||
49 | 46 32 setgid - compat_sys_s390_setgid16 | ||
50 | 47 32 getgid - compat_sys_s390_getgid16 | ||
51 | 48 common signal sys_signal compat_sys_signal | ||
52 | 49 32 geteuid - compat_sys_s390_geteuid16 | ||
53 | 50 32 getegid - compat_sys_s390_getegid16 | ||
54 | 51 common acct sys_acct compat_sys_acct | ||
55 | 52 common umount2 sys_umount compat_sys_umount | ||
56 | 54 common ioctl sys_ioctl compat_sys_ioctl | ||
57 | 55 common fcntl sys_fcntl compat_sys_fcntl | ||
58 | 57 common setpgid sys_setpgid sys_setpgid | ||
59 | 60 common umask sys_umask sys_umask | ||
60 | 61 common chroot sys_chroot compat_sys_chroot | ||
61 | 62 common ustat sys_ustat compat_sys_ustat | ||
62 | 63 common dup2 sys_dup2 sys_dup2 | ||
63 | 64 common getppid sys_getppid sys_getppid | ||
64 | 65 common getpgrp sys_getpgrp sys_getpgrp | ||
65 | 66 common setsid sys_setsid sys_setsid | ||
66 | 67 common sigaction sys_sigaction compat_sys_sigaction | ||
67 | 70 32 setreuid - compat_sys_s390_setreuid16 | ||
68 | 71 32 setregid - compat_sys_s390_setregid16 | ||
69 | 72 common sigsuspend sys_sigsuspend compat_sys_sigsuspend | ||
70 | 73 common sigpending sys_sigpending compat_sys_sigpending | ||
71 | 74 common sethostname sys_sethostname compat_sys_sethostname | ||
72 | 75 common setrlimit sys_setrlimit compat_sys_setrlimit | ||
73 | 76 32 getrlimit - compat_sys_old_getrlimit | ||
74 | 77 common getrusage sys_getrusage compat_sys_getrusage | ||
75 | 78 common gettimeofday sys_gettimeofday compat_sys_gettimeofday | ||
76 | 79 common settimeofday sys_settimeofday compat_sys_settimeofday | ||
77 | 80 32 getgroups - compat_sys_s390_getgroups16 | ||
78 | 81 32 setgroups - compat_sys_s390_setgroups16 | ||
79 | 83 common symlink sys_symlink compat_sys_symlink | ||
80 | 85 common readlink sys_readlink compat_sys_readlink | ||
81 | 86 common uselib sys_uselib compat_sys_uselib | ||
82 | 87 common swapon sys_swapon compat_sys_swapon | ||
83 | 88 common reboot sys_reboot compat_sys_reboot | ||
84 | 89 common readdir - compat_sys_old_readdir | ||
85 | 90 common mmap sys_old_mmap compat_sys_s390_old_mmap | ||
86 | 91 common munmap sys_munmap compat_sys_munmap | ||
87 | 92 common truncate sys_truncate compat_sys_truncate | ||
88 | 93 common ftruncate sys_ftruncate compat_sys_ftruncate | ||
89 | 94 common fchmod sys_fchmod sys_fchmod | ||
90 | 95 32 fchown - compat_sys_s390_fchown16 | ||
91 | 96 common getpriority sys_getpriority sys_getpriority | ||
92 | 97 common setpriority sys_setpriority sys_setpriority | ||
93 | 99 common statfs sys_statfs compat_sys_statfs | ||
94 | 100 common fstatfs sys_fstatfs compat_sys_fstatfs | ||
95 | 101 32 ioperm - - | ||
96 | 102 common socketcall sys_socketcall compat_sys_socketcall | ||
97 | 103 common syslog sys_syslog compat_sys_syslog | ||
98 | 104 common setitimer sys_setitimer compat_sys_setitimer | ||
99 | 105 common getitimer sys_getitimer compat_sys_getitimer | ||
100 | 106 common stat sys_newstat compat_sys_newstat | ||
101 | 107 common lstat sys_newlstat compat_sys_newlstat | ||
102 | 108 common fstat sys_newfstat compat_sys_newfstat | ||
103 | 110 common lookup_dcookie sys_lookup_dcookie compat_sys_lookup_dcookie | ||
104 | 111 common vhangup sys_vhangup sys_vhangup | ||
105 | 112 common idle - - | ||
106 | 114 common wait4 sys_wait4 compat_sys_wait4 | ||
107 | 115 common swapoff sys_swapoff compat_sys_swapoff | ||
108 | 116 common sysinfo sys_sysinfo compat_sys_sysinfo | ||
109 | 117 common ipc sys_s390_ipc compat_sys_s390_ipc | ||
110 | 118 common fsync sys_fsync sys_fsync | ||
111 | 119 common sigreturn sys_sigreturn compat_sys_sigreturn | ||
112 | 120 common clone sys_clone compat_sys_clone | ||
113 | 121 common setdomainname sys_setdomainname compat_sys_setdomainname | ||
114 | 122 common uname sys_newuname compat_sys_newuname | ||
115 | 124 common adjtimex sys_adjtimex compat_sys_adjtimex | ||
116 | 125 common mprotect sys_mprotect compat_sys_mprotect | ||
117 | 126 common sigprocmask sys_sigprocmask compat_sys_sigprocmask | ||
118 | 127 common create_module - - | ||
119 | 128 common init_module sys_init_module compat_sys_init_module | ||
120 | 129 common delete_module sys_delete_module compat_sys_delete_module | ||
121 | 130 common get_kernel_syms - - | ||
122 | 131 common quotactl sys_quotactl compat_sys_quotactl | ||
123 | 132 common getpgid sys_getpgid sys_getpgid | ||
124 | 133 common fchdir sys_fchdir sys_fchdir | ||
125 | 134 common bdflush sys_bdflush compat_sys_bdflush | ||
126 | 135 common sysfs sys_sysfs compat_sys_sysfs | ||
127 | 136 common personality sys_s390_personality sys_s390_personality | ||
128 | 137 common afs_syscall - - | ||
129 | 138 32 setfsuid - compat_sys_s390_setfsuid16 | ||
130 | 139 32 setfsgid - compat_sys_s390_setfsgid16 | ||
131 | 140 32 _llseek - compat_sys_llseek | ||
132 | 141 common getdents sys_getdents compat_sys_getdents | ||
133 | 142 32 _newselect - compat_sys_select | ||
134 | 142 64 select sys_select - | ||
135 | 143 common flock sys_flock sys_flock | ||
136 | 144 common msync sys_msync compat_sys_msync | ||
137 | 145 common readv sys_readv compat_sys_readv | ||
138 | 146 common writev sys_writev compat_sys_writev | ||
139 | 147 common getsid sys_getsid sys_getsid | ||
140 | 148 common fdatasync sys_fdatasync sys_fdatasync | ||
141 | 149 common _sysctl sys_sysctl compat_sys_sysctl | ||
142 | 150 common mlock sys_mlock compat_sys_mlock | ||
143 | 151 common munlock sys_munlock compat_sys_munlock | ||
144 | 152 common mlockall sys_mlockall sys_mlockall | ||
145 | 153 common munlockall sys_munlockall sys_munlockall | ||
146 | 154 common sched_setparam sys_sched_setparam compat_sys_sched_setparam | ||
147 | 155 common sched_getparam sys_sched_getparam compat_sys_sched_getparam | ||
148 | 156 common sched_setscheduler sys_sched_setscheduler compat_sys_sched_setscheduler | ||
149 | 157 common sched_getscheduler sys_sched_getscheduler sys_sched_getscheduler | ||
150 | 158 common sched_yield sys_sched_yield sys_sched_yield | ||
151 | 159 common sched_get_priority_max sys_sched_get_priority_max sys_sched_get_priority_max | ||
152 | 160 common sched_get_priority_min sys_sched_get_priority_min sys_sched_get_priority_min | ||
153 | 161 common sched_rr_get_interval sys_sched_rr_get_interval compat_sys_sched_rr_get_interval | ||
154 | 162 common nanosleep sys_nanosleep compat_sys_nanosleep | ||
155 | 163 common mremap sys_mremap compat_sys_mremap | ||
156 | 164 32 setresuid - compat_sys_s390_setresuid16 | ||
157 | 165 32 getresuid - compat_sys_s390_getresuid16 | ||
158 | 167 common query_module - - | ||
159 | 168 common poll sys_poll compat_sys_poll | ||
160 | 169 common nfsservctl - - | ||
161 | 170 32 setresgid - compat_sys_s390_setresgid16 | ||
162 | 171 32 getresgid - compat_sys_s390_getresgid16 | ||
163 | 172 common prctl sys_prctl compat_sys_prctl | ||
164 | 173 common rt_sigreturn sys_rt_sigreturn compat_sys_rt_sigreturn | ||
165 | 174 common rt_sigaction sys_rt_sigaction compat_sys_rt_sigaction | ||
166 | 175 common rt_sigprocmask sys_rt_sigprocmask compat_sys_rt_sigprocmask | ||
167 | 176 common rt_sigpending sys_rt_sigpending compat_sys_rt_sigpending | ||
168 | 177 common rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait | ||
169 | 178 common rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo | ||
170 | 179 common rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend | ||
171 | 180 common pread64 sys_pread64 compat_sys_s390_pread64 | ||
172 | 181 common pwrite64 sys_pwrite64 compat_sys_s390_pwrite64 | ||
173 | 182 32 chown - compat_sys_s390_chown16 | ||
174 | 183 common getcwd sys_getcwd compat_sys_getcwd | ||
175 | 184 common capget sys_capget compat_sys_capget | ||
176 | 185 common capset sys_capset compat_sys_capset | ||
177 | 186 common sigaltstack sys_sigaltstack compat_sys_sigaltstack | ||
178 | 187 common sendfile sys_sendfile64 compat_sys_sendfile | ||
179 | 188 common getpmsg - - | ||
180 | 189 common putpmsg - - | ||
181 | 190 common vfork sys_vfork sys_vfork | ||
182 | 191 32 ugetrlimit - compat_sys_getrlimit | ||
183 | 191 64 getrlimit sys_getrlimit - | ||
184 | 192 32 mmap2 - compat_sys_s390_mmap2 | ||
185 | 193 32 truncate64 - compat_sys_s390_truncate64 | ||
186 | 194 32 ftruncate64 - compat_sys_s390_ftruncate64 | ||
187 | 195 32 stat64 - compat_sys_s390_stat64 | ||
188 | 196 32 lstat64 - compat_sys_s390_lstat64 | ||
189 | 197 32 fstat64 - compat_sys_s390_fstat64 | ||
190 | 198 32 lchown32 - compat_sys_lchown | ||
191 | 198 64 lchown sys_lchown - | ||
192 | 199 32 getuid32 - sys_getuid | ||
193 | 199 64 getuid sys_getuid - | ||
194 | 200 32 getgid32 - sys_getgid | ||
195 | 200 64 getgid sys_getgid - | ||
196 | 201 32 geteuid32 - sys_geteuid | ||
197 | 201 64 geteuid sys_geteuid - | ||
198 | 202 32 getegid32 - sys_getegid | ||
199 | 202 64 getegid sys_getegid - | ||
200 | 203 32 setreuid32 - sys_setreuid | ||
201 | 203 64 setreuid sys_setreuid - | ||
202 | 204 32 setregid32 - sys_setregid | ||
203 | 204 64 setregid sys_setregid - | ||
204 | 205 32 getgroups32 - compat_sys_getgroups | ||
205 | 205 64 getgroups sys_getgroups - | ||
206 | 206 32 setgroups32 - compat_sys_setgroups | ||
207 | 206 64 setgroups sys_setgroups - | ||
208 | 207 32 fchown32 - sys_fchown | ||
209 | 207 64 fchown sys_fchown - | ||
210 | 208 32 setresuid32 - sys_setresuid | ||
211 | 208 64 setresuid sys_setresuid - | ||
212 | 209 32 getresuid32 - compat_sys_getresuid | ||
213 | 209 64 getresuid sys_getresuid - | ||
214 | 210 32 setresgid32 - sys_setresgid | ||
215 | 210 64 setresgid sys_setresgid - | ||
216 | 211 32 getresgid32 - compat_sys_getresgid | ||
217 | 211 64 getresgid sys_getresgid - | ||
218 | 212 32 chown32 - compat_sys_chown | ||
219 | 212 64 chown sys_chown - | ||
220 | 213 32 setuid32 - sys_setuid | ||
221 | 213 64 setuid sys_setuid - | ||
222 | 214 32 setgid32 - sys_setgid | ||
223 | 214 64 setgid sys_setgid - | ||
224 | 215 32 setfsuid32 - sys_setfsuid | ||
225 | 215 64 setfsuid sys_setfsuid - | ||
226 | 216 32 setfsgid32 - sys_setfsgid | ||
227 | 216 64 setfsgid sys_setfsgid - | ||
228 | 217 common pivot_root sys_pivot_root compat_sys_pivot_root | ||
229 | 218 common mincore sys_mincore compat_sys_mincore | ||
230 | 219 common madvise sys_madvise compat_sys_madvise | ||
231 | 220 common getdents64 sys_getdents64 compat_sys_getdents64 | ||
232 | 221 32 fcntl64 - compat_sys_fcntl64 | ||
233 | 222 common readahead sys_readahead compat_sys_s390_readahead | ||
234 | 223 32 sendfile64 - compat_sys_sendfile64 | ||
235 | 224 common setxattr sys_setxattr compat_sys_setxattr | ||
236 | 225 common lsetxattr sys_lsetxattr compat_sys_lsetxattr | ||
237 | 226 common fsetxattr sys_fsetxattr compat_sys_fsetxattr | ||
238 | 227 common getxattr sys_getxattr compat_sys_getxattr | ||
239 | 228 common lgetxattr sys_lgetxattr compat_sys_lgetxattr | ||
240 | 229 common fgetxattr sys_fgetxattr compat_sys_fgetxattr | ||
241 | 230 common listxattr sys_listxattr compat_sys_listxattr | ||
242 | 231 common llistxattr sys_llistxattr compat_sys_llistxattr | ||
243 | 232 common flistxattr sys_flistxattr compat_sys_flistxattr | ||
244 | 233 common removexattr sys_removexattr compat_sys_removexattr | ||
245 | 234 common lremovexattr sys_lremovexattr compat_sys_lremovexattr | ||
246 | 235 common fremovexattr sys_fremovexattr compat_sys_fremovexattr | ||
247 | 236 common gettid sys_gettid sys_gettid | ||
248 | 237 common tkill sys_tkill sys_tkill | ||
249 | 238 common futex sys_futex compat_sys_futex | ||
250 | 239 common sched_setaffinity sys_sched_setaffinity compat_sys_sched_setaffinity | ||
251 | 240 common sched_getaffinity sys_sched_getaffinity compat_sys_sched_getaffinity | ||
252 | 241 common tgkill sys_tgkill sys_tgkill | ||
253 | 243 common io_setup sys_io_setup compat_sys_io_setup | ||
254 | 244 common io_destroy sys_io_destroy compat_sys_io_destroy | ||
255 | 245 common io_getevents sys_io_getevents compat_sys_io_getevents | ||
256 | 246 common io_submit sys_io_submit compat_sys_io_submit | ||
257 | 247 common io_cancel sys_io_cancel compat_sys_io_cancel | ||
258 | 248 common exit_group sys_exit_group sys_exit_group | ||
259 | 249 common epoll_create sys_epoll_create sys_epoll_create | ||
260 | 250 common epoll_ctl sys_epoll_ctl compat_sys_epoll_ctl | ||
261 | 251 common epoll_wait sys_epoll_wait compat_sys_epoll_wait | ||
262 | 252 common set_tid_address sys_set_tid_address compat_sys_set_tid_address | ||
263 | 253 common fadvise64 sys_fadvise64_64 compat_sys_s390_fadvise64 | ||
264 | 254 common timer_create sys_timer_create compat_sys_timer_create | ||
265 | 255 common timer_settime sys_timer_settime compat_sys_timer_settime | ||
266 | 256 common timer_gettime sys_timer_gettime compat_sys_timer_gettime | ||
267 | 257 common timer_getoverrun sys_timer_getoverrun sys_timer_getoverrun | ||
268 | 258 common timer_delete sys_timer_delete sys_timer_delete | ||
269 | 259 common clock_settime sys_clock_settime compat_sys_clock_settime | ||
270 | 260 common clock_gettime sys_clock_gettime compat_sys_clock_gettime | ||
271 | 261 common clock_getres sys_clock_getres compat_sys_clock_getres | ||
272 | 262 common clock_nanosleep sys_clock_nanosleep compat_sys_clock_nanosleep | ||
273 | 264 32 fadvise64_64 - compat_sys_s390_fadvise64_64 | ||
274 | 265 common statfs64 sys_statfs64 compat_sys_statfs64 | ||
275 | 266 common fstatfs64 sys_fstatfs64 compat_sys_fstatfs64 | ||
276 | 267 common remap_file_pages sys_remap_file_pages compat_sys_remap_file_pages | ||
277 | 268 common mbind sys_mbind compat_sys_mbind | ||
278 | 269 common get_mempolicy sys_get_mempolicy compat_sys_get_mempolicy | ||
279 | 270 common set_mempolicy sys_set_mempolicy compat_sys_set_mempolicy | ||
280 | 271 common mq_open sys_mq_open compat_sys_mq_open | ||
281 | 272 common mq_unlink sys_mq_unlink compat_sys_mq_unlink | ||
282 | 273 common mq_timedsend sys_mq_timedsend compat_sys_mq_timedsend | ||
283 | 274 common mq_timedreceive sys_mq_timedreceive compat_sys_mq_timedreceive | ||
284 | 275 common mq_notify sys_mq_notify compat_sys_mq_notify | ||
285 | 276 common mq_getsetattr sys_mq_getsetattr compat_sys_mq_getsetattr | ||
286 | 277 common kexec_load sys_kexec_load compat_sys_kexec_load | ||
287 | 278 common add_key sys_add_key compat_sys_add_key | ||
288 | 279 common request_key sys_request_key compat_sys_request_key | ||
289 | 280 common keyctl sys_keyctl compat_sys_keyctl | ||
290 | 281 common waitid sys_waitid compat_sys_waitid | ||
291 | 282 common ioprio_set sys_ioprio_set sys_ioprio_set | ||
292 | 283 common ioprio_get sys_ioprio_get sys_ioprio_get | ||
293 | 284 common inotify_init sys_inotify_init sys_inotify_init | ||
294 | 285 common inotify_add_watch sys_inotify_add_watch compat_sys_inotify_add_watch | ||
295 | 286 common inotify_rm_watch sys_inotify_rm_watch sys_inotify_rm_watch | ||
296 | 287 common migrate_pages sys_migrate_pages compat_sys_migrate_pages | ||
297 | 288 common openat sys_openat compat_sys_openat | ||
298 | 289 common mkdirat sys_mkdirat compat_sys_mkdirat | ||
299 | 290 common mknodat sys_mknodat compat_sys_mknodat | ||
300 | 291 common fchownat sys_fchownat compat_sys_fchownat | ||
301 | 292 common futimesat sys_futimesat compat_sys_futimesat | ||
302 | 293 32 fstatat64 - compat_sys_s390_fstatat64 | ||
303 | 293 64 newfstatat sys_newfstatat - | ||
304 | 294 common unlinkat sys_unlinkat compat_sys_unlinkat | ||
305 | 295 common renameat sys_renameat compat_sys_renameat | ||
306 | 296 common linkat sys_linkat compat_sys_linkat | ||
307 | 297 common symlinkat sys_symlinkat compat_sys_symlinkat | ||
308 | 298 common readlinkat sys_readlinkat compat_sys_readlinkat | ||
309 | 299 common fchmodat sys_fchmodat compat_sys_fchmodat | ||
310 | 300 common faccessat sys_faccessat compat_sys_faccessat | ||
311 | 301 common pselect6 sys_pselect6 compat_sys_pselect6 | ||
312 | 302 common ppoll sys_ppoll compat_sys_ppoll | ||
313 | 303 common unshare sys_unshare compat_sys_unshare | ||
314 | 304 common set_robust_list sys_set_robust_list compat_sys_set_robust_list | ||
315 | 305 common get_robust_list sys_get_robust_list compat_sys_get_robust_list | ||
316 | 306 common splice sys_splice compat_sys_splice | ||
317 | 307 common sync_file_range sys_sync_file_range compat_sys_s390_sync_file_range | ||
318 | 308 common tee sys_tee compat_sys_tee | ||
319 | 309 common vmsplice sys_vmsplice compat_sys_vmsplice | ||
320 | 310 common move_pages sys_move_pages compat_sys_move_pages | ||
321 | 311 common getcpu sys_getcpu compat_sys_getcpu | ||
322 | 312 common epoll_pwait sys_epoll_pwait compat_sys_epoll_pwait | ||
323 | 313 common utimes sys_utimes compat_sys_utimes | ||
324 | 314 common fallocate sys_fallocate compat_sys_s390_fallocate | ||
325 | 315 common utimensat sys_utimensat compat_sys_utimensat | ||
326 | 316 common signalfd sys_signalfd compat_sys_signalfd | ||
327 | 317 common timerfd - - | ||
328 | 318 common eventfd sys_eventfd sys_eventfd | ||
329 | 319 common timerfd_create sys_timerfd_create sys_timerfd_create | ||
330 | 320 common timerfd_settime sys_timerfd_settime compat_sys_timerfd_settime | ||
331 | 321 common timerfd_gettime sys_timerfd_gettime compat_sys_timerfd_gettime | ||
332 | 322 common signalfd4 sys_signalfd4 compat_sys_signalfd4 | ||
333 | 323 common eventfd2 sys_eventfd2 sys_eventfd2 | ||
334 | 324 common inotify_init1 sys_inotify_init1 sys_inotify_init1 | ||
335 | 325 common pipe2 sys_pipe2 compat_sys_pipe2 | ||
336 | 326 common dup3 sys_dup3 sys_dup3 | ||
337 | 327 common epoll_create1 sys_epoll_create1 sys_epoll_create1 | ||
338 | 328 common preadv sys_preadv compat_sys_preadv | ||
339 | 329 common pwritev sys_pwritev compat_sys_pwritev | ||
340 | 330 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo | ||
341 | 331 common perf_event_open sys_perf_event_open compat_sys_perf_event_open | ||
342 | 332 common fanotify_init sys_fanotify_init sys_fanotify_init | ||
343 | 333 common fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark | ||
344 | 334 common prlimit64 sys_prlimit64 compat_sys_prlimit64 | ||
345 | 335 common name_to_handle_at sys_name_to_handle_at compat_sys_name_to_handle_at | ||
346 | 336 common open_by_handle_at sys_open_by_handle_at compat_sys_open_by_handle_at | ||
347 | 337 common clock_adjtime sys_clock_adjtime compat_sys_clock_adjtime | ||
348 | 338 common syncfs sys_syncfs sys_syncfs | ||
349 | 339 common setns sys_setns sys_setns | ||
350 | 340 common process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv | ||
351 | 341 common process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev | ||
352 | 342 common s390_runtime_instr sys_s390_runtime_instr sys_s390_runtime_instr | ||
353 | 343 common kcmp sys_kcmp compat_sys_kcmp | ||
354 | 344 common finit_module sys_finit_module compat_sys_finit_module | ||
355 | 345 common sched_setattr sys_sched_setattr compat_sys_sched_setattr | ||
356 | 346 common sched_getattr sys_sched_getattr compat_sys_sched_getattr | ||
357 | 347 common renameat2 sys_renameat2 compat_sys_renameat2 | ||
358 | 348 common seccomp sys_seccomp compat_sys_seccomp | ||
359 | 349 common getrandom sys_getrandom compat_sys_getrandom | ||
360 | 350 common memfd_create sys_memfd_create compat_sys_memfd_create | ||
361 | 351 common bpf sys_bpf compat_sys_bpf | ||
362 | 352 common s390_pci_mmio_write sys_s390_pci_mmio_write compat_sys_s390_pci_mmio_write | ||
363 | 353 common s390_pci_mmio_read sys_s390_pci_mmio_read compat_sys_s390_pci_mmio_read | ||
364 | 354 common execveat sys_execveat compat_sys_execveat | ||
365 | 355 common userfaultfd sys_userfaultfd sys_userfaultfd | ||
366 | 356 common membarrier sys_membarrier sys_membarrier | ||
367 | 357 common recvmmsg sys_recvmmsg compat_sys_recvmmsg | ||
368 | 358 common sendmmsg sys_sendmmsg compat_sys_sendmmsg | ||
369 | 359 common socket sys_socket sys_socket | ||
370 | 360 common socketpair sys_socketpair compat_sys_socketpair | ||
371 | 361 common bind sys_bind compat_sys_bind | ||
372 | 362 common connect sys_connect compat_sys_connect | ||
373 | 363 common listen sys_listen sys_listen | ||
374 | 364 common accept4 sys_accept4 compat_sys_accept4 | ||
375 | 365 common getsockopt sys_getsockopt compat_sys_getsockopt | ||
376 | 366 common setsockopt sys_setsockopt compat_sys_setsockopt | ||
377 | 367 common getsockname sys_getsockname compat_sys_getsockname | ||
378 | 368 common getpeername sys_getpeername compat_sys_getpeername | ||
379 | 369 common sendto sys_sendto compat_sys_sendto | ||
380 | 370 common sendmsg sys_sendmsg compat_sys_sendmsg | ||
381 | 371 common recvfrom sys_recvfrom compat_sys_recvfrom | ||
382 | 372 common recvmsg sys_recvmsg compat_sys_recvmsg | ||
383 | 373 common shutdown sys_shutdown sys_shutdown | ||
384 | 374 common mlock2 sys_mlock2 compat_sys_mlock2 | ||
385 | 375 common copy_file_range sys_copy_file_range compat_sys_copy_file_range | ||
386 | 376 common preadv2 sys_preadv2 compat_sys_preadv2 | ||
387 | 377 common pwritev2 sys_pwritev2 compat_sys_pwritev2 | ||
388 | 378 common s390_guarded_storage sys_s390_guarded_storage compat_sys_s390_guarded_storage | ||
389 | 379 common statx sys_statx compat_sys_statx | ||
390 | 380 common s390_sthyi sys_s390_sthyi compat_sys_s390_sthyi | ||
diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index c0815a37fdb5..539c3d460158 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c | |||
@@ -2245,7 +2245,7 @@ static int perf_c2c__browse_cacheline(struct hist_entry *he) | |||
2245 | c2c_browser__update_nr_entries(browser); | 2245 | c2c_browser__update_nr_entries(browser); |
2246 | 2246 | ||
2247 | while (1) { | 2247 | while (1) { |
2248 | key = hist_browser__run(browser, "? - help"); | 2248 | key = hist_browser__run(browser, "? - help", true); |
2249 | 2249 | ||
2250 | switch (key) { | 2250 | switch (key) { |
2251 | case 's': | 2251 | case 's': |
@@ -2314,7 +2314,7 @@ static int perf_c2c__hists_browse(struct hists *hists) | |||
2314 | c2c_browser__update_nr_entries(browser); | 2314 | c2c_browser__update_nr_entries(browser); |
2315 | 2315 | ||
2316 | while (1) { | 2316 | while (1) { |
2317 | key = hist_browser__run(browser, "? - help"); | 2317 | key = hist_browser__run(browser, "? - help", true); |
2318 | 2318 | ||
2319 | switch (key) { | 2319 | switch (key) { |
2320 | case 'q': | 2320 | case 'q': |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index bf4ca749d1ac..a217623fec2e 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -881,6 +881,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) | |||
881 | } | 881 | } |
882 | } | 882 | } |
883 | 883 | ||
884 | /* | ||
885 | * If we have just single event and are sending data | ||
886 | * through pipe, we need to force the ids allocation, | ||
887 | * because we synthesize event name through the pipe | ||
888 | * and need the id for that. | ||
889 | */ | ||
890 | if (data->is_pipe && rec->evlist->nr_entries == 1) | ||
891 | rec->opts.sample_id = true; | ||
892 | |||
884 | if (record__open(rec) != 0) { | 893 | if (record__open(rec) != 0) { |
885 | err = -1; | 894 | err = -1; |
886 | goto out_child; | 895 | goto out_child; |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 42a52dcc41cd..4ad5dc649716 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -530,7 +530,8 @@ static int report__browse_hists(struct report *rep) | |||
530 | case 1: | 530 | case 1: |
531 | ret = perf_evlist__tui_browse_hists(evlist, help, NULL, | 531 | ret = perf_evlist__tui_browse_hists(evlist, help, NULL, |
532 | rep->min_percent, | 532 | rep->min_percent, |
533 | &session->header.env); | 533 | &session->header.env, |
534 | true); | ||
534 | /* | 535 | /* |
535 | * Usually "ret" is the last pressed key, and we only | 536 | * Usually "ret" is the last pressed key, and we only |
536 | * care if the key notifies us to switch data file. | 537 | * care if the key notifies us to switch data file. |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 98bf9d32f222..54a4c152edb3 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -917,7 +917,7 @@ static void print_metric_csv(void *ctx, | |||
917 | char buf[64], *vals, *ends; | 917 | char buf[64], *vals, *ends; |
918 | 918 | ||
919 | if (unit == NULL || fmt == NULL) { | 919 | if (unit == NULL || fmt == NULL) { |
920 | fprintf(out, "%s%s%s%s", csv_sep, csv_sep, csv_sep, csv_sep); | 920 | fprintf(out, "%s%s", csv_sep, csv_sep); |
921 | return; | 921 | return; |
922 | } | 922 | } |
923 | snprintf(buf, sizeof(buf), fmt, val); | 923 | snprintf(buf, sizeof(buf), fmt, val); |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index c6ccda52117d..35ac016fcb98 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -283,8 +283,9 @@ static void perf_top__print_sym_table(struct perf_top *top) | |||
283 | 283 | ||
284 | printf("%-*.*s\n", win_width, win_width, graph_dotted_line); | 284 | printf("%-*.*s\n", win_width, win_width, graph_dotted_line); |
285 | 285 | ||
286 | if (hists->stats.nr_lost_warned != | 286 | if (!top->record_opts.overwrite && |
287 | hists->stats.nr_events[PERF_RECORD_LOST]) { | 287 | (hists->stats.nr_lost_warned != |
288 | hists->stats.nr_events[PERF_RECORD_LOST])) { | ||
288 | hists->stats.nr_lost_warned = | 289 | hists->stats.nr_lost_warned = |
289 | hists->stats.nr_events[PERF_RECORD_LOST]; | 290 | hists->stats.nr_events[PERF_RECORD_LOST]; |
290 | color_fprintf(stdout, PERF_COLOR_RED, | 291 | color_fprintf(stdout, PERF_COLOR_RED, |
@@ -611,7 +612,8 @@ static void *display_thread_tui(void *arg) | |||
611 | 612 | ||
612 | perf_evlist__tui_browse_hists(top->evlist, help, &hbt, | 613 | perf_evlist__tui_browse_hists(top->evlist, help, &hbt, |
613 | top->min_percent, | 614 | top->min_percent, |
614 | &top->session->header.env); | 615 | &top->session->header.env, |
616 | !top->record_opts.overwrite); | ||
615 | 617 | ||
616 | done = 1; | 618 | done = 1; |
617 | return NULL; | 619 | return NULL; |
@@ -807,15 +809,23 @@ static void perf_event__process_sample(struct perf_tool *tool, | |||
807 | 809 | ||
808 | static void perf_top__mmap_read_idx(struct perf_top *top, int idx) | 810 | static void perf_top__mmap_read_idx(struct perf_top *top, int idx) |
809 | { | 811 | { |
812 | struct record_opts *opts = &top->record_opts; | ||
813 | struct perf_evlist *evlist = top->evlist; | ||
810 | struct perf_sample sample; | 814 | struct perf_sample sample; |
811 | struct perf_evsel *evsel; | 815 | struct perf_evsel *evsel; |
816 | struct perf_mmap *md; | ||
812 | struct perf_session *session = top->session; | 817 | struct perf_session *session = top->session; |
813 | union perf_event *event; | 818 | union perf_event *event; |
814 | struct machine *machine; | 819 | struct machine *machine; |
820 | u64 end, start; | ||
815 | int ret; | 821 | int ret; |
816 | 822 | ||
817 | while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) { | 823 | md = opts->overwrite ? &evlist->overwrite_mmap[idx] : &evlist->mmap[idx]; |
818 | ret = perf_evlist__parse_sample(top->evlist, event, &sample); | 824 | if (perf_mmap__read_init(md, opts->overwrite, &start, &end) < 0) |
825 | return; | ||
826 | |||
827 | while ((event = perf_mmap__read_event(md, opts->overwrite, &start, end)) != NULL) { | ||
828 | ret = perf_evlist__parse_sample(evlist, event, &sample); | ||
819 | if (ret) { | 829 | if (ret) { |
820 | pr_err("Can't parse sample, err = %d\n", ret); | 830 | pr_err("Can't parse sample, err = %d\n", ret); |
821 | goto next_event; | 831 | goto next_event; |
@@ -869,16 +879,120 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx) | |||
869 | } else | 879 | } else |
870 | ++session->evlist->stats.nr_unknown_events; | 880 | ++session->evlist->stats.nr_unknown_events; |
871 | next_event: | 881 | next_event: |
872 | perf_evlist__mmap_consume(top->evlist, idx); | 882 | perf_mmap__consume(md, opts->overwrite); |
873 | } | 883 | } |
884 | |||
885 | perf_mmap__read_done(md); | ||
874 | } | 886 | } |
875 | 887 | ||
876 | static void perf_top__mmap_read(struct perf_top *top) | 888 | static void perf_top__mmap_read(struct perf_top *top) |
877 | { | 889 | { |
890 | bool overwrite = top->record_opts.overwrite; | ||
891 | struct perf_evlist *evlist = top->evlist; | ||
892 | unsigned long long start, end; | ||
878 | int i; | 893 | int i; |
879 | 894 | ||
895 | start = rdclock(); | ||
896 | if (overwrite) | ||
897 | perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_DATA_PENDING); | ||
898 | |||
880 | for (i = 0; i < top->evlist->nr_mmaps; i++) | 899 | for (i = 0; i < top->evlist->nr_mmaps; i++) |
881 | perf_top__mmap_read_idx(top, i); | 900 | perf_top__mmap_read_idx(top, i); |
901 | |||
902 | if (overwrite) { | ||
903 | perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY); | ||
904 | perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_RUNNING); | ||
905 | } | ||
906 | end = rdclock(); | ||
907 | |||
908 | if ((end - start) > (unsigned long long)top->delay_secs * NSEC_PER_SEC) | ||
909 | ui__warning("Too slow to read ring buffer.\n" | ||
910 | "Please try increasing the period (-c) or\n" | ||
911 | "decreasing the freq (-F) or\n" | ||
912 | "limiting the number of CPUs (-C)\n"); | ||
913 | } | ||
914 | |||
915 | /* | ||
916 | * Check per-event overwrite term. | ||
917 | * perf top should support consistent term for all events. | ||
918 | * - All events don't have per-event term | ||
919 | * E.g. "cpu/cpu-cycles/,cpu/instructions/" | ||
920 | * Nothing change, return 0. | ||
921 | * - All events have same per-event term | ||
922 | * E.g. "cpu/cpu-cycles,no-overwrite/,cpu/instructions,no-overwrite/ | ||
923 | * Using the per-event setting to replace the opts->overwrite if | ||
924 | * they are different, then return 0. | ||
925 | * - Events have different per-event term | ||
926 | * E.g. "cpu/cpu-cycles,overwrite/,cpu/instructions,no-overwrite/" | ||
927 | * Return -1 | ||
928 | * - Some of the event set per-event term, but some not. | ||
929 | * E.g. "cpu/cpu-cycles/,cpu/instructions,no-overwrite/" | ||
930 | * Return -1 | ||
931 | */ | ||
932 | static int perf_top__overwrite_check(struct perf_top *top) | ||
933 | { | ||
934 | struct record_opts *opts = &top->record_opts; | ||
935 | struct perf_evlist *evlist = top->evlist; | ||
936 | struct perf_evsel_config_term *term; | ||
937 | struct list_head *config_terms; | ||
938 | struct perf_evsel *evsel; | ||
939 | int set, overwrite = -1; | ||
940 | |||
941 | evlist__for_each_entry(evlist, evsel) { | ||
942 | set = -1; | ||
943 | config_terms = &evsel->config_terms; | ||
944 | list_for_each_entry(term, config_terms, list) { | ||
945 | if (term->type == PERF_EVSEL__CONFIG_TERM_OVERWRITE) | ||
946 | set = term->val.overwrite ? 1 : 0; | ||
947 | } | ||
948 | |||
949 | /* no term for current and previous event (likely) */ | ||
950 | if ((overwrite < 0) && (set < 0)) | ||
951 | continue; | ||
952 | |||
953 | /* has term for both current and previous event, compare */ | ||
954 | if ((overwrite >= 0) && (set >= 0) && (overwrite != set)) | ||
955 | return -1; | ||
956 | |||
957 | /* no term for current event but has term for previous one */ | ||
958 | if ((overwrite >= 0) && (set < 0)) | ||
959 | return -1; | ||
960 | |||
961 | /* has term for current event */ | ||
962 | if ((overwrite < 0) && (set >= 0)) { | ||
963 | /* if it's first event, set overwrite */ | ||
964 | if (evsel == perf_evlist__first(evlist)) | ||
965 | overwrite = set; | ||
966 | else | ||
967 | return -1; | ||
968 | } | ||
969 | } | ||
970 | |||
971 | if ((overwrite >= 0) && (opts->overwrite != overwrite)) | ||
972 | opts->overwrite = overwrite; | ||
973 | |||
974 | return 0; | ||
975 | } | ||
976 | |||
977 | static int perf_top_overwrite_fallback(struct perf_top *top, | ||
978 | struct perf_evsel *evsel) | ||
979 | { | ||
980 | struct record_opts *opts = &top->record_opts; | ||
981 | struct perf_evlist *evlist = top->evlist; | ||
982 | struct perf_evsel *counter; | ||
983 | |||
984 | if (!opts->overwrite) | ||
985 | return 0; | ||
986 | |||
987 | /* only fall back when first event fails */ | ||
988 | if (evsel != perf_evlist__first(evlist)) | ||
989 | return 0; | ||
990 | |||
991 | evlist__for_each_entry(evlist, counter) | ||
992 | counter->attr.write_backward = false; | ||
993 | opts->overwrite = false; | ||
994 | pr_debug2("fall back to non-overwrite mode\n"); | ||
995 | return 1; | ||
882 | } | 996 | } |
883 | 997 | ||
884 | static int perf_top__start_counters(struct perf_top *top) | 998 | static int perf_top__start_counters(struct perf_top *top) |
@@ -888,12 +1002,33 @@ static int perf_top__start_counters(struct perf_top *top) | |||
888 | struct perf_evlist *evlist = top->evlist; | 1002 | struct perf_evlist *evlist = top->evlist; |
889 | struct record_opts *opts = &top->record_opts; | 1003 | struct record_opts *opts = &top->record_opts; |
890 | 1004 | ||
1005 | if (perf_top__overwrite_check(top)) { | ||
1006 | ui__error("perf top only support consistent per-event " | ||
1007 | "overwrite setting for all events\n"); | ||
1008 | goto out_err; | ||
1009 | } | ||
1010 | |||
891 | perf_evlist__config(evlist, opts, &callchain_param); | 1011 | perf_evlist__config(evlist, opts, &callchain_param); |
892 | 1012 | ||
893 | evlist__for_each_entry(evlist, counter) { | 1013 | evlist__for_each_entry(evlist, counter) { |
894 | try_again: | 1014 | try_again: |
895 | if (perf_evsel__open(counter, top->evlist->cpus, | 1015 | if (perf_evsel__open(counter, top->evlist->cpus, |
896 | top->evlist->threads) < 0) { | 1016 | top->evlist->threads) < 0) { |
1017 | |||
1018 | /* | ||
1019 | * Specially handle overwrite fall back. | ||
1020 | * Because perf top is the only tool which has | ||
1021 | * overwrite mode by default, support | ||
1022 | * both overwrite and non-overwrite mode, and | ||
1023 | * require consistent mode for all events. | ||
1024 | * | ||
1025 | * May move it to generic code with more tools | ||
1026 | * have similar attribute. | ||
1027 | */ | ||
1028 | if (perf_missing_features.write_backward && | ||
1029 | perf_top_overwrite_fallback(top, counter)) | ||
1030 | goto try_again; | ||
1031 | |||
897 | if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) { | 1032 | if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) { |
898 | if (verbose > 0) | 1033 | if (verbose > 0) |
899 | ui__warning("%s\n", msg); | 1034 | ui__warning("%s\n", msg); |
@@ -1033,7 +1168,7 @@ static int __cmd_top(struct perf_top *top) | |||
1033 | 1168 | ||
1034 | perf_top__mmap_read(top); | 1169 | perf_top__mmap_read(top); |
1035 | 1170 | ||
1036 | if (hits == top->samples) | 1171 | if (opts->overwrite || (hits == top->samples)) |
1037 | ret = perf_evlist__poll(top->evlist, 100); | 1172 | ret = perf_evlist__poll(top->evlist, 100); |
1038 | 1173 | ||
1039 | if (resize) { | 1174 | if (resize) { |
@@ -1127,6 +1262,7 @@ int cmd_top(int argc, const char **argv) | |||
1127 | .uses_mmap = true, | 1262 | .uses_mmap = true, |
1128 | }, | 1263 | }, |
1129 | .proc_map_timeout = 500, | 1264 | .proc_map_timeout = 500, |
1265 | .overwrite = 1, | ||
1130 | }, | 1266 | }, |
1131 | .max_stack = sysctl_perf_event_max_stack, | 1267 | .max_stack = sysctl_perf_event_max_stack, |
1132 | .sym_pcnt_filter = 5, | 1268 | .sym_pcnt_filter = 5, |
diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh index 51abdb0a4047..790ec25919a0 100755 --- a/tools/perf/check-headers.sh +++ b/tools/perf/check-headers.sh | |||
@@ -33,7 +33,6 @@ arch/s390/include/uapi/asm/kvm.h | |||
33 | arch/s390/include/uapi/asm/kvm_perf.h | 33 | arch/s390/include/uapi/asm/kvm_perf.h |
34 | arch/s390/include/uapi/asm/ptrace.h | 34 | arch/s390/include/uapi/asm/ptrace.h |
35 | arch/s390/include/uapi/asm/sie.h | 35 | arch/s390/include/uapi/asm/sie.h |
36 | arch/s390/include/uapi/asm/unistd.h | ||
37 | arch/arm/include/uapi/asm/kvm.h | 36 | arch/arm/include/uapi/asm/kvm.h |
38 | arch/arm64/include/uapi/asm/kvm.h | 37 | arch/arm64/include/uapi/asm/kvm.h |
39 | arch/alpha/include/uapi/asm/errno.h | 38 | arch/alpha/include/uapi/asm/errno.h |
diff --git a/tools/perf/perf.h b/tools/perf/perf.h index cfe46236a5e5..57b9b342d533 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h | |||
@@ -61,6 +61,7 @@ struct record_opts { | |||
61 | bool tail_synthesize; | 61 | bool tail_synthesize; |
62 | bool overwrite; | 62 | bool overwrite; |
63 | bool ignore_missing_thread; | 63 | bool ignore_missing_thread; |
64 | bool sample_id; | ||
64 | unsigned int freq; | 65 | unsigned int freq; |
65 | unsigned int mmap_pages; | 66 | unsigned int mmap_pages; |
66 | unsigned int auxtrace_mmap_pages; | 67 | unsigned int auxtrace_mmap_pages; |
diff --git a/tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json b/tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json new file mode 100644 index 000000000000..3b6208763e50 --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json | |||
@@ -0,0 +1,27 @@ | |||
1 | [ | ||
2 | {, | ||
3 | "EventCode": "0x7A", | ||
4 | "EventName": "BR_INDIRECT_SPEC", | ||
5 | "BriefDescription": "Branch speculatively executed - Indirect branch" | ||
6 | }, | ||
7 | {, | ||
8 | "EventCode": "0xC9", | ||
9 | "EventName": "BR_COND", | ||
10 | "BriefDescription": "Conditional branch executed" | ||
11 | }, | ||
12 | {, | ||
13 | "EventCode": "0xCA", | ||
14 | "EventName": "BR_INDIRECT_MISPRED", | ||
15 | "BriefDescription": "Indirect branch mispredicted" | ||
16 | }, | ||
17 | {, | ||
18 | "EventCode": "0xCB", | ||
19 | "EventName": "BR_INDIRECT_MISPRED_ADDR", | ||
20 | "BriefDescription": "Indirect branch mispredicted because of address miscompare" | ||
21 | }, | ||
22 | {, | ||
23 | "EventCode": "0xCC", | ||
24 | "EventName": "BR_COND_MISPRED", | ||
25 | "BriefDescription": "Conditional branch mispredicted" | ||
26 | } | ||
27 | ] | ||
diff --git a/tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json b/tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json new file mode 100644 index 000000000000..480d9f7460ab --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json | |||
@@ -0,0 +1,22 @@ | |||
1 | [ | ||
2 | {, | ||
3 | "EventCode": "0x60", | ||
4 | "EventName": "BUS_ACCESS_LD", | ||
5 | "BriefDescription": "Bus access - Read" | ||
6 | }, | ||
7 | {, | ||
8 | "EventCode": "0x61", | ||
9 | "EventName": "BUS_ACCESS_ST", | ||
10 | "BriefDescription": "Bus access - Write" | ||
11 | }, | ||
12 | {, | ||
13 | "EventCode": "0xC0", | ||
14 | "EventName": "EXT_MEM_REQ", | ||
15 | "BriefDescription": "External memory request" | ||
16 | }, | ||
17 | {, | ||
18 | "EventCode": "0xC1", | ||
19 | "EventName": "EXT_MEM_REQ_NC", | ||
20 | "BriefDescription": "Non-cacheable external memory request" | ||
21 | } | ||
22 | ] | ||
diff --git a/tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json b/tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json new file mode 100644 index 000000000000..11baad6344b9 --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json | |||
@@ -0,0 +1,27 @@ | |||
1 | [ | ||
2 | {, | ||
3 | "EventCode": "0xC2", | ||
4 | "EventName": "PREFETCH_LINEFILL", | ||
5 | "BriefDescription": "Linefill because of prefetch" | ||
6 | }, | ||
7 | {, | ||
8 | "EventCode": "0xC3", | ||
9 | "EventName": "PREFETCH_LINEFILL_DROP", | ||
10 | "BriefDescription": "Instruction Cache Throttle occurred" | ||
11 | }, | ||
12 | {, | ||
13 | "EventCode": "0xC4", | ||
14 | "EventName": "READ_ALLOC_ENTER", | ||
15 | "BriefDescription": "Entering read allocate mode" | ||
16 | }, | ||
17 | {, | ||
18 | "EventCode": "0xC5", | ||
19 | "EventName": "READ_ALLOC", | ||
20 | "BriefDescription": "Read allocate mode" | ||
21 | }, | ||
22 | {, | ||
23 | "EventCode": "0xC8", | ||
24 | "EventName": "EXT_SNOOP", | ||
25 | "BriefDescription": "SCU Snooped data from another CPU for this CPU" | ||
26 | } | ||
27 | ] | ||
diff --git a/tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json b/tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json new file mode 100644 index 000000000000..480d9f7460ab --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json | |||
@@ -0,0 +1,22 @@ | |||
1 | [ | ||
2 | {, | ||
3 | "EventCode": "0x60", | ||
4 | "EventName": "BUS_ACCESS_LD", | ||
5 | "BriefDescription": "Bus access - Read" | ||
6 | }, | ||
7 | {, | ||
8 | "EventCode": "0x61", | ||
9 | "EventName": "BUS_ACCESS_ST", | ||
10 | "BriefDescription": "Bus access - Write" | ||
11 | }, | ||
12 | {, | ||
13 | "EventCode": "0xC0", | ||
14 | "EventName": "EXT_MEM_REQ", | ||
15 | "BriefDescription": "External memory request" | ||
16 | }, | ||
17 | {, | ||
18 | "EventCode": "0xC1", | ||
19 | "EventName": "EXT_MEM_REQ_NC", | ||
20 | "BriefDescription": "Non-cacheable external memory request" | ||
21 | } | ||
22 | ] | ||
diff --git a/tools/perf/pmu-events/arch/arm64/cortex-a53/other.json b/tools/perf/pmu-events/arch/arm64/cortex-a53/other.json new file mode 100644 index 000000000000..73a22402d003 --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/cortex-a53/other.json | |||
@@ -0,0 +1,32 @@ | |||
1 | [ | ||
2 | {, | ||
3 | "EventCode": "0x86", | ||
4 | "EventName": "EXC_IRQ", | ||
5 | "BriefDescription": "Exception taken, IRQ" | ||
6 | }, | ||
7 | {, | ||
8 | "EventCode": "0x87", | ||
9 | "EventName": "EXC_FIQ", | ||
10 | "BriefDescription": "Exception taken, FIQ" | ||
11 | }, | ||
12 | {, | ||
13 | "EventCode": "0xC6", | ||
14 | "EventName": "PRE_DECODE_ERR", | ||
15 | "BriefDescription": "Pre-decode error" | ||
16 | }, | ||
17 | {, | ||
18 | "EventCode": "0xD0", | ||
19 | "EventName": "L1I_CACHE_ERR", | ||
20 | "BriefDescription": "L1 Instruction Cache (data or tag) memory error" | ||
21 | }, | ||
22 | {, | ||
23 | "EventCode": "0xD1", | ||
24 | "EventName": "L1D_CACHE_ERR", | ||
25 | "BriefDescription": "L1 Data Cache (data, tag or dirty) memory error, correctable or non-correctable" | ||
26 | }, | ||
27 | {, | ||
28 | "EventCode": "0xD2", | ||
29 | "EventName": "TLB_ERR", | ||
30 | "BriefDescription": "TLB memory error" | ||
31 | } | ||
32 | ] | ||
diff --git a/tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json b/tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json new file mode 100644 index 000000000000..3149fb90555a --- /dev/null +++ b/tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json | |||
@@ -0,0 +1,52 @@ | |||
1 | [ | ||
2 | {, | ||
3 | "EventCode": "0xC7", | ||
4 | "EventName": "STALL_SB_FULL", | ||
5 | "BriefDescription": "Data Write operation that stalls the pipeline because the store buffer is full" | ||
6 | }, | ||
7 | {, | ||
8 | "EventCode": "0xE0", | ||
9 | "EventName": "OTHER_IQ_DEP_STALL", | ||
10 | "BriefDescription": "Cycles that the DPU IQ is empty and that is not because of a recent micro-TLB miss, instruction cache miss or pre-decode error" | ||
11 | }, | ||
12 | {, | ||
13 | "EventCode": "0xE1", | ||
14 | "EventName": "IC_DEP_STALL", | ||
15 | "BriefDescription": "Cycles the DPU IQ is empty and there is an instruction cache miss being processed" | ||
16 | }, | ||
17 | {, | ||
18 | "EventCode": "0xE2", | ||
19 | "EventName": "IUTLB_DEP_STALL", | ||
20 | "BriefDescription": "Cycles the DPU IQ is empty and there is an instruction micro-TLB miss being processed" | ||
21 | }, | ||
22 | {, | ||
23 | "EventCode": "0xE3", | ||
24 | "EventName": "DECODE_DEP_STALL", | ||
25 | "BriefDescription": "Cycles the DPU IQ is empty and there is a pre-decode error being processed" | ||
26 | }, | ||
27 | {, | ||
28 | "EventCode": "0xE4", | ||
29 | "EventName": "OTHER_INTERLOCK_STALL", | ||
30 | "BriefDescription": "Cycles there is an interlock other than Advanced SIMD/Floating-point instructions or load/store instruction" | ||
31 | }, | ||
32 | {, | ||
33 | "EventCode": "0xE5", | ||
34 | "EventName": "AGU_DEP_STALL", | ||
35 | "BriefDescription": "Cycles there is an interlock for a load/store instruction waiting for data to calculate the address in the AGU" | ||
36 | }, | ||
37 | {, | ||
38 | "EventCode": "0xE6", | ||
39 | "EventName": "SIMD_DEP_STALL", | ||
40 | "BriefDescription": "Cycles there is an interlock for an Advanced SIMD/Floating-point operation." | ||
41 | }, | ||
42 | {, | ||
43 | "EventCode": "0xE7", | ||
44 | "EventName": "LD_DEP_STALL", | ||
45 | "BriefDescription": "Cycles there is a stall in the Wr stage because of a load miss" | ||
46 | }, | ||
47 | {, | ||
48 | "EventCode": "0xE8", | ||
49 | "EventName": "ST_DEP_STALL", | ||
50 | "BriefDescription": "Cycles there is a stall in the Wr stage because of a store" | ||
51 | } | ||
52 | ] | ||
diff --git a/tools/perf/pmu-events/arch/arm64/mapfile.csv b/tools/perf/pmu-events/arch/arm64/mapfile.csv index 219d6756134e..e61c9ca6cf9e 100644 --- a/tools/perf/pmu-events/arch/arm64/mapfile.csv +++ b/tools/perf/pmu-events/arch/arm64/mapfile.csv | |||
@@ -13,3 +13,4 @@ | |||
13 | # | 13 | # |
14 | #Family-model,Version,Filename,EventType | 14 | #Family-model,Version,Filename,EventType |
15 | 0x00000000420f5160,v1,cavium,core | 15 | 0x00000000420f5160,v1,cavium,core |
16 | 0x00000000410fd03[[:xdigit:]],v1,cortex-a53,core | ||
diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/backward-ring-buffer.c index 4035d43523c3..e0b1b414d466 100644 --- a/tools/perf/tests/backward-ring-buffer.c +++ b/tools/perf/tests/backward-ring-buffer.c | |||
@@ -31,10 +31,12 @@ static int count_samples(struct perf_evlist *evlist, int *sample_count, | |||
31 | int i; | 31 | int i; |
32 | 32 | ||
33 | for (i = 0; i < evlist->nr_mmaps; i++) { | 33 | for (i = 0; i < evlist->nr_mmaps; i++) { |
34 | struct perf_mmap *map = &evlist->overwrite_mmap[i]; | ||
34 | union perf_event *event; | 35 | union perf_event *event; |
36 | u64 start, end; | ||
35 | 37 | ||
36 | perf_mmap__read_catchup(&evlist->overwrite_mmap[i]); | 38 | perf_mmap__read_init(map, true, &start, &end); |
37 | while ((event = perf_mmap__read_backward(&evlist->overwrite_mmap[i])) != NULL) { | 39 | while ((event = perf_mmap__read_event(map, true, &start, end)) != NULL) { |
38 | const u32 type = event->header.type; | 40 | const u32 type = event->header.type; |
39 | 41 | ||
40 | switch (type) { | 42 | switch (type) { |
@@ -49,6 +51,7 @@ static int count_samples(struct perf_evlist *evlist, int *sample_count, | |||
49 | return TEST_FAIL; | 51 | return TEST_FAIL; |
50 | } | 52 | } |
51 | } | 53 | } |
54 | perf_mmap__read_done(map); | ||
52 | } | 55 | } |
53 | return TEST_OK; | 56 | return TEST_OK; |
54 | } | 57 | } |
diff --git a/tools/perf/tests/shell/trace+probe_libc_inet_pton.sh b/tools/perf/tests/shell/trace+probe_libc_inet_pton.sh index 8b3da21a08f1..c446c894b297 100755 --- a/tools/perf/tests/shell/trace+probe_libc_inet_pton.sh +++ b/tools/perf/tests/shell/trace+probe_libc_inet_pton.sh | |||
@@ -22,10 +22,23 @@ trace_libc_inet_pton_backtrace() { | |||
22 | expected[4]="rtt min.*" | 22 | expected[4]="rtt min.*" |
23 | expected[5]="[0-9]+\.[0-9]+[[:space:]]+probe_libc:inet_pton:\([[:xdigit:]]+\)" | 23 | expected[5]="[0-9]+\.[0-9]+[[:space:]]+probe_libc:inet_pton:\([[:xdigit:]]+\)" |
24 | expected[6]=".*inet_pton[[:space:]]\($libc\)$" | 24 | expected[6]=".*inet_pton[[:space:]]\($libc\)$" |
25 | expected[7]="getaddrinfo[[:space:]]\($libc\)$" | 25 | case "$(uname -m)" in |
26 | expected[8]=".*\(.*/bin/ping.*\)$" | 26 | s390x) |
27 | 27 | eventattr='call-graph=dwarf' | |
28 | perf trace --no-syscalls -e probe_libc:inet_pton/max-stack=3/ ping -6 -c 1 ::1 2>&1 | grep -v ^$ | while read line ; do | 28 | expected[7]="gaih_inet[[:space:]]\(inlined\)$" |
29 | expected[8]="__GI_getaddrinfo[[:space:]]\(inlined\)$" | ||
30 | expected[9]="main[[:space:]]\(.*/bin/ping.*\)$" | ||
31 | expected[10]="__libc_start_main[[:space:]]\($libc\)$" | ||
32 | expected[11]="_start[[:space:]]\(.*/bin/ping.*\)$" | ||
33 | ;; | ||
34 | *) | ||
35 | eventattr='max-stack=3' | ||
36 | expected[7]="getaddrinfo[[:space:]]\($libc\)$" | ||
37 | expected[8]=".*\(.*/bin/ping.*\)$" | ||
38 | ;; | ||
39 | esac | ||
40 | |||
41 | perf trace --no-syscalls -e probe_libc:inet_pton/$eventattr/ ping -6 -c 1 ::1 2>&1 | grep -v ^$ | while read line ; do | ||
29 | echo $line | 42 | echo $line |
30 | echo "$line" | egrep -q "${expected[$idx]}" | 43 | echo "$line" | egrep -q "${expected[$idx]}" |
31 | if [ $? -ne 0 ] ; then | 44 | if [ $? -ne 0 ] ; then |
@@ -33,7 +46,7 @@ trace_libc_inet_pton_backtrace() { | |||
33 | exit 1 | 46 | exit 1 |
34 | fi | 47 | fi |
35 | let idx+=1 | 48 | let idx+=1 |
36 | [ $idx -eq 9 ] && break | 49 | [ -z "${expected[$idx]}" ] && break |
37 | done | 50 | done |
38 | } | 51 | } |
39 | 52 | ||
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c index 286427975112..fbf927cf775d 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c | |||
@@ -327,7 +327,32 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) | |||
327 | if (!disasm_line__is_valid_jump(cursor, sym)) | 327 | if (!disasm_line__is_valid_jump(cursor, sym)) |
328 | return; | 328 | return; |
329 | 329 | ||
330 | /* | ||
331 | * This first was seen with a gcc function, _cpp_lex_token, that | ||
332 | * has the usual jumps: | ||
333 | * | ||
334 | * │1159e6c: ↓ jne 115aa32 <_cpp_lex_token@@Base+0xf92> | ||
335 | * | ||
336 | * I.e. jumps to a label inside that function (_cpp_lex_token), and | ||
337 | * those works, but also this kind: | ||
338 | * | ||
339 | * │1159e8b: ↓ jne c469be <cpp_named_operator2name@@Base+0xa72> | ||
340 | * | ||
341 | * I.e. jumps to another function, outside _cpp_lex_token, which | ||
342 | * are not being correctly handled generating as a side effect references | ||
343 | * to ab->offset[] entries that are set to NULL, so to make this code | ||
344 | * more robust, check that here. | ||
345 | * | ||
346 | * A proper fix for will be put in place, looking at the function | ||
347 | * name right after the '<' token and probably treating this like a | ||
348 | * 'call' instruction. | ||
349 | */ | ||
330 | target = ab->offsets[cursor->ops.target.offset]; | 350 | target = ab->offsets[cursor->ops.target.offset]; |
351 | if (target == NULL) { | ||
352 | ui_helpline__printf("WARN: jump target inconsistency, press 'o', ab->offsets[%#x] = NULL\n", | ||
353 | cursor->ops.target.offset); | ||
354 | return; | ||
355 | } | ||
331 | 356 | ||
332 | bcursor = browser_line(&cursor->al); | 357 | bcursor = browser_line(&cursor->al); |
333 | btarget = browser_line(target); | 358 | btarget = browser_line(target); |
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 68146f4620a5..6495ee55d9c3 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
@@ -608,7 +608,8 @@ static int hist_browser__title(struct hist_browser *browser, char *bf, size_t si | |||
608 | return browser->title ? browser->title(browser, bf, size) : 0; | 608 | return browser->title ? browser->title(browser, bf, size) : 0; |
609 | } | 609 | } |
610 | 610 | ||
611 | int hist_browser__run(struct hist_browser *browser, const char *help) | 611 | int hist_browser__run(struct hist_browser *browser, const char *help, |
612 | bool warn_lost_event) | ||
612 | { | 613 | { |
613 | int key; | 614 | int key; |
614 | char title[160]; | 615 | char title[160]; |
@@ -638,8 +639,9 @@ int hist_browser__run(struct hist_browser *browser, const char *help) | |||
638 | nr_entries = hist_browser__nr_entries(browser); | 639 | nr_entries = hist_browser__nr_entries(browser); |
639 | ui_browser__update_nr_entries(&browser->b, nr_entries); | 640 | ui_browser__update_nr_entries(&browser->b, nr_entries); |
640 | 641 | ||
641 | if (browser->hists->stats.nr_lost_warned != | 642 | if (warn_lost_event && |
642 | browser->hists->stats.nr_events[PERF_RECORD_LOST]) { | 643 | (browser->hists->stats.nr_lost_warned != |
644 | browser->hists->stats.nr_events[PERF_RECORD_LOST])) { | ||
643 | browser->hists->stats.nr_lost_warned = | 645 | browser->hists->stats.nr_lost_warned = |
644 | browser->hists->stats.nr_events[PERF_RECORD_LOST]; | 646 | browser->hists->stats.nr_events[PERF_RECORD_LOST]; |
645 | ui_browser__warn_lost_events(&browser->b); | 647 | ui_browser__warn_lost_events(&browser->b); |
@@ -2763,7 +2765,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, | |||
2763 | bool left_exits, | 2765 | bool left_exits, |
2764 | struct hist_browser_timer *hbt, | 2766 | struct hist_browser_timer *hbt, |
2765 | float min_pcnt, | 2767 | float min_pcnt, |
2766 | struct perf_env *env) | 2768 | struct perf_env *env, |
2769 | bool warn_lost_event) | ||
2767 | { | 2770 | { |
2768 | struct hists *hists = evsel__hists(evsel); | 2771 | struct hists *hists = evsel__hists(evsel); |
2769 | struct hist_browser *browser = perf_evsel_browser__new(evsel, hbt, env); | 2772 | struct hist_browser *browser = perf_evsel_browser__new(evsel, hbt, env); |
@@ -2844,7 +2847,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, | |||
2844 | 2847 | ||
2845 | nr_options = 0; | 2848 | nr_options = 0; |
2846 | 2849 | ||
2847 | key = hist_browser__run(browser, helpline); | 2850 | key = hist_browser__run(browser, helpline, |
2851 | warn_lost_event); | ||
2848 | 2852 | ||
2849 | if (browser->he_selection != NULL) { | 2853 | if (browser->he_selection != NULL) { |
2850 | thread = hist_browser__selected_thread(browser); | 2854 | thread = hist_browser__selected_thread(browser); |
@@ -3184,7 +3188,8 @@ static void perf_evsel_menu__write(struct ui_browser *browser, | |||
3184 | 3188 | ||
3185 | static int perf_evsel_menu__run(struct perf_evsel_menu *menu, | 3189 | static int perf_evsel_menu__run(struct perf_evsel_menu *menu, |
3186 | int nr_events, const char *help, | 3190 | int nr_events, const char *help, |
3187 | struct hist_browser_timer *hbt) | 3191 | struct hist_browser_timer *hbt, |
3192 | bool warn_lost_event) | ||
3188 | { | 3193 | { |
3189 | struct perf_evlist *evlist = menu->b.priv; | 3194 | struct perf_evlist *evlist = menu->b.priv; |
3190 | struct perf_evsel *pos; | 3195 | struct perf_evsel *pos; |
@@ -3203,7 +3208,9 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, | |||
3203 | case K_TIMER: | 3208 | case K_TIMER: |
3204 | hbt->timer(hbt->arg); | 3209 | hbt->timer(hbt->arg); |
3205 | 3210 | ||
3206 | if (!menu->lost_events_warned && menu->lost_events) { | 3211 | if (!menu->lost_events_warned && |
3212 | menu->lost_events && | ||
3213 | warn_lost_event) { | ||
3207 | ui_browser__warn_lost_events(&menu->b); | 3214 | ui_browser__warn_lost_events(&menu->b); |
3208 | menu->lost_events_warned = true; | 3215 | menu->lost_events_warned = true; |
3209 | } | 3216 | } |
@@ -3224,7 +3231,8 @@ browse_hists: | |||
3224 | key = perf_evsel__hists_browse(pos, nr_events, help, | 3231 | key = perf_evsel__hists_browse(pos, nr_events, help, |
3225 | true, hbt, | 3232 | true, hbt, |
3226 | menu->min_pcnt, | 3233 | menu->min_pcnt, |
3227 | menu->env); | 3234 | menu->env, |
3235 | warn_lost_event); | ||
3228 | ui_browser__show_title(&menu->b, title); | 3236 | ui_browser__show_title(&menu->b, title); |
3229 | switch (key) { | 3237 | switch (key) { |
3230 | case K_TAB: | 3238 | case K_TAB: |
@@ -3282,7 +3290,8 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, | |||
3282 | int nr_entries, const char *help, | 3290 | int nr_entries, const char *help, |
3283 | struct hist_browser_timer *hbt, | 3291 | struct hist_browser_timer *hbt, |
3284 | float min_pcnt, | 3292 | float min_pcnt, |
3285 | struct perf_env *env) | 3293 | struct perf_env *env, |
3294 | bool warn_lost_event) | ||
3286 | { | 3295 | { |
3287 | struct perf_evsel *pos; | 3296 | struct perf_evsel *pos; |
3288 | struct perf_evsel_menu menu = { | 3297 | struct perf_evsel_menu menu = { |
@@ -3309,13 +3318,15 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, | |||
3309 | menu.b.width = line_len; | 3318 | menu.b.width = line_len; |
3310 | } | 3319 | } |
3311 | 3320 | ||
3312 | return perf_evsel_menu__run(&menu, nr_entries, help, hbt); | 3321 | return perf_evsel_menu__run(&menu, nr_entries, help, |
3322 | hbt, warn_lost_event); | ||
3313 | } | 3323 | } |
3314 | 3324 | ||
3315 | int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, | 3325 | int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, |
3316 | struct hist_browser_timer *hbt, | 3326 | struct hist_browser_timer *hbt, |
3317 | float min_pcnt, | 3327 | float min_pcnt, |
3318 | struct perf_env *env) | 3328 | struct perf_env *env, |
3329 | bool warn_lost_event) | ||
3319 | { | 3330 | { |
3320 | int nr_entries = evlist->nr_entries; | 3331 | int nr_entries = evlist->nr_entries; |
3321 | 3332 | ||
@@ -3325,7 +3336,7 @@ single_entry: | |||
3325 | 3336 | ||
3326 | return perf_evsel__hists_browse(first, nr_entries, help, | 3337 | return perf_evsel__hists_browse(first, nr_entries, help, |
3327 | false, hbt, min_pcnt, | 3338 | false, hbt, min_pcnt, |
3328 | env); | 3339 | env, warn_lost_event); |
3329 | } | 3340 | } |
3330 | 3341 | ||
3331 | if (symbol_conf.event_group) { | 3342 | if (symbol_conf.event_group) { |
@@ -3342,5 +3353,6 @@ single_entry: | |||
3342 | } | 3353 | } |
3343 | 3354 | ||
3344 | return __perf_evlist__tui_browse_hists(evlist, nr_entries, help, | 3355 | return __perf_evlist__tui_browse_hists(evlist, nr_entries, help, |
3345 | hbt, min_pcnt, env); | 3356 | hbt, min_pcnt, env, |
3357 | warn_lost_event); | ||
3346 | } | 3358 | } |
diff --git a/tools/perf/ui/browsers/hists.h b/tools/perf/ui/browsers/hists.h index ba431777f559..9428bee076f2 100644 --- a/tools/perf/ui/browsers/hists.h +++ b/tools/perf/ui/browsers/hists.h | |||
@@ -28,7 +28,8 @@ struct hist_browser { | |||
28 | 28 | ||
29 | struct hist_browser *hist_browser__new(struct hists *hists); | 29 | struct hist_browser *hist_browser__new(struct hists *hists); |
30 | void hist_browser__delete(struct hist_browser *browser); | 30 | void hist_browser__delete(struct hist_browser *browser); |
31 | int hist_browser__run(struct hist_browser *browser, const char *help); | 31 | int hist_browser__run(struct hist_browser *browser, const char *help, |
32 | bool warn_lost_event); | ||
32 | void hist_browser__init(struct hist_browser *browser, | 33 | void hist_browser__init(struct hist_browser *browser, |
33 | struct hists *hists); | 34 | struct hists *hists); |
34 | #endif /* _PERF_UI_BROWSER_HISTS_H_ */ | 35 | #endif /* _PERF_UI_BROWSER_HISTS_H_ */ |
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c index 9faf3b5367db..6470ea2aa25e 100644 --- a/tools/perf/util/auxtrace.c +++ b/tools/perf/util/auxtrace.c | |||
@@ -60,6 +60,12 @@ | |||
60 | #include "sane_ctype.h" | 60 | #include "sane_ctype.h" |
61 | #include "symbol/kallsyms.h" | 61 | #include "symbol/kallsyms.h" |
62 | 62 | ||
63 | static bool auxtrace__dont_decode(struct perf_session *session) | ||
64 | { | ||
65 | return !session->itrace_synth_opts || | ||
66 | session->itrace_synth_opts->dont_decode; | ||
67 | } | ||
68 | |||
63 | int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, | 69 | int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, |
64 | struct auxtrace_mmap_params *mp, | 70 | struct auxtrace_mmap_params *mp, |
65 | void *userpg, int fd) | 71 | void *userpg, int fd) |
@@ -762,6 +768,9 @@ int auxtrace_queues__process_index(struct auxtrace_queues *queues, | |||
762 | size_t i; | 768 | size_t i; |
763 | int err; | 769 | int err; |
764 | 770 | ||
771 | if (auxtrace__dont_decode(session)) | ||
772 | return 0; | ||
773 | |||
765 | list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) { | 774 | list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) { |
766 | for (i = 0; i < auxtrace_index->nr; i++) { | 775 | for (i = 0; i < auxtrace_index->nr; i++) { |
767 | ent = &auxtrace_index->entries[i]; | 776 | ent = &auxtrace_index->entries[i]; |
@@ -892,12 +901,6 @@ out_free: | |||
892 | return err; | 901 | return err; |
893 | } | 902 | } |
894 | 903 | ||
895 | static bool auxtrace__dont_decode(struct perf_session *session) | ||
896 | { | ||
897 | return !session->itrace_synth_opts || | ||
898 | session->itrace_synth_opts->dont_decode; | ||
899 | } | ||
900 | |||
901 | int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused, | 904 | int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused, |
902 | union perf_event *event, | 905 | union perf_event *event, |
903 | struct perf_session *session) | 906 | struct perf_session *session) |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index ac35cd214feb..e5fc14e53c05 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -715,28 +715,11 @@ union perf_event *perf_evlist__mmap_read_forward(struct perf_evlist *evlist, int | |||
715 | return perf_mmap__read_forward(md); | 715 | return perf_mmap__read_forward(md); |
716 | } | 716 | } |
717 | 717 | ||
718 | union perf_event *perf_evlist__mmap_read_backward(struct perf_evlist *evlist, int idx) | ||
719 | { | ||
720 | struct perf_mmap *md = &evlist->mmap[idx]; | ||
721 | |||
722 | /* | ||
723 | * No need to check messup for backward ring buffer: | ||
724 | * We can always read arbitrary long data from a backward | ||
725 | * ring buffer unless we forget to pause it before reading. | ||
726 | */ | ||
727 | return perf_mmap__read_backward(md); | ||
728 | } | ||
729 | |||
730 | union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) | 718 | union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) |
731 | { | 719 | { |
732 | return perf_evlist__mmap_read_forward(evlist, idx); | 720 | return perf_evlist__mmap_read_forward(evlist, idx); |
733 | } | 721 | } |
734 | 722 | ||
735 | void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx) | ||
736 | { | ||
737 | perf_mmap__read_catchup(&evlist->mmap[idx]); | ||
738 | } | ||
739 | |||
740 | void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx) | 723 | void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx) |
741 | { | 724 | { |
742 | perf_mmap__consume(&evlist->mmap[idx], false); | 725 | perf_mmap__consume(&evlist->mmap[idx], false); |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 75f8e0ad5d76..336b838e6957 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
@@ -133,10 +133,6 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx); | |||
133 | 133 | ||
134 | union perf_event *perf_evlist__mmap_read_forward(struct perf_evlist *evlist, | 134 | union perf_event *perf_evlist__mmap_read_forward(struct perf_evlist *evlist, |
135 | int idx); | 135 | int idx); |
136 | union perf_event *perf_evlist__mmap_read_backward(struct perf_evlist *evlist, | ||
137 | int idx); | ||
138 | void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx); | ||
139 | |||
140 | void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx); | 136 | void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx); |
141 | 137 | ||
142 | int perf_evlist__open(struct perf_evlist *evlist); | 138 | int perf_evlist__open(struct perf_evlist *evlist); |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index ff359c9ece2e..ef351688b797 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -41,17 +41,7 @@ | |||
41 | 41 | ||
42 | #include "sane_ctype.h" | 42 | #include "sane_ctype.h" |
43 | 43 | ||
44 | static struct { | 44 | struct perf_missing_features perf_missing_features; |
45 | bool sample_id_all; | ||
46 | bool exclude_guest; | ||
47 | bool mmap2; | ||
48 | bool cloexec; | ||
49 | bool clockid; | ||
50 | bool clockid_wrong; | ||
51 | bool lbr_flags; | ||
52 | bool write_backward; | ||
53 | bool group_read; | ||
54 | } perf_missing_features; | ||
55 | 45 | ||
56 | static clockid_t clockid; | 46 | static clockid_t clockid; |
57 | 47 | ||
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 846e41644525..a7487c6d1866 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -149,6 +149,20 @@ union u64_swap { | |||
149 | u32 val32[2]; | 149 | u32 val32[2]; |
150 | }; | 150 | }; |
151 | 151 | ||
152 | struct perf_missing_features { | ||
153 | bool sample_id_all; | ||
154 | bool exclude_guest; | ||
155 | bool mmap2; | ||
156 | bool cloexec; | ||
157 | bool clockid; | ||
158 | bool clockid_wrong; | ||
159 | bool lbr_flags; | ||
160 | bool write_backward; | ||
161 | bool group_read; | ||
162 | }; | ||
163 | |||
164 | extern struct perf_missing_features perf_missing_features; | ||
165 | |||
152 | struct cpu_map; | 166 | struct cpu_map; |
153 | struct target; | 167 | struct target; |
154 | struct thread_map; | 168 | struct thread_map; |
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index f6630cb95eff..02721b579746 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h | |||
@@ -430,7 +430,8 @@ int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel, | |||
430 | int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, | 430 | int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, |
431 | struct hist_browser_timer *hbt, | 431 | struct hist_browser_timer *hbt, |
432 | float min_pcnt, | 432 | float min_pcnt, |
433 | struct perf_env *env); | 433 | struct perf_env *env, |
434 | bool warn_lost_event); | ||
434 | int script_browse(const char *script_opt); | 435 | int script_browse(const char *script_opt); |
435 | #else | 436 | #else |
436 | static inline | 437 | static inline |
@@ -438,7 +439,8 @@ int perf_evlist__tui_browse_hists(struct perf_evlist *evlist __maybe_unused, | |||
438 | const char *help __maybe_unused, | 439 | const char *help __maybe_unused, |
439 | struct hist_browser_timer *hbt __maybe_unused, | 440 | struct hist_browser_timer *hbt __maybe_unused, |
440 | float min_pcnt __maybe_unused, | 441 | float min_pcnt __maybe_unused, |
441 | struct perf_env *env __maybe_unused) | 442 | struct perf_env *env __maybe_unused, |
443 | bool warn_lost_event __maybe_unused) | ||
442 | { | 444 | { |
443 | return 0; | 445 | return 0; |
444 | } | 446 | } |
diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c index 05076e683938..91531a7c8fbf 100644 --- a/tools/perf/util/mmap.c +++ b/tools/perf/util/mmap.c | |||
@@ -22,29 +22,27 @@ size_t perf_mmap__mmap_len(struct perf_mmap *map) | |||
22 | 22 | ||
23 | /* When check_messup is true, 'end' must points to a good entry */ | 23 | /* When check_messup is true, 'end' must points to a good entry */ |
24 | static union perf_event *perf_mmap__read(struct perf_mmap *map, | 24 | static union perf_event *perf_mmap__read(struct perf_mmap *map, |
25 | u64 start, u64 end, u64 *prev) | 25 | u64 *startp, u64 end) |
26 | { | 26 | { |
27 | unsigned char *data = map->base + page_size; | 27 | unsigned char *data = map->base + page_size; |
28 | union perf_event *event = NULL; | 28 | union perf_event *event = NULL; |
29 | int diff = end - start; | 29 | int diff = end - *startp; |
30 | 30 | ||
31 | if (diff >= (int)sizeof(event->header)) { | 31 | if (diff >= (int)sizeof(event->header)) { |
32 | size_t size; | 32 | size_t size; |
33 | 33 | ||
34 | event = (union perf_event *)&data[start & map->mask]; | 34 | event = (union perf_event *)&data[*startp & map->mask]; |
35 | size = event->header.size; | 35 | size = event->header.size; |
36 | 36 | ||
37 | if (size < sizeof(event->header) || diff < (int)size) { | 37 | if (size < sizeof(event->header) || diff < (int)size) |
38 | event = NULL; | 38 | return NULL; |
39 | goto broken_event; | ||
40 | } | ||
41 | 39 | ||
42 | /* | 40 | /* |
43 | * Event straddles the mmap boundary -- header should always | 41 | * Event straddles the mmap boundary -- header should always |
44 | * be inside due to u64 alignment of output. | 42 | * be inside due to u64 alignment of output. |
45 | */ | 43 | */ |
46 | if ((start & map->mask) + size != ((start + size) & map->mask)) { | 44 | if ((*startp & map->mask) + size != ((*startp + size) & map->mask)) { |
47 | unsigned int offset = start; | 45 | unsigned int offset = *startp; |
48 | unsigned int len = min(sizeof(*event), size), cpy; | 46 | unsigned int len = min(sizeof(*event), size), cpy; |
49 | void *dst = map->event_copy; | 47 | void *dst = map->event_copy; |
50 | 48 | ||
@@ -59,20 +57,19 @@ static union perf_event *perf_mmap__read(struct perf_mmap *map, | |||
59 | event = (union perf_event *)map->event_copy; | 57 | event = (union perf_event *)map->event_copy; |
60 | } | 58 | } |
61 | 59 | ||
62 | start += size; | 60 | *startp += size; |
63 | } | 61 | } |
64 | 62 | ||
65 | broken_event: | ||
66 | if (prev) | ||
67 | *prev = start; | ||
68 | |||
69 | return event; | 63 | return event; |
70 | } | 64 | } |
71 | 65 | ||
66 | /* | ||
67 | * legacy interface for mmap read. | ||
68 | * Don't use it. Use perf_mmap__read_event(). | ||
69 | */ | ||
72 | union perf_event *perf_mmap__read_forward(struct perf_mmap *map) | 70 | union perf_event *perf_mmap__read_forward(struct perf_mmap *map) |
73 | { | 71 | { |
74 | u64 head; | 72 | u64 head; |
75 | u64 old = map->prev; | ||
76 | 73 | ||
77 | /* | 74 | /* |
78 | * Check if event was unmapped due to a POLLHUP/POLLERR. | 75 | * Check if event was unmapped due to a POLLHUP/POLLERR. |
@@ -82,13 +79,26 @@ union perf_event *perf_mmap__read_forward(struct perf_mmap *map) | |||
82 | 79 | ||
83 | head = perf_mmap__read_head(map); | 80 | head = perf_mmap__read_head(map); |
84 | 81 | ||
85 | return perf_mmap__read(map, old, head, &map->prev); | 82 | return perf_mmap__read(map, &map->prev, head); |
86 | } | 83 | } |
87 | 84 | ||
88 | union perf_event *perf_mmap__read_backward(struct perf_mmap *map) | 85 | /* |
86 | * Read event from ring buffer one by one. | ||
87 | * Return one event for each call. | ||
88 | * | ||
89 | * Usage: | ||
90 | * perf_mmap__read_init() | ||
91 | * while(event = perf_mmap__read_event()) { | ||
92 | * //process the event | ||
93 | * perf_mmap__consume() | ||
94 | * } | ||
95 | * perf_mmap__read_done() | ||
96 | */ | ||
97 | union perf_event *perf_mmap__read_event(struct perf_mmap *map, | ||
98 | bool overwrite, | ||
99 | u64 *startp, u64 end) | ||
89 | { | 100 | { |
90 | u64 head, end; | 101 | union perf_event *event; |
91 | u64 start = map->prev; | ||
92 | 102 | ||
93 | /* | 103 | /* |
94 | * Check if event was unmapped due to a POLLHUP/POLLERR. | 104 | * Check if event was unmapped due to a POLLHUP/POLLERR. |
@@ -96,40 +106,19 @@ union perf_event *perf_mmap__read_backward(struct perf_mmap *map) | |||
96 | if (!refcount_read(&map->refcnt)) | 106 | if (!refcount_read(&map->refcnt)) |
97 | return NULL; | 107 | return NULL; |
98 | 108 | ||
99 | head = perf_mmap__read_head(map); | 109 | if (startp == NULL) |
100 | if (!head) | ||
101 | return NULL; | 110 | return NULL; |
102 | 111 | ||
103 | /* | 112 | /* non-overwirte doesn't pause the ringbuffer */ |
104 | * 'head' pointer starts from 0. Kernel minus sizeof(record) form | 113 | if (!overwrite) |
105 | * it each time when kernel writes to it, so in fact 'head' is | 114 | end = perf_mmap__read_head(map); |
106 | * negative. 'end' pointer is made manually by adding the size of | ||
107 | * the ring buffer to 'head' pointer, means the validate data can | ||
108 | * read is the whole ring buffer. If 'end' is positive, the ring | ||
109 | * buffer has not fully filled, so we must adjust 'end' to 0. | ||
110 | * | ||
111 | * However, since both 'head' and 'end' is unsigned, we can't | ||
112 | * simply compare 'end' against 0. Here we compare '-head' and | ||
113 | * the size of the ring buffer, where -head is the number of bytes | ||
114 | * kernel write to the ring buffer. | ||
115 | */ | ||
116 | if (-head < (u64)(map->mask + 1)) | ||
117 | end = 0; | ||
118 | else | ||
119 | end = head + map->mask + 1; | ||
120 | |||
121 | return perf_mmap__read(map, start, end, &map->prev); | ||
122 | } | ||
123 | 115 | ||
124 | void perf_mmap__read_catchup(struct perf_mmap *map) | 116 | event = perf_mmap__read(map, startp, end); |
125 | { | ||
126 | u64 head; | ||
127 | 117 | ||
128 | if (!refcount_read(&map->refcnt)) | 118 | if (!overwrite) |
129 | return; | 119 | map->prev = *startp; |
130 | 120 | ||
131 | head = perf_mmap__read_head(map); | 121 | return event; |
132 | map->prev = head; | ||
133 | } | 122 | } |
134 | 123 | ||
135 | static bool perf_mmap__empty(struct perf_mmap *map) | 124 | static bool perf_mmap__empty(struct perf_mmap *map) |
@@ -267,41 +256,60 @@ static int overwrite_rb_find_range(void *buf, int mask, u64 head, u64 *start, u6 | |||
267 | return -1; | 256 | return -1; |
268 | } | 257 | } |
269 | 258 | ||
270 | int perf_mmap__push(struct perf_mmap *md, bool overwrite, | 259 | /* |
271 | void *to, int push(void *to, void *buf, size_t size)) | 260 | * Report the start and end of the available data in ringbuffer |
261 | */ | ||
262 | int perf_mmap__read_init(struct perf_mmap *md, bool overwrite, | ||
263 | u64 *startp, u64 *endp) | ||
272 | { | 264 | { |
273 | u64 head = perf_mmap__read_head(md); | 265 | u64 head = perf_mmap__read_head(md); |
274 | u64 old = md->prev; | 266 | u64 old = md->prev; |
275 | u64 end = head, start = old; | ||
276 | unsigned char *data = md->base + page_size; | 267 | unsigned char *data = md->base + page_size; |
277 | unsigned long size; | 268 | unsigned long size; |
278 | void *buf; | ||
279 | int rc = 0; | ||
280 | 269 | ||
281 | start = overwrite ? head : old; | 270 | *startp = overwrite ? head : old; |
282 | end = overwrite ? old : head; | 271 | *endp = overwrite ? old : head; |
283 | 272 | ||
284 | if (start == end) | 273 | if (*startp == *endp) |
285 | return 0; | 274 | return -EAGAIN; |
286 | 275 | ||
287 | size = end - start; | 276 | size = *endp - *startp; |
288 | if (size > (unsigned long)(md->mask) + 1) { | 277 | if (size > (unsigned long)(md->mask) + 1) { |
289 | if (!overwrite) { | 278 | if (!overwrite) { |
290 | WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); | 279 | WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); |
291 | 280 | ||
292 | md->prev = head; | 281 | md->prev = head; |
293 | perf_mmap__consume(md, overwrite); | 282 | perf_mmap__consume(md, overwrite); |
294 | return 0; | 283 | return -EAGAIN; |
295 | } | 284 | } |
296 | 285 | ||
297 | /* | 286 | /* |
298 | * Backward ring buffer is full. We still have a chance to read | 287 | * Backward ring buffer is full. We still have a chance to read |
299 | * most of data from it. | 288 | * most of data from it. |
300 | */ | 289 | */ |
301 | if (overwrite_rb_find_range(data, md->mask, head, &start, &end)) | 290 | if (overwrite_rb_find_range(data, md->mask, head, startp, endp)) |
302 | return -1; | 291 | return -EINVAL; |
303 | } | 292 | } |
304 | 293 | ||
294 | return 0; | ||
295 | } | ||
296 | |||
297 | int perf_mmap__push(struct perf_mmap *md, bool overwrite, | ||
298 | void *to, int push(void *to, void *buf, size_t size)) | ||
299 | { | ||
300 | u64 head = perf_mmap__read_head(md); | ||
301 | u64 end, start; | ||
302 | unsigned char *data = md->base + page_size; | ||
303 | unsigned long size; | ||
304 | void *buf; | ||
305 | int rc = 0; | ||
306 | |||
307 | rc = perf_mmap__read_init(md, overwrite, &start, &end); | ||
308 | if (rc < 0) | ||
309 | return (rc == -EAGAIN) ? 0 : -1; | ||
310 | |||
311 | size = end - start; | ||
312 | |||
305 | if ((start & md->mask) + size != (end & md->mask)) { | 313 | if ((start & md->mask) + size != (end & md->mask)) { |
306 | buf = &data[start & md->mask]; | 314 | buf = &data[start & md->mask]; |
307 | size = md->mask + 1 - (start & md->mask); | 315 | size = md->mask + 1 - (start & md->mask); |
@@ -327,3 +335,14 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite, | |||
327 | out: | 335 | out: |
328 | return rc; | 336 | return rc; |
329 | } | 337 | } |
338 | |||
339 | /* | ||
340 | * Mandatory for overwrite mode | ||
341 | * The direction of overwrite mode is backward. | ||
342 | * The last perf_mmap__read() will set tail to map->prev. | ||
343 | * Need to correct the map->prev to head which is the end of next read. | ||
344 | */ | ||
345 | void perf_mmap__read_done(struct perf_mmap *map) | ||
346 | { | ||
347 | map->prev = perf_mmap__read_head(map); | ||
348 | } | ||
diff --git a/tools/perf/util/mmap.h b/tools/perf/util/mmap.h index e43d7b55a55f..ec7d3a24e276 100644 --- a/tools/perf/util/mmap.h +++ b/tools/perf/util/mmap.h | |||
@@ -65,8 +65,6 @@ void perf_mmap__put(struct perf_mmap *map); | |||
65 | 65 | ||
66 | void perf_mmap__consume(struct perf_mmap *map, bool overwrite); | 66 | void perf_mmap__consume(struct perf_mmap *map, bool overwrite); |
67 | 67 | ||
68 | void perf_mmap__read_catchup(struct perf_mmap *md); | ||
69 | |||
70 | static inline u64 perf_mmap__read_head(struct perf_mmap *mm) | 68 | static inline u64 perf_mmap__read_head(struct perf_mmap *mm) |
71 | { | 69 | { |
72 | struct perf_event_mmap_page *pc = mm->base; | 70 | struct perf_event_mmap_page *pc = mm->base; |
@@ -87,11 +85,17 @@ static inline void perf_mmap__write_tail(struct perf_mmap *md, u64 tail) | |||
87 | } | 85 | } |
88 | 86 | ||
89 | union perf_event *perf_mmap__read_forward(struct perf_mmap *map); | 87 | union perf_event *perf_mmap__read_forward(struct perf_mmap *map); |
90 | union perf_event *perf_mmap__read_backward(struct perf_mmap *map); | 88 | |
89 | union perf_event *perf_mmap__read_event(struct perf_mmap *map, | ||
90 | bool overwrite, | ||
91 | u64 *startp, u64 end); | ||
91 | 92 | ||
92 | int perf_mmap__push(struct perf_mmap *md, bool backward, | 93 | int perf_mmap__push(struct perf_mmap *md, bool backward, |
93 | void *to, int push(void *to, void *buf, size_t size)); | 94 | void *to, int push(void *to, void *buf, size_t size)); |
94 | 95 | ||
95 | size_t perf_mmap__mmap_len(struct perf_mmap *map); | 96 | size_t perf_mmap__mmap_len(struct perf_mmap *map); |
96 | 97 | ||
98 | int perf_mmap__read_init(struct perf_mmap *md, bool overwrite, | ||
99 | u64 *startp, u64 *endp); | ||
100 | void perf_mmap__read_done(struct perf_mmap *map); | ||
97 | #endif /*__PERF_MMAP_H */ | 101 | #endif /*__PERF_MMAP_H */ |
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c index 1e97937b03a9..6f09e4962dad 100644 --- a/tools/perf/util/record.c +++ b/tools/perf/util/record.c | |||
@@ -137,6 +137,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts, | |||
137 | struct perf_evsel *evsel; | 137 | struct perf_evsel *evsel; |
138 | bool use_sample_identifier = false; | 138 | bool use_sample_identifier = false; |
139 | bool use_comm_exec; | 139 | bool use_comm_exec; |
140 | bool sample_id = opts->sample_id; | ||
140 | 141 | ||
141 | /* | 142 | /* |
142 | * Set the evsel leader links before we configure attributes, | 143 | * Set the evsel leader links before we configure attributes, |
@@ -163,8 +164,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts, | |||
163 | * match the id. | 164 | * match the id. |
164 | */ | 165 | */ |
165 | use_sample_identifier = perf_can_sample_identifier(); | 166 | use_sample_identifier = perf_can_sample_identifier(); |
166 | evlist__for_each_entry(evlist, evsel) | 167 | sample_id = true; |
167 | perf_evsel__set_sample_id(evsel, use_sample_identifier); | ||
168 | } else if (evlist->nr_entries > 1) { | 168 | } else if (evlist->nr_entries > 1) { |
169 | struct perf_evsel *first = perf_evlist__first(evlist); | 169 | struct perf_evsel *first = perf_evlist__first(evlist); |
170 | 170 | ||
@@ -174,6 +174,10 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts, | |||
174 | use_sample_identifier = perf_can_sample_identifier(); | 174 | use_sample_identifier = perf_can_sample_identifier(); |
175 | break; | 175 | break; |
176 | } | 176 | } |
177 | sample_id = true; | ||
178 | } | ||
179 | |||
180 | if (sample_id) { | ||
177 | evlist__for_each_entry(evlist, evsel) | 181 | evlist__for_each_entry(evlist, evsel) |
178 | perf_evsel__set_sample_id(evsel, use_sample_identifier); | 182 | perf_evsel__set_sample_id(evsel, use_sample_identifier); |
179 | } | 183 | } |
diff --git a/tools/perf/util/trigger.h b/tools/perf/util/trigger.h index 370138e7e35c..88223bc7c82b 100644 --- a/tools/perf/util/trigger.h +++ b/tools/perf/util/trigger.h | |||
@@ -12,7 +12,7 @@ | |||
12 | * States and transits: | 12 | * States and transits: |
13 | * | 13 | * |
14 | * | 14 | * |
15 | * OFF--(on)--> READY --(hit)--> HIT | 15 | * OFF--> ON --> READY --(hit)--> HIT |
16 | * ^ | | 16 | * ^ | |
17 | * | (ready) | 17 | * | (ready) |
18 | * | | | 18 | * | | |
@@ -27,8 +27,9 @@ struct trigger { | |||
27 | volatile enum { | 27 | volatile enum { |
28 | TRIGGER_ERROR = -2, | 28 | TRIGGER_ERROR = -2, |
29 | TRIGGER_OFF = -1, | 29 | TRIGGER_OFF = -1, |
30 | TRIGGER_READY = 0, | 30 | TRIGGER_ON = 0, |
31 | TRIGGER_HIT = 1, | 31 | TRIGGER_READY = 1, |
32 | TRIGGER_HIT = 2, | ||
32 | } state; | 33 | } state; |
33 | const char *name; | 34 | const char *name; |
34 | }; | 35 | }; |
@@ -50,7 +51,7 @@ static inline bool trigger_is_error(struct trigger *t) | |||
50 | static inline void trigger_on(struct trigger *t) | 51 | static inline void trigger_on(struct trigger *t) |
51 | { | 52 | { |
52 | TRIGGER_WARN_ONCE(t, TRIGGER_OFF); | 53 | TRIGGER_WARN_ONCE(t, TRIGGER_OFF); |
53 | t->state = TRIGGER_READY; | 54 | t->state = TRIGGER_ON; |
54 | } | 55 | } |
55 | 56 | ||
56 | static inline void trigger_ready(struct trigger *t) | 57 | static inline void trigger_ready(struct trigger *t) |
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 443892dabedb..1019bbc5dbd8 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c | |||
@@ -340,35 +340,15 @@ size_t hex_width(u64 v) | |||
340 | return n; | 340 | return n; |
341 | } | 341 | } |
342 | 342 | ||
343 | static int hex(char ch) | ||
344 | { | ||
345 | if ((ch >= '0') && (ch <= '9')) | ||
346 | return ch - '0'; | ||
347 | if ((ch >= 'a') && (ch <= 'f')) | ||
348 | return ch - 'a' + 10; | ||
349 | if ((ch >= 'A') && (ch <= 'F')) | ||
350 | return ch - 'A' + 10; | ||
351 | return -1; | ||
352 | } | ||
353 | |||
354 | /* | 343 | /* |
355 | * While we find nice hex chars, build a long_val. | 344 | * While we find nice hex chars, build a long_val. |
356 | * Return number of chars processed. | 345 | * Return number of chars processed. |
357 | */ | 346 | */ |
358 | int hex2u64(const char *ptr, u64 *long_val) | 347 | int hex2u64(const char *ptr, u64 *long_val) |
359 | { | 348 | { |
360 | const char *p = ptr; | 349 | char *p; |
361 | *long_val = 0; | ||
362 | |||
363 | while (*p) { | ||
364 | const int hex_val = hex(*p); | ||
365 | 350 | ||
366 | if (hex_val < 0) | 351 | *long_val = strtoull(ptr, &p, 16); |
367 | break; | ||
368 | |||
369 | *long_val = (*long_val << 4) | hex_val; | ||
370 | p++; | ||
371 | } | ||
372 | 352 | ||
373 | return p - ptr; | 353 | return p - ptr; |
374 | } | 354 | } |