perf/urgent fixes:
python interface: - Make 'perf script -g python' generate scripts that are compatible with both python 2 and 3 (Jeremy Cline) - Fix python dictionary reference counting (Janne Huttunen) - Add python3 support for various python scripts (Jeremy Cline) - Use python-config --includes rather than --cflags, fixing the build on Fedora, where the python 3.7 started adding -flto to what perf stat: - Remove needless extra header line in --interval_clear (Jiri Olsa) python-config --cflags generate, breaking the perf build (Jeremy Cline) Build: - Fix compilation errors on gcc8 (Jiri Olsa) perf llvm-utils: - Remove bashism from kernel include fetch script (Kim Phillips) perf test: (Kim Phillips) - Replace '|&' with '2>&1 |' to work with more shells - Make perf's inet_pton test more portable - Prevent temporary editor files from being considered test scripts Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEELb9bqkb7Te0zijNb1lAW81NSqkAFAltGUD8ACgkQ1lAW81NS qkBIEhAAqz7I823fKdQGHWg3SWjv/OFR5t3FT1ydmLyfetIMKKPoMJCRTZFX1Zwy nW+PlwocITCpjmRcfNjrjIl1Nlq7c7KUmUw0JXTIxiYoVlMxmozLgowIH6ShbNvT xGi/kQFmoC1eyMiDHNQTH4BDjo4xFOXcY3aby0qQ3yQSV2hOfdCel1jYy0m6un3F adYA1JisI66ZX936Q3TddPMlk1RgXNbJhPAZJyHynstDL/fNMR4JLIsAEqyl9hL+ CfrlqmwBjjHRGiF6jS0FbZx8H3HWFOHO68FmUbpaNnhWAEcoDPBbNwUmeRnmoX6Q 6CrQnbNyYNKhEnSJX/8uK68qccstRxi6P4stHHL8JV7hVAsTfZpxmUlsZfRe12fZ S839GdIZ6cMl8EL8DFaV7+WfRBdM7cyY2KVNnU9TrT98j0aQU04tVzXLnrJgOcVe FdF0Obj6JsRHWsmZXBNPvvWV1FJJTDMDIP8EWgw7RJVNNt1ch24rJ12GWwh3v/uA OKM6q7YNlfUWN2xwqUrqSGtuUQF0Ommvk4I3Dkad7e2UbjzU4seShW57MGwjy+Ie 2UJfHhBhn7jcCuwktYKMmpj3jtREqlGnse730WxHY2bVv0O8xdeNtvQLET4yLcxq gQhYDiuz5S69z8hp7deAuiTQYkspHGe2hWriqpthkQfs/LOEfUI= =1fnu -----END PGP SIGNATURE----- Merge tag 'perf-urgent-for-mingo-4.18-20180711' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent Pull perf/urgent fixes from Arnaldo Carvalho de Melo: python interface fixes: - Make 'perf script -g python' generate scripts that are compatible with both python 2 and 3 (Jeremy Cline) - Fix python dictionary reference counting (Janne Huttunen) - Add python3 support for various python scripts (Jeremy Cline) - Use python-config --includes rather than --cflags, fixing the build on Fedora, where the python 3.7 started adding -flto to what perf stat fixes: - Remove needless extra header line in --interval_clear (Jiri Olsa) python-config --cflags generate, breaking the perf build (Jeremy Cline) Build fixes: - Fix compilation errors on gcc8 (Jiri Olsa) perf llvm-utils fixes: - Remove bashism from kernel include fetch script (Kim Phillips) perf test fixes: (Kim Phillips) - Replace '|&' with '2>&1 |' to work with more shells - Make perf's inet_pton test more portable - Prevent temporary editor files from being considered test scripts Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Коммит
6e1d33b24a
|
@ -207,8 +207,7 @@ ifdef PYTHON_CONFIG
|
||||||
PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
|
PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
|
||||||
PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
|
PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
|
||||||
PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
|
PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
|
||||||
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
|
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --includes 2>/dev/null)
|
||||||
PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS))
|
|
||||||
FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
|
FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,7 @@ int arch_sdt_arg_parse_op(char *old_op, char **new_op)
|
||||||
else if (rm[2].rm_so != rm[2].rm_eo)
|
else if (rm[2].rm_so != rm[2].rm_eo)
|
||||||
prefix[0] = '+';
|
prefix[0] = '+';
|
||||||
else
|
else
|
||||||
strncpy(prefix, "+0", 2);
|
scnprintf(prefix, sizeof(prefix), "+0");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rename register */
|
/* Rename register */
|
||||||
|
|
|
@ -1742,7 +1742,7 @@ static void print_interval(char *prefix, struct timespec *ts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((num_print_interval == 0 && metric_only) || interval_clear)
|
if ((num_print_interval == 0 || interval_clear) && metric_only)
|
||||||
print_metric_headers(" ", true);
|
print_metric_headers(" ", true);
|
||||||
if (++num_print_interval == 25)
|
if (++num_print_interval == 25)
|
||||||
num_print_interval = 0;
|
num_print_interval = 0;
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <syscall.h> /* for gettid() */
|
#include <syscall.h> /* for gettid() */
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
#include "jvmti_agent.h"
|
#include "jvmti_agent.h"
|
||||||
#include "../util/jitdump.h"
|
#include "../util/jitdump.h"
|
||||||
|
@ -249,7 +250,7 @@ void *jvmti_open(void)
|
||||||
/*
|
/*
|
||||||
* jitdump file name
|
* jitdump file name
|
||||||
*/
|
*/
|
||||||
snprintf(dump_path, PATH_MAX, "%s/jit-%i.dump", jit_path, getpid());
|
scnprintf(dump_path, PATH_MAX, "%s/jit-%i.dump", jit_path, getpid());
|
||||||
|
|
||||||
fd = open(dump_path, O_CREAT|O_TRUNC|O_RDWR, 0666);
|
fd = open(dump_path, O_CREAT|O_TRUNC|O_RDWR, 0666);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
|
|
|
@ -31,10 +31,8 @@ def flag_str(event_name, field_name, value):
|
||||||
string = ""
|
string = ""
|
||||||
|
|
||||||
if flag_fields[event_name][field_name]:
|
if flag_fields[event_name][field_name]:
|
||||||
print_delim = 0
|
print_delim = 0
|
||||||
keys = flag_fields[event_name][field_name]['values'].keys()
|
for idx in sorted(flag_fields[event_name][field_name]['values']):
|
||||||
keys.sort()
|
|
||||||
for idx in keys:
|
|
||||||
if not value and not idx:
|
if not value and not idx:
|
||||||
string += flag_fields[event_name][field_name]['values'][idx]
|
string += flag_fields[event_name][field_name]['values'][idx]
|
||||||
break
|
break
|
||||||
|
@ -51,14 +49,12 @@ def symbol_str(event_name, field_name, value):
|
||||||
string = ""
|
string = ""
|
||||||
|
|
||||||
if symbolic_fields[event_name][field_name]:
|
if symbolic_fields[event_name][field_name]:
|
||||||
keys = symbolic_fields[event_name][field_name]['values'].keys()
|
for idx in sorted(symbolic_fields[event_name][field_name]['values']):
|
||||||
keys.sort()
|
|
||||||
for idx in keys:
|
|
||||||
if not value and not idx:
|
if not value and not idx:
|
||||||
string = symbolic_fields[event_name][field_name]['values'][idx]
|
string = symbolic_fields[event_name][field_name]['values'][idx]
|
||||||
break
|
break
|
||||||
if (value == idx):
|
if (value == idx):
|
||||||
string = symbolic_fields[event_name][field_name]['values'][idx]
|
string = symbolic_fields[event_name][field_name]['values'][idx]
|
||||||
break
|
break
|
||||||
|
|
||||||
return string
|
return string
|
||||||
|
@ -74,19 +70,17 @@ def trace_flag_str(value):
|
||||||
string = ""
|
string = ""
|
||||||
print_delim = 0
|
print_delim = 0
|
||||||
|
|
||||||
keys = trace_flags.keys()
|
for idx in trace_flags:
|
||||||
|
if not value and not idx:
|
||||||
|
string += "NONE"
|
||||||
|
break
|
||||||
|
|
||||||
for idx in keys:
|
if idx and (value & idx) == idx:
|
||||||
if not value and not idx:
|
if print_delim:
|
||||||
string += "NONE"
|
string += " | ";
|
||||||
break
|
string += trace_flags[idx]
|
||||||
|
print_delim = 1
|
||||||
if idx and (value & idx) == idx:
|
value &= ~idx
|
||||||
if print_delim:
|
|
||||||
string += " | ";
|
|
||||||
string += trace_flags[idx]
|
|
||||||
print_delim = 1
|
|
||||||
value &= ~idx
|
|
||||||
|
|
||||||
return string
|
return string
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
# PerfEvent is the base class for all perf event sample, PebsEvent
|
# PerfEvent is the base class for all perf event sample, PebsEvent
|
||||||
# is a HW base Intel x86 PEBS event, and user could add more SW/HW
|
# is a HW base Intel x86 PEBS event, and user could add more SW/HW
|
||||||
# event classes based on requirements.
|
# event classes based on requirements.
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
@ -44,7 +45,8 @@ class PerfEvent(object):
|
||||||
PerfEvent.event_num += 1
|
PerfEvent.event_num += 1
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
print "PMU event: name=%12s, symbol=%24s, comm=%8s, dso=%12s" % (self.name, self.symbol, self.comm, self.dso)
|
print("PMU event: name=%12s, symbol=%24s, comm=%8s, dso=%12s" %
|
||||||
|
(self.name, self.symbol, self.comm, self.dso))
|
||||||
|
|
||||||
#
|
#
|
||||||
# Basic Intel PEBS (Precise Event-based Sampling) event, whose raw buffer
|
# Basic Intel PEBS (Precise Event-based Sampling) event, whose raw buffer
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
try:
|
try:
|
||||||
import wx
|
import wx
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError, "You need to install the wxpython lib for this script"
|
raise ImportError("You need to install the wxpython lib for this script")
|
||||||
|
|
||||||
|
|
||||||
class RootFrame(wx.Frame):
|
class RootFrame(wx.Frame):
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
# This software may be distributed under the terms of the GNU General
|
# This software may be distributed under the terms of the GNU General
|
||||||
# Public License ("GPL") version 2 as published by the Free Software
|
# Public License ("GPL") version 2 as published by the Free Software
|
||||||
# Foundation.
|
# Foundation.
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import errno, os
|
import errno, os
|
||||||
|
|
||||||
|
@ -33,7 +34,7 @@ def nsecs_str(nsecs):
|
||||||
return str
|
return str
|
||||||
|
|
||||||
def add_stats(dict, key, value):
|
def add_stats(dict, key, value):
|
||||||
if not dict.has_key(key):
|
if key not in dict:
|
||||||
dict[key] = (value, value, value, 1)
|
dict[key] = (value, value, value, 1)
|
||||||
else:
|
else:
|
||||||
min, max, avg, count = dict[key]
|
min, max, avg, count = dict[key]
|
||||||
|
@ -72,10 +73,10 @@ try:
|
||||||
except:
|
except:
|
||||||
if not audit_package_warned:
|
if not audit_package_warned:
|
||||||
audit_package_warned = True
|
audit_package_warned = True
|
||||||
print "Install the audit-libs-python package to get syscall names.\n" \
|
print("Install the audit-libs-python package to get syscall names.\n"
|
||||||
"For example:\n # apt-get install python-audit (Ubuntu)" \
|
"For example:\n # apt-get install python-audit (Ubuntu)"
|
||||||
"\n # yum install audit-libs-python (Fedora)" \
|
"\n # yum install audit-libs-python (Fedora)"
|
||||||
"\n etc.\n"
|
"\n etc.\n")
|
||||||
|
|
||||||
def syscall_name(id):
|
def syscall_name(id):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -9,13 +9,17 @@
|
||||||
# This software is distributed under the terms of the GNU General
|
# This software is distributed under the terms of the GNU General
|
||||||
# Public License ("GPL") version 2 as published by the Free Software
|
# Public License ("GPL") version 2 as published by the Free Software
|
||||||
# Foundation.
|
# Foundation.
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from UserList import UserList
|
try:
|
||||||
|
from UserList import UserList
|
||||||
|
except ImportError:
|
||||||
|
# Python 3: UserList moved to the collections package
|
||||||
|
from collections import UserList
|
||||||
|
|
||||||
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
|
||||||
'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
||||||
|
@ -300,7 +304,7 @@ class TimeSliceList(UserList):
|
||||||
if i == -1:
|
if i == -1:
|
||||||
return
|
return
|
||||||
|
|
||||||
for i in xrange(i, len(self.data)):
|
for i in range(i, len(self.data)):
|
||||||
timeslice = self.data[i]
|
timeslice = self.data[i]
|
||||||
if timeslice.start > end:
|
if timeslice.start > end:
|
||||||
return
|
return
|
||||||
|
@ -336,8 +340,8 @@ class SchedEventProxy:
|
||||||
on_cpu_task = self.current_tsk[headers.cpu]
|
on_cpu_task = self.current_tsk[headers.cpu]
|
||||||
|
|
||||||
if on_cpu_task != -1 and on_cpu_task != prev_pid:
|
if on_cpu_task != -1 and on_cpu_task != prev_pid:
|
||||||
print "Sched switch event rejected ts: %s cpu: %d prev: %s(%d) next: %s(%d)" % \
|
print("Sched switch event rejected ts: %s cpu: %d prev: %s(%d) next: %s(%d)" % \
|
||||||
(headers.ts_format(), headers.cpu, prev_comm, prev_pid, next_comm, next_pid)
|
headers.ts_format(), headers.cpu, prev_comm, prev_pid, next_comm, next_pid)
|
||||||
|
|
||||||
threads[prev_pid] = prev_comm
|
threads[prev_pid] = prev_comm
|
||||||
threads[next_pid] = next_comm
|
threads[next_pid] = next_comm
|
||||||
|
|
|
@ -422,7 +422,7 @@ static const char *shell_test__description(char *description, size_t size,
|
||||||
|
|
||||||
#define for_each_shell_test(dir, base, ent) \
|
#define for_each_shell_test(dir, base, ent) \
|
||||||
while ((ent = readdir(dir)) != NULL) \
|
while ((ent = readdir(dir)) != NULL) \
|
||||||
if (!is_directory(base, ent))
|
if (!is_directory(base, ent) && ent->d_name[0] != '.')
|
||||||
|
|
||||||
static const char *shell_tests__dir(char *path, size_t size)
|
static const char *shell_tests__dir(char *path, size_t size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,35 +14,40 @@ libc=$(grep -w libc /proc/self/maps | head -1 | sed -r 's/.*[[:space:]](\/.*)/\1
|
||||||
nm -Dg $libc 2>/dev/null | fgrep -q inet_pton || exit 254
|
nm -Dg $libc 2>/dev/null | fgrep -q inet_pton || exit 254
|
||||||
|
|
||||||
trace_libc_inet_pton_backtrace() {
|
trace_libc_inet_pton_backtrace() {
|
||||||
idx=0
|
|
||||||
expected[0]="ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)"
|
expected=`mktemp -u /tmp/expected.XXX`
|
||||||
expected[1]=".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$"
|
|
||||||
|
echo "ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)" > $expected
|
||||||
|
echo ".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
||||||
case "$(uname -m)" in
|
case "$(uname -m)" in
|
||||||
s390x)
|
s390x)
|
||||||
eventattr='call-graph=dwarf,max-stack=4'
|
eventattr='call-graph=dwarf,max-stack=4'
|
||||||
expected[2]="gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$"
|
echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
||||||
expected[3]="(__GI_)?getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$"
|
echo "(__GI_)?getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
||||||
expected[4]="main\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$"
|
echo "main\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
eventattr='max-stack=3'
|
eventattr='max-stack=3'
|
||||||
expected[2]="getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$"
|
echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
|
||||||
expected[3]=".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$"
|
echo ".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
file=`mktemp -u /tmp/perf.data.XXX`
|
perf_data=`mktemp -u /tmp/perf.data.XXX`
|
||||||
|
perf_script=`mktemp -u /tmp/perf.script.XXX`
|
||||||
|
perf record -e probe_libc:inet_pton/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1
|
||||||
|
perf script -i $perf_data > $perf_script
|
||||||
|
|
||||||
perf record -e probe_libc:inet_pton/$eventattr/ -o $file ping -6 -c 1 ::1 > /dev/null 2>&1
|
exec 3<$perf_script
|
||||||
perf script -i $file | while read line ; do
|
exec 4<$expected
|
||||||
|
while read line <&3 && read -r pattern <&4; do
|
||||||
|
[ -z "$pattern" ] && break
|
||||||
echo $line
|
echo $line
|
||||||
echo "$line" | egrep -q "${expected[$idx]}"
|
echo "$line" | egrep -q "$pattern"
|
||||||
if [ $? -ne 0 ] ; then
|
if [ $? -ne 0 ] ; then
|
||||||
printf "FAIL: expected backtrace entry %d \"%s\" got \"%s\"\n" $idx "${expected[$idx]}" "$line"
|
printf "FAIL: expected backtrace entry \"%s\" got \"%s\"\n" "$pattern" "$line"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
let idx+=1
|
|
||||||
[ -z "${expected[$idx]}" ] && break
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# If any statements are executed from this point onwards,
|
# If any statements are executed from this point onwards,
|
||||||
|
@ -58,6 +63,6 @@ skip_if_no_perf_probe && \
|
||||||
perf probe -q $libc inet_pton && \
|
perf probe -q $libc inet_pton && \
|
||||||
trace_libc_inet_pton_backtrace
|
trace_libc_inet_pton_backtrace
|
||||||
err=$?
|
err=$?
|
||||||
rm -f ${file}
|
rm -f ${perf_data} ${perf_script} ${expected}
|
||||||
perf probe -q -d probe_libc:inet_pton
|
perf probe -q -d probe_libc:inet_pton
|
||||||
exit $err
|
exit $err
|
||||||
|
|
|
@ -17,7 +17,7 @@ skip_if_no_perf_probe || exit 2
|
||||||
file=$(mktemp /tmp/temporary_file.XXXXX)
|
file=$(mktemp /tmp/temporary_file.XXXXX)
|
||||||
|
|
||||||
trace_open_vfs_getname() {
|
trace_open_vfs_getname() {
|
||||||
evts=$(echo $(perf list syscalls:sys_enter_open* |& egrep 'open(at)? ' | sed -r 's/.*sys_enter_([a-z]+) +\[.*$/\1/') | sed 's/ /,/')
|
evts=$(echo $(perf list syscalls:sys_enter_open* 2>&1 | egrep 'open(at)? ' | sed -r 's/.*sys_enter_([a-z]+) +\[.*$/\1/') | sed 's/ /,/')
|
||||||
perf trace -e $evts touch $file 2>&1 | \
|
perf trace -e $evts touch $file 2>&1 | \
|
||||||
egrep " +[0-9]+\.[0-9]+ +\( +[0-9]+\.[0-9]+ ms\): +touch\/[0-9]+ open(at)?\((dfd: +CWD, +)?filename: +${file}, +flags: CREAT\|NOCTTY\|NONBLOCK\|WRONLY, +mode: +IRUGO\|IWUGO\) += +[0-9]+$"
|
egrep " +[0-9]+\.[0-9]+ +\( +[0-9]+\.[0-9]+ ms\): +touch\/[0-9]+ open(at)?\((dfd: +CWD, +)?filename: +${file}, +flags: CREAT\|NOCTTY\|NONBLOCK\|WRONLY, +mode: +IRUGO\|IWUGO\) += +[0-9]+$"
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,16 +266,16 @@ static const char *kinc_fetch_script =
|
||||||
"#!/usr/bin/env sh\n"
|
"#!/usr/bin/env sh\n"
|
||||||
"if ! test -d \"$KBUILD_DIR\"\n"
|
"if ! test -d \"$KBUILD_DIR\"\n"
|
||||||
"then\n"
|
"then\n"
|
||||||
" exit -1\n"
|
" exit 1\n"
|
||||||
"fi\n"
|
"fi\n"
|
||||||
"if ! test -f \"$KBUILD_DIR/include/generated/autoconf.h\"\n"
|
"if ! test -f \"$KBUILD_DIR/include/generated/autoconf.h\"\n"
|
||||||
"then\n"
|
"then\n"
|
||||||
" exit -1\n"
|
" exit 1\n"
|
||||||
"fi\n"
|
"fi\n"
|
||||||
"TMPDIR=`mktemp -d`\n"
|
"TMPDIR=`mktemp -d`\n"
|
||||||
"if test -z \"$TMPDIR\"\n"
|
"if test -z \"$TMPDIR\"\n"
|
||||||
"then\n"
|
"then\n"
|
||||||
" exit -1\n"
|
" exit 1\n"
|
||||||
"fi\n"
|
"fi\n"
|
||||||
"cat << EOF > $TMPDIR/Makefile\n"
|
"cat << EOF > $TMPDIR/Makefile\n"
|
||||||
"obj-y := dummy.o\n"
|
"obj-y := dummy.o\n"
|
||||||
|
|
|
@ -908,14 +908,11 @@ static void python_process_tracepoint(struct perf_sample *sample,
|
||||||
if (_PyTuple_Resize(&t, n) == -1)
|
if (_PyTuple_Resize(&t, n) == -1)
|
||||||
Py_FatalError("error resizing Python tuple");
|
Py_FatalError("error resizing Python tuple");
|
||||||
|
|
||||||
if (!dict) {
|
if (!dict)
|
||||||
call_object(handler, t, handler_name);
|
call_object(handler, t, handler_name);
|
||||||
} else {
|
else
|
||||||
call_object(handler, t, default_handler_name);
|
call_object(handler, t, default_handler_name);
|
||||||
Py_DECREF(dict);
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_XDECREF(all_entries_dict);
|
|
||||||
Py_DECREF(t);
|
Py_DECREF(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1235,7 +1232,6 @@ static void python_process_general_event(struct perf_sample *sample,
|
||||||
|
|
||||||
call_object(handler, t, handler_name);
|
call_object(handler, t, handler_name);
|
||||||
|
|
||||||
Py_DECREF(dict);
|
|
||||||
Py_DECREF(t);
|
Py_DECREF(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1627,6 +1623,7 @@ static int python_generate_script(struct pevent *pevent, const char *outfile)
|
||||||
fprintf(ofp, "# See the perf-script-python Documentation for the list "
|
fprintf(ofp, "# See the perf-script-python Documentation for the list "
|
||||||
"of available functions.\n\n");
|
"of available functions.\n\n");
|
||||||
|
|
||||||
|
fprintf(ofp, "from __future__ import print_function\n\n");
|
||||||
fprintf(ofp, "import os\n");
|
fprintf(ofp, "import os\n");
|
||||||
fprintf(ofp, "import sys\n\n");
|
fprintf(ofp, "import sys\n\n");
|
||||||
|
|
||||||
|
@ -1636,10 +1633,10 @@ static int python_generate_script(struct pevent *pevent, const char *outfile)
|
||||||
fprintf(ofp, "from Core import *\n\n\n");
|
fprintf(ofp, "from Core import *\n\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "def trace_begin():\n");
|
fprintf(ofp, "def trace_begin():\n");
|
||||||
fprintf(ofp, "\tprint \"in trace_begin\"\n\n");
|
fprintf(ofp, "\tprint(\"in trace_begin\")\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "def trace_end():\n");
|
fprintf(ofp, "def trace_end():\n");
|
||||||
fprintf(ofp, "\tprint \"in trace_end\"\n\n");
|
fprintf(ofp, "\tprint(\"in trace_end\")\n\n");
|
||||||
|
|
||||||
while ((event = trace_find_next_event(pevent, event))) {
|
while ((event = trace_find_next_event(pevent, event))) {
|
||||||
fprintf(ofp, "def %s__%s(", event->system, event->name);
|
fprintf(ofp, "def %s__%s(", event->system, event->name);
|
||||||
|
@ -1675,7 +1672,7 @@ static int python_generate_script(struct pevent *pevent, const char *outfile)
|
||||||
"common_secs, common_nsecs,\n\t\t\t"
|
"common_secs, common_nsecs,\n\t\t\t"
|
||||||
"common_pid, common_comm)\n\n");
|
"common_pid, common_comm)\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "\t\tprint \"");
|
fprintf(ofp, "\t\tprint(\"");
|
||||||
|
|
||||||
not_first = 0;
|
not_first = 0;
|
||||||
count = 0;
|
count = 0;
|
||||||
|
@ -1736,31 +1733,31 @@ static int python_generate_script(struct pevent *pevent, const char *outfile)
|
||||||
fprintf(ofp, "%s", f->name);
|
fprintf(ofp, "%s", f->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ofp, ")\n\n");
|
fprintf(ofp, "))\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "\t\tprint 'Sample: {'+"
|
fprintf(ofp, "\t\tprint('Sample: {'+"
|
||||||
"get_dict_as_string(perf_sample_dict['sample'], ', ')+'}'\n\n");
|
"get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "\t\tfor node in common_callchain:");
|
fprintf(ofp, "\t\tfor node in common_callchain:");
|
||||||
fprintf(ofp, "\n\t\t\tif 'sym' in node:");
|
fprintf(ofp, "\n\t\t\tif 'sym' in node:");
|
||||||
fprintf(ofp, "\n\t\t\t\tprint \"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name'])");
|
fprintf(ofp, "\n\t\t\t\tprint(\"\\t[%%x] %%s\" %% (node['ip'], node['sym']['name']))");
|
||||||
fprintf(ofp, "\n\t\t\telse:");
|
fprintf(ofp, "\n\t\t\telse:");
|
||||||
fprintf(ofp, "\n\t\t\t\tprint \"\t[%%x]\" %% (node['ip'])\n\n");
|
fprintf(ofp, "\n\t\t\t\tprint(\"\t[%%x]\" %% (node['ip']))\n\n");
|
||||||
fprintf(ofp, "\t\tprint \"\\n\"\n\n");
|
fprintf(ofp, "\t\tprint()\n\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ofp, "def trace_unhandled(event_name, context, "
|
fprintf(ofp, "def trace_unhandled(event_name, context, "
|
||||||
"event_fields_dict, perf_sample_dict):\n");
|
"event_fields_dict, perf_sample_dict):\n");
|
||||||
|
|
||||||
fprintf(ofp, "\t\tprint get_dict_as_string(event_fields_dict)\n");
|
fprintf(ofp, "\t\tprint(get_dict_as_string(event_fields_dict))\n");
|
||||||
fprintf(ofp, "\t\tprint 'Sample: {'+"
|
fprintf(ofp, "\t\tprint('Sample: {'+"
|
||||||
"get_dict_as_string(perf_sample_dict['sample'], ', ')+'}'\n\n");
|
"get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "def print_header("
|
fprintf(ofp, "def print_header("
|
||||||
"event_name, cpu, secs, nsecs, pid, comm):\n"
|
"event_name, cpu, secs, nsecs, pid, comm):\n"
|
||||||
"\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
|
"\tprint(\"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
|
||||||
"(event_name, cpu, secs, nsecs, pid, comm),\n\n");
|
"(event_name, cpu, secs, nsecs, pid, comm), end=\"\")\n\n");
|
||||||
|
|
||||||
fprintf(ofp, "def get_dict_as_string(a_dict, delimiter=' '):\n"
|
fprintf(ofp, "def get_dict_as_string(a_dict, delimiter=' '):\n"
|
||||||
"\treturn delimiter.join"
|
"\treturn delimiter.join"
|
||||||
|
|
Загрузка…
Ссылка в новой задаче