From 016066336bfa0bbf16ff6d3e9dc6be61ab5342e3 Mon Sep 17 00:00:00 2001 From: Benjamin Poirier Date: Wed, 13 Nov 2019 15:31:56 +0900 Subject: [PATCH] tools/perf: Add python3 support to scripts --- debian/changelog | 3 + ...on-Add-Python3-support-to-event_anal.patch | 154 ++++++ ...on-Add-Python3-support-to-export-to-.patch | 215 ++++++++ ...n3-support-to-export-to-ebf6c5c181ab.patch | 86 +++ ...on-Add-Python3-support-to-failed-sys.patch | 76 +++ ...on-Add-Python3-support-to-futex-cont.patch | 58 ++ ...on-Add-Python3-support-to-intel-pt-e.patch | 133 +++++ ...on-Add-Python3-support-to-mem-phys-a.patch | 76 +++ ...on-Add-Python3-support-to-net_dropmo.patch | 59 ++ ...on-Add-Python3-support-to-netdev-tim.patch | 180 ++++++ ...on-Add-Python3-support-to-powerpc-hc.patch | 87 +++ ...thon-Add-Python3-support-to-sctop.py.patch | 69 +++ ...on-Add-Python3-support-to-stackcolla.patch | 45 ++ ...on-Add-Python3-support-to-stat-cpi.p.patch | 61 +++ ...3-support-to-syscall-co-de667cce7f4f.patch | 74 +++ ...on-Add-Python3-support-to-syscall-co.patch | 65 +++ ...ript-python-Remove-mixed-indentation.patch | 511 ++++++++++++++++++ ...on-add-Python3-support-to-check-perf.patch | 105 ++++ debian/patches/series | 17 + 19 files changed, 2074 insertions(+) create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch create mode 100644 debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch diff --git a/debian/changelog b/debian/changelog index f89759dc8..a0295c9d0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,9 @@ linux (4.19.67-3) UNRELEASED; urgency=medium * drivers/net/ethernet/amazon: Backport driver fixes from Linux 5.4 (Closes: #941291) + [ Benjamin Poirier ] + * tools/perf: Add python3 support to scripts (Closes: #944641) + -- Romain Perier Wed, 28 Aug 2019 13:28:09 +0200 linux (4.19.67-2+deb10u2) buster-security; urgency=high diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch new file mode 100644 index 000000000..8512ee956 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch @@ -0,0 +1,154 @@ +From: Tony Jones +Date: Fri, 1 Mar 2019 17:19:00 -0800 +Subject: perf script python: Add Python3 support to +Origin: https://git.kernel.org/linus/c253c72e9d6723c8b078beb362f050059ef5de39 +Bug-Debian: https://bugs.debian.org/944641 + event_analyzing_sample.py + +Support both Python2 and Python3 in the event_analyzing_sample.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Cc: Feng Tang +Link: http://lkml.kernel.org/r/20190302011903.2416-5-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/event_analyzing_sample.py | 48 ++++++++++---------- + 1 file changed, 25 insertions(+), 23 deletions(-) + +--- a/tools/perf/scripts/python/event_analyzing_sample.py ++++ b/tools/perf/scripts/python/event_analyzing_sample.py +@@ -15,6 +15,8 @@ + # for a x86 HW PMU event: PEBS with load latency data. + # + ++from __future__ import print_function ++ + import os + import sys + import math +@@ -37,7 +39,7 @@ con = sqlite3.connect("/dev/shm/perf.db" + con.isolation_level = None + + def trace_begin(): +- print "In trace_begin:\n" ++ print("In trace_begin:\n") + + # + # Will create several tables at the start, pebs_ll is for PEBS data with +@@ -76,12 +78,12 @@ def process_event(param_dict): + name = param_dict["ev_name"] + + # Symbol and dso info are not always resolved +- if (param_dict.has_key("dso")): ++ if ("dso" in param_dict): + dso = param_dict["dso"] + else: + dso = "Unknown_dso" + +- if (param_dict.has_key("symbol")): ++ if ("symbol" in param_dict): + symbol = param_dict["symbol"] + else: + symbol = "Unknown_symbol" +@@ -102,7 +104,7 @@ def insert_db(event): + event.ip, event.status, event.dse, event.dla, event.lat)) + + def trace_end(): +- print "In trace_end:\n" ++ print("In trace_end:\n") + # We show the basic info for the 2 type of event classes + show_general_events() + show_pebs_ll() +@@ -123,29 +125,29 @@ def show_general_events(): + # Check the total record number in the table + count = con.execute("select count(*) from gen_events") + for t in count: +- print "There is %d records in gen_events table" % t[0] ++ print("There is %d records in gen_events table" % t[0]) + if t[0] == 0: + return + +- print "Statistics about the general events grouped by thread/symbol/dso: \n" ++ print("Statistics about the general events grouped by thread/symbol/dso: \n") + + # Group by thread + commq = con.execute("select comm, count(comm) from gen_events group by comm order by -count(comm)") +- print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42) ++ print("\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42)) + for row in commq: +- print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%16s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by symbol +- print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58)) + symbolq = con.execute("select symbol, count(symbol) from gen_events group by symbol order by -count(symbol)") + for row in symbolq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by dso +- print "\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74) ++ print("\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74)) + dsoq = con.execute("select dso, count(dso) from gen_events group by dso order by -count(dso)") + for row in dsoq: +- print "%40s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%40s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # + # This function just shows the basic info, and we could do more with the +@@ -156,35 +158,35 @@ def show_pebs_ll(): + + count = con.execute("select count(*) from pebs_ll") + for t in count: +- print "There is %d records in pebs_ll table" % t[0] ++ print("There is %d records in pebs_ll table" % t[0]) + if t[0] == 0: + return + +- print "Statistics about the PEBS Load Latency events grouped by thread/symbol/dse/latency: \n" ++ print("Statistics about the PEBS Load Latency events grouped by thread/symbol/dse/latency: \n") + + # Group by thread + commq = con.execute("select comm, count(comm) from pebs_ll group by comm order by -count(comm)") +- print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42) ++ print("\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42)) + for row in commq: +- print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%16s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by symbol +- print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58)) + symbolq = con.execute("select symbol, count(symbol) from pebs_ll group by symbol order by -count(symbol)") + for row in symbolq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by dse + dseq = con.execute("select dse, count(dse) from pebs_ll group by dse order by -count(dse)") +- print "\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58)) + for row in dseq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + # Group by latency + latq = con.execute("select lat, count(lat) from pebs_ll group by lat order by lat") +- print "\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58) ++ print("\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58)) + for row in latq: +- print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) ++ print("%32s %8d %s" % (row[0], row[1], num2sym(row[1]))) + + def trace_unhandled(event_name, context, event_fields_dict): +- print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) ++ print (' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())])) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch new file mode 100644 index 000000000..32c5e18ae --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch @@ -0,0 +1,215 @@ +From: Tony Jones +Date: Fri, 8 Mar 2019 16:05:16 -0800 +Subject: perf script python: Add Python3 support to +Origin: https://git.kernel.org/linus/1937b0560c3ea43b1b0f7d3617949ca50de8f8c0 +Bug-Debian: https://bugs.debian.org/944641 + export-to-postgresql.py + +Support both Python2 and Python3 in the export-to-postgresql.py script. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Link: http://lkml.kernel.org/r/20190309000518.2438-3-tonyj@suse.de +Signed-off-by: Adrian Hunter +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/export-to-postgresql.py | 58 +++++++++++++++------- + 1 file changed, 41 insertions(+), 17 deletions(-) + +--- a/tools/perf/scripts/python/export-to-postgresql.py ++++ b/tools/perf/scripts/python/export-to-postgresql.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -199,6 +201,18 @@ import datetime + + from PySide.QtSql import * + ++if sys.version_info < (3, 0): ++ def toserverstr(str): ++ return str ++ def toclientstr(str): ++ return str ++else: ++ # Assume UTF-8 server_encoding and client_encoding ++ def toserverstr(str): ++ return bytes(str, "UTF_8") ++ def toclientstr(str): ++ return bytes(str, "UTF_8") ++ + # Need to access PostgreSQL C library directly to use COPY FROM STDIN + from ctypes import * + libpq = CDLL("libpq.so.5") +@@ -234,12 +248,14 @@ perf_db_export_mode = True + perf_db_export_calls = False + perf_db_export_callchains = False + ++def printerr(*args, **kw_args): ++ print(*args, file=sys.stderr, **kw_args) + + def usage(): +- print >> sys.stderr, "Usage is: export-to-postgresql.py [] [] []" +- print >> sys.stderr, "where: columns 'all' or 'branches'" +- print >> sys.stderr, " calls 'calls' => create calls and call_paths table" +- print >> sys.stderr, " callchains 'callchains' => create call_paths table" ++ printerr("Usage is: export-to-postgresql.py [] [] []") ++ printerr("where: columns 'all' or 'branches'") ++ printerr(" calls 'calls' => create calls and call_paths table") ++ printerr(" callchains 'callchains' => create call_paths table") + raise Exception("Too few arguments") + + if (len(sys.argv) < 2): +@@ -273,7 +289,7 @@ def do_query(q, s): + return + raise Exception("Query failed: " + q.lastError().text()) + +-print datetime.datetime.today(), "Creating database..." ++print(datetime.datetime.today(), "Creating database...") + + db = QSqlDatabase.addDatabase('QPSQL') + query = QSqlQuery(db) +@@ -504,12 +520,12 @@ do_query(query, 'CREATE VIEW samples_vie + ' FROM samples') + + +-file_header = struct.pack("!11sii", "PGCOPY\n\377\r\n\0", 0, 0) +-file_trailer = "\377\377" ++file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0) ++file_trailer = b"\377\377" + + def open_output_file(file_name): + path_name = output_dir_name + "/" + file_name +- file = open(path_name, "w+") ++ file = open(path_name, "wb+") + file.write(file_header) + return file + +@@ -524,13 +540,13 @@ def copy_output_file_direct(file, table_ + + # Use COPY FROM STDIN because security may prevent postgres from accessing the files directly + def copy_output_file(file, table_name): +- conn = PQconnectdb("dbname = " + dbname) ++ conn = PQconnectdb(toclientstr("dbname = " + dbname)) + if (PQstatus(conn)): + raise Exception("COPY FROM STDIN PQconnectdb failed") + file.write(file_trailer) + file.seek(0) + sql = "COPY " + table_name + " FROM STDIN (FORMAT 'binary')" +- res = PQexec(conn, sql) ++ res = PQexec(conn, toclientstr(sql)) + if (PQresultStatus(res) != 4): + raise Exception("COPY FROM STDIN PQexec failed") + data = file.read(65536) +@@ -564,7 +580,7 @@ if perf_db_export_calls: + call_file = open_output_file("call_table.bin") + + def trace_begin(): +- print datetime.datetime.today(), "Writing to intermediate files..." ++ print(datetime.datetime.today(), "Writing to intermediate files...") + # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs + evsel_table(0, "unknown") + machine_table(0, 0, "unknown") +@@ -579,7 +595,7 @@ def trace_begin(): + unhandled_count = 0 + + def trace_end(): +- print datetime.datetime.today(), "Copying to database..." ++ print(datetime.datetime.today(), "Copying to database...") + copy_output_file(evsel_file, "selected_events") + copy_output_file(machine_file, "machines") + copy_output_file(thread_file, "threads") +@@ -594,7 +610,7 @@ def trace_end(): + if perf_db_export_calls: + copy_output_file(call_file, "calls") + +- print datetime.datetime.today(), "Removing intermediate files..." ++ print(datetime.datetime.today(), "Removing intermediate files...") + remove_output_file(evsel_file) + remove_output_file(machine_file) + remove_output_file(thread_file) +@@ -609,7 +625,7 @@ def trace_end(): + if perf_db_export_calls: + remove_output_file(call_file) + os.rmdir(output_dir_name) +- print datetime.datetime.today(), "Adding primary keys" ++ print(datetime.datetime.today(), "Adding primary keys") + do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)') + do_query(query, 'ALTER TABLE machines ADD PRIMARY KEY (id)') + do_query(query, 'ALTER TABLE threads ADD PRIMARY KEY (id)') +@@ -624,7 +640,7 @@ def trace_end(): + if perf_db_export_calls: + do_query(query, 'ALTER TABLE calls ADD PRIMARY KEY (id)') + +- print datetime.datetime.today(), "Adding foreign keys" ++ print(datetime.datetime.today(), "Adding foreign keys") + do_query(query, 'ALTER TABLE threads ' + 'ADD CONSTRAINT machinefk FOREIGN KEY (machine_id) REFERENCES machines (id),' + 'ADD CONSTRAINT processfk FOREIGN KEY (process_id) REFERENCES threads (id)') +@@ -659,8 +675,8 @@ def trace_end(): + do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') + + if (unhandled_count): +- print datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events" +- print datetime.datetime.today(), "Done" ++ print(datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events") ++ print(datetime.datetime.today(), "Done") + + def trace_unhandled(event_name, context, event_fields_dict): + global unhandled_count +@@ -670,12 +686,14 @@ def sched__sched_switch(*x): + pass + + def evsel_table(evsel_id, evsel_name, *x): ++ evsel_name = toserverstr(evsel_name) + n = len(evsel_name) + fmt = "!hiqi" + str(n) + "s" + value = struct.pack(fmt, 2, 8, evsel_id, n, evsel_name) + evsel_file.write(value) + + def machine_table(machine_id, pid, root_dir, *x): ++ root_dir = toserverstr(root_dir) + n = len(root_dir) + fmt = "!hiqiii" + str(n) + "s" + value = struct.pack(fmt, 3, 8, machine_id, 4, pid, n, root_dir) +@@ -686,6 +704,7 @@ def thread_table(thread_id, machine_id, + thread_file.write(value) + + def comm_table(comm_id, comm_str, *x): ++ comm_str = toserverstr(comm_str) + n = len(comm_str) + fmt = "!hiqi" + str(n) + "s" + value = struct.pack(fmt, 2, 8, comm_id, n, comm_str) +@@ -697,6 +716,9 @@ def comm_thread_table(comm_thread_id, co + comm_thread_file.write(value) + + def dso_table(dso_id, machine_id, short_name, long_name, build_id, *x): ++ short_name = toserverstr(short_name) ++ long_name = toserverstr(long_name) ++ build_id = toserverstr(build_id) + n1 = len(short_name) + n2 = len(long_name) + n3 = len(build_id) +@@ -705,12 +727,14 @@ def dso_table(dso_id, machine_id, short_ + dso_file.write(value) + + def symbol_table(symbol_id, dso_id, sym_start, sym_end, binding, symbol_name, *x): ++ symbol_name = toserverstr(symbol_name) + n = len(symbol_name) + fmt = "!hiqiqiqiqiii" + str(n) + "s" + value = struct.pack(fmt, 6, 8, symbol_id, 8, dso_id, 8, sym_start, 8, sym_end, 4, binding, n, symbol_name) + symbol_file.write(value) + + def branch_type_table(branch_type, name, *x): ++ name = toserverstr(name) + n = len(name) + fmt = "!hiii" + str(n) + "s" + value = struct.pack(fmt, 2, 4, branch_type, n, name) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch new file mode 100644 index 000000000..96dab4468 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch @@ -0,0 +1,86 @@ +From: Tony Jones +Date: Fri, 8 Mar 2019 16:05:17 -0800 +Subject: perf script python: Add Python3 support to +Origin: https://git.kernel.org/linus/ebf6c5c181abe9309788c6241d39602a1ce18723 +Bug-Debian: https://bugs.debian.org/944641 + export-to-sqlite.py + +Support both Python2 and Python3 in the export-to-sqlite.py script + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Acked-by: Adrian Hunter +Link: http://lkml.kernel.org/r/20190309000518.2438-4-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/export-to-sqlite.py | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +--- a/tools/perf/scripts/python/export-to-sqlite.py ++++ b/tools/perf/scripts/python/export-to-sqlite.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -60,11 +62,14 @@ perf_db_export_mode = True + perf_db_export_calls = False + perf_db_export_callchains = False + ++def printerr(*args, **keyword_args): ++ print(*args, file=sys.stderr, **keyword_args) ++ + def usage(): +- print >> sys.stderr, "Usage is: export-to-sqlite.py [] [] []" +- print >> sys.stderr, "where: columns 'all' or 'branches'" +- print >> sys.stderr, " calls 'calls' => create calls and call_paths table" +- print >> sys.stderr, " callchains 'callchains' => create call_paths table" ++ printerr("Usage is: export-to-sqlite.py [] [] []"); ++ printerr("where: columns 'all' or 'branches'"); ++ printerr(" calls 'calls' => create calls and call_paths table"); ++ printerr(" callchains 'callchains' => create call_paths table"); + raise Exception("Too few arguments") + + if (len(sys.argv) < 2): +@@ -100,7 +105,7 @@ def do_query_(q): + return + raise Exception("Query failed: " + q.lastError().text()) + +-print datetime.datetime.today(), "Creating database..." ++print(datetime.datetime.today(), "Creating database ...") + + db_exists = False + try: +@@ -376,7 +381,7 @@ if perf_db_export_calls: + call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") + + def trace_begin(): +- print datetime.datetime.today(), "Writing records..." ++ print(datetime.datetime.today(), "Writing records...") + do_query(query, 'BEGIN TRANSACTION') + # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs + evsel_table(0, "unknown") +@@ -394,13 +399,13 @@ unhandled_count = 0 + def trace_end(): + do_query(query, 'END TRANSACTION') + +- print datetime.datetime.today(), "Adding indexes" ++ print(datetime.datetime.today(), "Adding indexes") + if perf_db_export_calls: + do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') + + if (unhandled_count): +- print datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events" +- print datetime.datetime.today(), "Done" ++ print(datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events") ++ print(datetime.datetime.today(), "Done") + + def trace_unhandled(event_name, context, event_fields_dict): + global unhandled_count diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch new file mode 100644 index 000000000..617145de6 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch @@ -0,0 +1,76 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:08 -0800 +Subject: perf script python: Add Python3 support to + failed-syscalls-by-pid.py +Origin: https://git.kernel.org/linus/9b2700efc57f46fe63beee5f64fcfe2746936b4e +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the failed-syscalls-by-pid.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Cc: Tom Zanussi +Link: http://lkml.kernel.org/r/20190222230619.17887-5-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/failed-syscalls-by-pid.py | 21 ++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +--- a/tools/perf/scripts/python/failed-syscalls-by-pid.py ++++ b/tools/perf/scripts/python/failed-syscalls-by-pid.py +@@ -5,6 +5,8 @@ + # Displays system-wide failed system call totals, broken down by pid. + # If a [comm] arg is specified, only syscalls called by [comm] are displayed. + ++from __future__ import print_function ++ + import os + import sys + +@@ -32,7 +34,7 @@ if len(sys.argv) > 1: + syscalls = autodict() + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + print_error_totals() +@@ -57,22 +59,21 @@ def syscalls__sys_exit(event_name, conte + + def print_error_totals(): + if for_comm is not None: +- print "\nsyscall errors for %s:\n\n" % (for_comm), ++ print("\nsyscall errors for %s:\n" % (for_comm)) + else: +- print "\nsyscall errors:\n\n", ++ print("\nsyscall errors:\n") + +- print "%-30s %10s\n" % ("comm [pid]", "count"), +- print "%-30s %10s\n" % ("------------------------------", \ +- "----------"), ++ print("%-30s %10s" % ("comm [pid]", "count")) ++ print("%-30s %10s" % ("------------------------------", "----------")) + + comm_keys = syscalls.keys() + for comm in comm_keys: + pid_keys = syscalls[comm].keys() + for pid in pid_keys: +- print "\n%s [%d]\n" % (comm, pid), ++ print("\n%s [%d]" % (comm, pid)) + id_keys = syscalls[comm][pid].keys() + for id in id_keys: +- print " syscall: %-16s\n" % syscall_name(id), ++ print(" syscall: %-16s" % syscall_name(id)) + ret_keys = syscalls[comm][pid][id].keys() +- for ret, val in sorted(syscalls[comm][pid][id].iteritems(), key = lambda(k, v): (v, k), reverse = True): +- print " err = %-20s %10d\n" % (strerror(ret), val), ++ for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" err = %-20s %10d" % (strerror(ret), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch new file mode 100644 index 000000000..5582a01b3 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch @@ -0,0 +1,58 @@ +From: Tony Jones +Date: Fri, 1 Mar 2019 17:18:58 -0800 +Subject: perf script python: Add Python3 support to +Origin: https://git.kernel.org/linus/de2ec16bd438945813198d4de2339a396904c206 +Bug-Debian: https://bugs.debian.org/944641 + futex-contention.py + +Support both Python2 and Python3 in the futex-contention.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Link: http://lkml.kernel.org/r/20190302011903.2416-3-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/futex-contention.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/tools/perf/scripts/python/futex-contention.py ++++ b/tools/perf/scripts/python/futex-contention.py +@@ -10,6 +10,8 @@ + # + # Measures futex contention + ++from __future__ import print_function ++ + import os, sys + sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + from Util import * +@@ -33,18 +35,18 @@ def syscalls__sys_enter_futex(event, ctx + + def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain, + nr, ret): +- if thread_blocktime.has_key(tid): ++ if tid in thread_blocktime: + elapsed = nsecs(s, ns) - thread_blocktime[tid] + add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed) + del thread_blocktime[tid] + del thread_thislock[tid] + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + for (tid, lock) in lock_waits: + min, max, avg, count = lock_waits[tid, lock] +- print "%s[%d] lock %x contended %d times, %d avg ns" % \ +- (process_names[tid], tid, lock, count, avg) ++ print("%s[%d] lock %x contended %d times, %d avg ns" % ++ (process_names[tid], tid, lock, count, avg)) + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch new file mode 100644 index 000000000..c9dd3a189 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch @@ -0,0 +1,133 @@ +From: Tony Jones +Date: Tue, 5 Mar 2019 08:19:02 -0800 +Subject: perf script python: Add Python3 support to intel-pt-events.py +Origin: https://git.kernel.org/linus/fdf2460c297f1bb2f3bd20b3b52903b267af9050 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the intel-pt-events.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Acked-by: Adrian Hunter +Link: http://lkml.kernel.org/r/fd26acf9-0c0f-717f-9664-a3c33043ce19@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/intel-pt-events.py | 32 ++++++++++++++++----------- + 1 file changed, 19 insertions(+), 13 deletions(-) + +--- a/tools/perf/scripts/python/intel-pt-events.py ++++ b/tools/perf/scripts/python/intel-pt-events.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -22,34 +24,34 @@ sys.path.append(os.environ['PERF_EXEC_PA + #from Core import * + + def trace_begin(): +- print "Intel PT Power Events and PTWRITE" ++ print("Intel PT Power Events and PTWRITE") + + def trace_end(): +- print "End" ++ print("End") + + def trace_unhandled(event_name, context, event_fields_dict): +- print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) ++ print(' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())])) + + def print_ptwrite(raw_buf): + data = struct.unpack_from("> 32) & 0x3 +- print "hints: %#x extensions: %#x" % (hints, extensions), ++ print("hints: %#x extensions: %#x" % (hints, extensions), end=' ') + + def print_pwre(raw_buf): + data = struct.unpack_from("> 7) & 1 + cstate = (payload >> 12) & 0xf + subcstate = (payload >> 8) & 0xf +- print "hw: %u cstate: %u sub-cstate: %u" % (hw, cstate, subcstate), ++ print("hw: %u cstate: %u sub-cstate: %u" % (hw, cstate, subcstate), ++ end=' ') + + def print_exstop(raw_buf): + data = struct.unpack_from("> 4) & 0xf + wake_reason = (payload >> 8) & 0xf +- print "deepest cstate: %u last cstate: %u wake reason: %#x" % (deepest_cstate, last_cstate, wake_reason), ++ print("deepest cstate: %u last cstate: %u wake reason: %#x" % ++ (deepest_cstate, last_cstate, wake_reason), end=' ') + + def print_common_start(comm, sample, name): + ts = sample["time"] + cpu = sample["cpu"] + pid = sample["pid"] + tid = sample["tid"] +- print "%16s %5u/%-5u [%03u] %9u.%09u %7s:" % (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name), ++ print("%16s %5u/%-5u [%03u] %9u.%09u %7s:" % ++ (comm, pid, tid, cpu, ts / 1000000000, ts %1000000000, name), ++ end=' ') + + def print_common_ip(sample, symbol, dso): + ip = sample["ip"] +- print "%16x %s (%s)" % (ip, symbol, dso) ++ print("%16x %s (%s)" % (ip, symbol, dso)) + + def process_event(param_dict): + event_attr = param_dict["attr"] +@@ -92,12 +98,12 @@ def process_event(param_dict): + name = param_dict["ev_name"] + + # Symbol and dso info are not always resolved +- if (param_dict.has_key("dso")): ++ if "dso" in param_dict: + dso = param_dict["dso"] + else: + dso = "[unknown]" + +- if (param_dict.has_key("symbol")): ++ if "symbol" in param_dict: + symbol = param_dict["symbol"] + else: + symbol = "[unknown]" diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch new file mode 100644 index 000000000..3b9e39cc9 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch @@ -0,0 +1,76 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:11 -0800 +Subject: perf script python: Add Python3 support to mem-phys-addr.py +Origin: https://git.kernel.org/linus/e4d053ddb4c48cbde27b4c5edd3cc8f957684e4f +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the mem-phys-addr.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Link: http://lkml.kernel.org/r/20190222230619.17887-8-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/mem-phys-addr.py | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +--- a/tools/perf/scripts/python/mem-phys-addr.py ++++ b/tools/perf/scripts/python/mem-phys-addr.py +@@ -4,6 +4,8 @@ + # Copyright (c) 2018, Intel Corporation. + + from __future__ import division ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -31,21 +33,23 @@ def parse_iomem(): + for i, j in enumerate(f): + m = re.split('-|:',j,2) + if m[2].strip() == 'System RAM': +- system_ram.append(long(m[0], 16)) +- system_ram.append(long(m[1], 16)) ++ system_ram.append(int(m[0], 16)) ++ system_ram.append(int(m[1], 16)) + if m[2].strip() == 'Persistent Memory': +- pmem.append(long(m[0], 16)) +- pmem.append(long(m[1], 16)) ++ pmem.append(int(m[0], 16)) ++ pmem.append(int(m[1], 16)) + + def print_memory_type(): +- print "Event: %s" % (event_name) +- print "%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), +- print "%-40s %10s %10s\n" % ("----------------------------------------", \ ++ print("Event: %s" % (event_name)) ++ print("%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), end='') ++ print("%-40s %10s %10s\n" % ("----------------------------------------", + "-----------", "-----------"), ++ end=''); + total = sum(load_mem_type_cnt.values()) + for mem_type, count in sorted(load_mem_type_cnt.most_common(), \ +- key = lambda(k, v): (v, k), reverse = True): +- print "%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total), ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print("%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total), ++ end='') + + def trace_begin(): + parse_iomem() +@@ -80,7 +84,7 @@ def find_memory_type(phys_addr): + f.seek(0, 0) + for j in f: + m = re.split('-|:',j,2) +- if long(m[0], 16) <= phys_addr <= long(m[1], 16): ++ if int(m[0], 16) <= phys_addr <= int(m[1], 16): + return m[2] + return "N/A" + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch new file mode 100644 index 000000000..631a94449 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch @@ -0,0 +1,59 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:12 -0800 +Subject: perf script python: Add Python3 support to net_dropmonitor.py +Origin: https://git.kernel.org/linus/8c42b9600e561666233b9c557a5209d0dc853ba1 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the net_dropmonitor.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Acked-by: Neil Horman +Link: http://lkml.kernel.org/r/20190222230619.17887-9-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/net_dropmonitor.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/tools/perf/scripts/python/net_dropmonitor.py ++++ b/tools/perf/scripts/python/net_dropmonitor.py +@@ -1,6 +1,8 @@ + # Monitor the system for dropped packets and proudce a report of drop locations and counts + # SPDX-License-Identifier: GPL-2.0 + ++from __future__ import print_function ++ + import os + import sys + +@@ -50,19 +52,19 @@ def get_sym(sloc): + return (None, 0) + + def print_drop_table(): +- print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT") ++ print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")) + for i in drop_log.keys(): + (sym, off) = get_sym(i) + if sym == None: + sym = i +- print "%25s %25s %25s" % (sym, off, drop_log[i]) ++ print("%25s %25s %25s" % (sym, off, drop_log[i])) + + + def trace_begin(): +- print "Starting trace (Ctrl-C to dump results)" ++ print("Starting trace (Ctrl-C to dump results)") + + def trace_end(): +- print "Gathering kallsyms data" ++ print("Gathering kallsyms data") + get_kallsyms_table() + print_drop_table() + diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch new file mode 100644 index 000000000..2d501dd4c --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch @@ -0,0 +1,180 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:05 -0800 +Subject: perf script python: Add Python3 support to netdev-times.py +Origin: https://git.kernel.org/linus/02b03ec383e0c79d73aa4b402b3427a8b490ef9f +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the netdev-times.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 +version is now v2.6. + +Signed-off-by: Tony Jones +Cc: Sanagi Koki +Link: http://lkml.kernel.org/r/20190222230619.17887-2-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/netdev-times.py | 82 +++++++++++++++--------------- + 1 file changed, 42 insertions(+), 40 deletions(-) + +--- a/tools/perf/scripts/python/netdev-times.py ++++ b/tools/perf/scripts/python/netdev-times.py +@@ -8,6 +8,8 @@ + # dev=: show only thing related to specified device + # debug: work with debug mode. It shows buffer status. + ++from __future__ import print_function ++ + import os + import sys + +@@ -17,6 +19,7 @@ sys.path.append(os.environ['PERF_EXEC_PA + from perf_trace_context import * + from Core import * + from Util import * ++from functools import cmp_to_key + + all_event_list = []; # insert all tracepoint event related with this script + irq_dic = {}; # key is cpu and value is a list which stacks irqs +@@ -61,12 +64,12 @@ def diff_msec(src, dst): + def print_transmit(hunk): + if dev != 0 and hunk['dev'].find(dev) < 0: + return +- print "%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % \ ++ print("%7s %5d %6d.%06dsec %12.3fmsec %12.3fmsec" % + (hunk['dev'], hunk['len'], + nsecs_secs(hunk['queue_t']), + nsecs_nsecs(hunk['queue_t'])/1000, + diff_msec(hunk['queue_t'], hunk['xmit_t']), +- diff_msec(hunk['xmit_t'], hunk['free_t'])) ++ diff_msec(hunk['xmit_t'], hunk['free_t']))) + + # Format for displaying rx packet processing + PF_IRQ_ENTRY= " irq_entry(+%.3fmsec irq=%d:%s)" +@@ -98,55 +101,55 @@ def print_receive(hunk): + if show_hunk == 0: + return + +- print "%d.%06dsec cpu=%d" % \ +- (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu) ++ print("%d.%06dsec cpu=%d" % ++ (nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu)) + for i in range(len(irq_list)): +- print PF_IRQ_ENTRY % \ ++ print(PF_IRQ_ENTRY % + (diff_msec(base_t, irq_list[i]['irq_ent_t']), +- irq_list[i]['irq'], irq_list[i]['name']) +- print PF_JOINT ++ irq_list[i]['irq'], irq_list[i]['name'])) ++ print(PF_JOINT) + irq_event_list = irq_list[i]['event_list'] + for j in range(len(irq_event_list)): + irq_event = irq_event_list[j] + if irq_event['event'] == 'netif_rx': +- print PF_NET_RX % \ ++ print(PF_NET_RX % + (diff_msec(base_t, irq_event['time']), +- irq_event['skbaddr']) +- print PF_JOINT +- print PF_SOFT_ENTRY % \ +- diff_msec(base_t, hunk['sirq_ent_t']) +- print PF_JOINT ++ irq_event['skbaddr'])) ++ print(PF_JOINT) ++ print(PF_SOFT_ENTRY % ++ diff_msec(base_t, hunk['sirq_ent_t'])) ++ print(PF_JOINT) + event_list = hunk['event_list'] + for i in range(len(event_list)): + event = event_list[i] + if event['event_name'] == 'napi_poll': +- print PF_NAPI_POLL % \ +- (diff_msec(base_t, event['event_t']), event['dev']) ++ print(PF_NAPI_POLL % ++ (diff_msec(base_t, event['event_t']), event['dev'])) + if i == len(event_list) - 1: +- print "" ++ print("") + else: +- print PF_JOINT ++ print(PF_JOINT) + else: +- print PF_NET_RECV % \ ++ print(PF_NET_RECV % + (diff_msec(base_t, event['event_t']), event['skbaddr'], +- event['len']) ++ event['len'])) + if 'comm' in event.keys(): +- print PF_WJOINT +- print PF_CPY_DGRAM % \ ++ print(PF_WJOINT) ++ print(PF_CPY_DGRAM % + (diff_msec(base_t, event['comm_t']), +- event['pid'], event['comm']) ++ event['pid'], event['comm'])) + elif 'handle' in event.keys(): +- print PF_WJOINT ++ print(PF_WJOINT) + if event['handle'] == "kfree_skb": +- print PF_KFREE_SKB % \ ++ print(PF_KFREE_SKB % + (diff_msec(base_t, + event['comm_t']), +- event['location']) ++ event['location'])) + elif event['handle'] == "consume_skb": +- print PF_CONS_SKB % \ ++ print(PF_CONS_SKB % + diff_msec(base_t, +- event['comm_t']) +- print PF_JOINT ++ event['comm_t'])) ++ print(PF_JOINT) + + def trace_begin(): + global show_tx +@@ -172,8 +175,7 @@ def trace_begin(): + + def trace_end(): + # order all events in time +- all_event_list.sort(lambda a,b :cmp(a[EINFO_IDX_TIME], +- b[EINFO_IDX_TIME])) ++ all_event_list.sort(key=cmp_to_key(lambda a,b :a[EINFO_IDX_TIME] < b[EINFO_IDX_TIME])) + # process all events + for i in range(len(all_event_list)): + event_info = all_event_list[i] +@@ -210,19 +212,19 @@ def trace_end(): + print_receive(receive_hunk_list[i]) + # display transmit hunks + if show_tx: +- print " dev len Qdisc " \ +- " netdevice free" ++ print(" dev len Qdisc " ++ " netdevice free") + for i in range(len(tx_free_list)): + print_transmit(tx_free_list[i]) + if debug: +- print "debug buffer status" +- print "----------------------------" +- print "xmit Qdisc:remain:%d overflow:%d" % \ +- (len(tx_queue_list), of_count_tx_queue_list) +- print "xmit netdevice:remain:%d overflow:%d" % \ +- (len(tx_xmit_list), of_count_tx_xmit_list) +- print "receive:remain:%d overflow:%d" % \ +- (len(rx_skb_list), of_count_rx_skb_list) ++ print("debug buffer status") ++ print("----------------------------") ++ print("xmit Qdisc:remain:%d overflow:%d" % ++ (len(tx_queue_list), of_count_tx_queue_list)) ++ print("xmit netdevice:remain:%d overflow:%d" % ++ (len(tx_xmit_list), of_count_tx_xmit_list)) ++ print("receive:remain:%d overflow:%d" % ++ (len(rx_skb_list), of_count_rx_skb_list)) + + # called from perf, when it finds a correspoinding event + def irq__softirq_entry(name, context, cpu, sec, nsec, pid, comm, callchain, vec): diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch new file mode 100644 index 000000000..1c8fdc5a1 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch @@ -0,0 +1,87 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:13 -0800 +Subject: perf script python: Add Python3 support to powerpc-hcalls.py +Origin: https://git.kernel.org/linus/118af5bf799bd1876c3999766d1d2f845d45f019 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the powerpc-hcalls.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Cc: Ravi Bangoria +Link: http://lkml.kernel.org/r/20190222230619.17887-10-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/powerpc-hcalls.py | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/tools/perf/scripts/python/powerpc-hcalls.py ++++ b/tools/perf/scripts/python/powerpc-hcalls.py +@@ -4,6 +4,8 @@ + # + # Hypervisor call statisics + ++from __future__ import print_function ++ + import os + import sys + +@@ -149,7 +151,7 @@ hcall_table = { + } + + def hcall_table_lookup(opcode): +- if (hcall_table.has_key(opcode)): ++ if (opcode in hcall_table): + return hcall_table[opcode] + else: + return opcode +@@ -157,8 +159,8 @@ def hcall_table_lookup(opcode): + print_ptrn = '%-28s%10s%10s%10s%10s' + + def trace_end(): +- print print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)') +- print '-' * 68 ++ print(print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)')) ++ print('-' * 68) + for opcode in output: + h_name = hcall_table_lookup(opcode) + time = output[opcode]['time'] +@@ -166,14 +168,14 @@ def trace_end(): + min_t = output[opcode]['min'] + max_t = output[opcode]['max'] + +- print print_ptrn % (h_name, cnt, min_t, max_t, time/cnt) ++ print(print_ptrn % (h_name, cnt, min_t, max_t, time//cnt)) + + def powerpc__hcall_exit(name, context, cpu, sec, nsec, pid, comm, callchain, + opcode, retval): +- if (d_enter.has_key(cpu) and d_enter[cpu].has_key(opcode)): ++ if (cpu in d_enter and opcode in d_enter[cpu]): + diff = nsecs(sec, nsec) - d_enter[cpu][opcode] + +- if (output.has_key(opcode)): ++ if (opcode in output): + output[opcode]['time'] += diff + output[opcode]['cnt'] += 1 + if (output[opcode]['min'] > diff): +@@ -190,11 +192,11 @@ def powerpc__hcall_exit(name, context, c + + del d_enter[cpu][opcode] + # else: +-# print "Can't find matching hcall_enter event. Ignoring sample" ++# print("Can't find matching hcall_enter event. Ignoring sample") + + def powerpc__hcall_entry(event_name, context, cpu, sec, nsec, pid, comm, + callchain, opcode): +- if (d_enter.has_key(cpu)): ++ if (cpu in d_enter): + d_enter[cpu][opcode] = nsecs(sec, nsec) + else: + d_enter[cpu] = {opcode: nsecs(sec, nsec)} diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch new file mode 100644 index 000000000..fa90ed99a --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch @@ -0,0 +1,69 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:14 -0800 +Subject: perf script python: Add Python3 support to sctop.py +Origin: https://git.kernel.org/linus/ee75a896ae535d4219a82cc361be96394536f3ba +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the sctop.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Cc: Tom Zanussi +Link: http://lkml.kernel.org/r/20190222230619.17887-11-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/sctop.py | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +--- a/tools/perf/scripts/python/sctop.py ++++ b/tools/perf/scripts/python/sctop.py +@@ -8,7 +8,14 @@ + # will be refreshed every [interval] seconds. The default interval is + # 3 seconds. + +-import os, sys, thread, time ++from __future__ import print_function ++ ++import os, sys, time ++ ++try: ++ import thread ++except ImportError: ++ import _thread as thread + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +@@ -62,18 +69,19 @@ def print_syscall_totals(interval): + while 1: + clear_term() + if for_comm is not None: +- print "\nsyscall events for %s:\n\n" % (for_comm), ++ print("\nsyscall events for %s:\n" % (for_comm)) + else: +- print "\nsyscall events:\n\n", ++ print("\nsyscall events:\n") + +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "----------"), ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ++ ("----------------------------------------", ++ "----------")) + +- for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ ++ for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ + reverse = True): + try: +- print "%-40s %10d\n" % (syscall_name(id), val), ++ print("%-40s %10d" % (syscall_name(id), val)) + except TypeError: + pass + syscalls.clear() diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch new file mode 100644 index 000000000..ff41b4a20 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch @@ -0,0 +1,45 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:15 -0800 +Subject: perf script python: Add Python3 support to stackcollapse.py +Origin: https://git.kernel.org/linus/6d22d9991cf37edfe861569e2433342ad56206a7 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the stackcollapse.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Cc: Paolo Bonzini +Link: http://lkml.kernel.org/r/20190222230619.17887-12-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/stackcollapse.py | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/tools/perf/scripts/python/stackcollapse.py ++++ b/tools/perf/scripts/python/stackcollapse.py +@@ -19,6 +19,8 @@ + # Written by Paolo Bonzini + # Based on Brendan Gregg's stackcollapse-perf.pl script. + ++from __future__ import print_function ++ + import os + import sys + from collections import defaultdict +@@ -120,7 +122,6 @@ def process_event(param_dict): + lines[stack_string] = lines[stack_string] + 1 + + def trace_end(): +- list = lines.keys() +- list.sort() ++ list = sorted(lines) + for stack in list: +- print "%s %d" % (stack, lines[stack]) ++ print("%s %d" % (stack, lines[stack])) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch new file mode 100644 index 000000000..8ef6fa8b5 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch @@ -0,0 +1,61 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:16 -0800 +Subject: perf script python: Add Python3 support to stat-cpi.py +Origin: https://git.kernel.org/linus/e985bf761db7646cebcd236249da08bd264069de +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the stat-cpi.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Seeteena Thoufeek +Cc: Jiri Olsa +Link: http://lkml.kernel.org/r/20190222230619.17887-13-tonyj@suse.de +Signed-off-by: Tony Jones +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/stat-cpi.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/tools/perf/scripts/python/stat-cpi.py ++++ b/tools/perf/scripts/python/stat-cpi.py +@@ -1,6 +1,8 @@ + #!/usr/bin/env python + # SPDX-License-Identifier: GPL-2.0 + ++from __future__ import print_function ++ + data = {} + times = [] + threads = [] +@@ -20,8 +22,8 @@ def store_key(time, cpu, thread): + threads.append(thread) + + def store(time, event, cpu, thread, val, ena, run): +- #print "event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" % \ +- # (event, cpu, thread, time, val, ena, run) ++ #print("event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" % ++ # (event, cpu, thread, time, val, ena, run)) + + store_key(time, cpu, thread) + key = get_key(time, event, cpu, thread) +@@ -59,7 +61,7 @@ def stat__interval(time): + if ins != 0: + cpi = cyc/float(ins) + +- print "%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins) ++ print("%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins)) + + def trace_end(): + pass +@@ -75,4 +77,4 @@ def trace_end(): + # if ins != 0: + # cpi = cyc/float(ins) + # +-# print "time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi) ++# print("time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi)) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch new file mode 100644 index 000000000..9dc84ceac --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch @@ -0,0 +1,74 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:18 -0800 +Subject: perf script python: Add Python3 support to + syscall-counts-by-pid.py +Origin: https://git.kernel.org/linus/de667cce7f4f96b6e22da8fd9c065b961f355080 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the syscall-counts-by-pid.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Link: http://lkml.kernel.org/r/20190222230619.17887-15-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/syscall-counts-by-pid.py | 22 +++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +--- a/tools/perf/scripts/python/syscall-counts-by-pid.py ++++ b/tools/perf/scripts/python/syscall-counts-by-pid.py +@@ -5,6 +5,8 @@ + # Displays system-wide system call totals, broken down by syscall. + # If a [comm] arg is specified, only syscalls called by [comm] are displayed. + ++from __future__ import print_function ++ + import os, sys + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +@@ -31,7 +33,7 @@ if len(sys.argv) > 1: + syscalls = autodict() + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + print_syscall_totals() +@@ -55,20 +57,20 @@ def syscalls__sys_enter(event_name, cont + + def print_syscall_totals(): + if for_comm is not None: +- print "\nsyscall events for %s:\n\n" % (for_comm), ++ print("\nsyscall events for %s:\n" % (for_comm)) + else: +- print "\nsyscall events by comm/pid:\n\n", ++ print("\nsyscall events by comm/pid:\n") + +- print "%-40s %10s\n" % ("comm [pid]/syscalls", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "----------"), ++ print("%-40s %10s" % ("comm [pid]/syscalls", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "----------")) + + comm_keys = syscalls.keys() + for comm in comm_keys: + pid_keys = syscalls[comm].keys() + for pid in pid_keys: +- print "\n%s [%d]\n" % (comm, pid), ++ print("\n%s [%d]" % (comm, pid)) + id_keys = syscalls[comm][pid].keys() +- for id, val in sorted(syscalls[comm][pid].iteritems(), \ +- key = lambda(k, v): (v, k), reverse = True): +- print " %-38s %10d\n" % (syscall_name(id), val), ++ for id, val in sorted(syscalls[comm][pid].items(), \ ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" %-38s %10d" % (syscall_name(id), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch new file mode 100644 index 000000000..59c654479 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch @@ -0,0 +1,65 @@ +From: Tony Jones +Date: Fri, 22 Feb 2019 15:06:17 -0800 +Subject: perf script python: Add Python3 support to syscall-counts.py +Origin: https://git.kernel.org/linus/1d1b0dbb859d175eb512a9f0e1ca7e44bd0192cd +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the syscall-counts.py script + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones +Link: http://lkml.kernel.org/r/20190222230619.17887-14-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/syscall-counts.py | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/tools/perf/scripts/python/syscall-counts.py ++++ b/tools/perf/scripts/python/syscall-counts.py +@@ -5,6 +5,8 @@ + # Displays system-wide system call totals, broken down by syscall. + # If a [comm] arg is specified, only syscalls called by [comm] are displayed. + ++from __future__ import print_function ++ + import os + import sys + +@@ -28,7 +30,7 @@ if len(sys.argv) > 1: + syscalls = autodict() + + def trace_begin(): +- print "Press control+C to stop and show the summary" ++ print("Press control+C to stop and show the summary") + + def trace_end(): + print_syscall_totals() +@@ -51,14 +53,14 @@ def syscalls__sys_enter(event_name, cont + + def print_syscall_totals(): + if for_comm is not None: +- print "\nsyscall events for %s:\n\n" % (for_comm), ++ print("\nsyscall events for %s:\n" % (for_comm)) + else: +- print "\nsyscall events:\n\n", ++ print("\nsyscall events:\n") + +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "-----------"), ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "-----------")) + +- for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ ++ for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ + reverse = True): +- print "%-40s %10d\n" % (syscall_name(id), val), ++ print("%-40s %10d" % (syscall_name(id), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch b/debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch new file mode 100644 index 000000000..b18ceaea8 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Remove-mixed-indentation.patch @@ -0,0 +1,511 @@ +From: Tony Jones +Date: Fri, 1 Mar 2019 17:18:57 -0800 +Subject: perf script python: Remove mixed indentation +Origin: https://git.kernel.org/linus/b504d7f6876515b74c8e27a44ccdb22372616d97 +Bug-Debian: https://bugs.debian.org/944641 + +Remove mixed indentation in Python scripts. Revert to either all tabs +(most common form) or all spaces (4 or 8) depending on what was the +intent of the original commit. This is necessary to complete Python3 +support as it will flag an error if it encounters mixed indentation. + +Signed-off-by: Tony Jones +Link: http://lkml.kernel.org/r/20190302011903.2416-2-tonyj@suse.de +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/check-perf-trace.py | 69 +++++++++----------- + tools/perf/scripts/python/compaction-times.py | 8 +- + tools/perf/scripts/python/event_analyzing_sample.py | 6 - + tools/perf/scripts/python/failed-syscalls-by-pid.py | 34 ++++----- + tools/perf/scripts/python/futex-contention.py | 2 + tools/perf/scripts/python/intel-pt-events.py | 28 ++++---- + tools/perf/scripts/python/mem-phys-addr.py | 7 +- + tools/perf/scripts/python/net_dropmonitor.py | 2 + tools/perf/scripts/python/netdev-times.py | 12 ++- + tools/perf/scripts/python/sched-migration.py | 6 - + tools/perf/scripts/python/sctop.py | 13 ++- + tools/perf/scripts/python/stackcollapse.py | 2 + tools/perf/scripts/python/syscall-counts-by-pid.py | 47 ++++++------- + tools/perf/scripts/python/syscall-counts.py | 27 +++---- + 14 files changed, 132 insertions(+), 131 deletions(-) + +--- a/tools/perf/scripts/python/check-perf-trace.py ++++ b/tools/perf/scripts/python/check-perf-trace.py +@@ -23,60 +23,59 @@ def trace_begin(): + pass + + def trace_end(): +- print_unhandled() ++ print_unhandled() + + def irq__softirq_entry(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, vec): +- print_header(event_name, common_cpu, common_secs, common_nsecs, +- common_pid, common_comm) ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, vec): ++ print_header(event_name, common_cpu, common_secs, common_nsecs, ++ common_pid, common_comm) + +- print_uncommon(context) ++ print_uncommon(context) + +- print "vec=%s\n" % \ +- (symbol_str("irq__softirq_entry", "vec", vec)), ++ print "vec=%s\n" % (symbol_str("irq__softirq_entry", "vec", vec)), + + def kmem__kmalloc(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, call_site, ptr, bytes_req, bytes_alloc, +- gfp_flags): +- print_header(event_name, common_cpu, common_secs, common_nsecs, +- common_pid, common_comm) ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, call_site, ptr, bytes_req, bytes_alloc, ++ gfp_flags): ++ print_header(event_name, common_cpu, common_secs, common_nsecs, ++ common_pid, common_comm) + +- print_uncommon(context) ++ print_uncommon(context) + +- print "call_site=%u, ptr=%u, bytes_req=%u, " \ ++ print "call_site=%u, ptr=%u, bytes_req=%u, " \ + "bytes_alloc=%u, gfp_flags=%s\n" % \ + (call_site, ptr, bytes_req, bytes_alloc, +- + flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), + + def trace_unhandled(event_name, context, event_fields_dict): +- try: +- unhandled[event_name] += 1 +- except TypeError: +- unhandled[event_name] = 1 ++ try: ++ unhandled[event_name] += 1 ++ except TypeError: ++ unhandled[event_name] = 1 + + def print_header(event_name, cpu, secs, nsecs, pid, comm): + print "%-20s %5u %05u.%09u %8u %-20s " % \ +- (event_name, cpu, secs, nsecs, pid, comm), ++ (event_name, cpu, secs, nsecs, pid, comm), + + # print trace fields not included in handler args + def print_uncommon(context): +- print "common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, " \ +- % (common_pc(context), trace_flag_str(common_flags(context)), \ +- common_lock_depth(context)) ++ print "common_preempt_count=%d, common_flags=%s, " \ ++ "common_lock_depth=%d, " % \ ++ (common_pc(context), trace_flag_str(common_flags(context)), ++ common_lock_depth(context)) + + def print_unhandled(): +- keys = unhandled.keys() +- if not keys: +- return +- +- print "\nunhandled events:\n\n", +- +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "-----------"), ++ keys = unhandled.keys() ++ if not keys: ++ return ++ ++ print "\nunhandled events:\n\n", ++ ++ print "%-40s %10s\n" % ("event", "count"), ++ print "%-40s %10s\n" % ("----------------------------------------", \ ++ "-----------"), + +- for event_name in keys: +- print "%-40s %10d\n" % (event_name, unhandled[event_name]) ++ for event_name in keys: ++ print "%-40s %10d\n" % (event_name, unhandled[event_name]) +--- a/tools/perf/scripts/python/compaction-times.py ++++ b/tools/perf/scripts/python/compaction-times.py +@@ -216,15 +216,15 @@ def compaction__mm_compaction_migratepag + pair(nr_migrated, nr_failed), None, None) + + def compaction__mm_compaction_isolate_freepages(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): + + chead.increment_pending(common_pid, + None, pair(nr_scanned, nr_taken), None) + + def compaction__mm_compaction_isolate_migratepages(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, start_pfn, end_pfn, nr_scanned, nr_taken): + + chead.increment_pending(common_pid, + None, None, pair(nr_scanned, nr_taken)) +--- a/tools/perf/scripts/python/event_analyzing_sample.py ++++ b/tools/perf/scripts/python/event_analyzing_sample.py +@@ -37,7 +37,7 @@ con = sqlite3.connect("/dev/shm/perf.db" + con.isolation_level = None + + def trace_begin(): +- print "In trace_begin:\n" ++ print "In trace_begin:\n" + + # + # Will create several tables at the start, pebs_ll is for PEBS data with +@@ -102,7 +102,7 @@ def insert_db(event): + event.ip, event.status, event.dse, event.dla, event.lat)) + + def trace_end(): +- print "In trace_end:\n" ++ print "In trace_end:\n" + # We show the basic info for the 2 type of event classes + show_general_events() + show_pebs_ll() +@@ -187,4 +187,4 @@ def show_pebs_ll(): + print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) + + def trace_unhandled(event_name, context, event_fields_dict): +- print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) ++ print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) +--- a/tools/perf/scripts/python/failed-syscalls-by-pid.py ++++ b/tools/perf/scripts/python/failed-syscalls-by-pid.py +@@ -58,22 +58,22 @@ def syscalls__sys_exit(event_name, conte + raw_syscalls__sys_exit(**locals()) + + def print_error_totals(): +- if for_comm is not None: +- print("\nsyscall errors for %s:\n" % (for_comm)) +- else: +- print("\nsyscall errors:\n") ++ if for_comm is not None: ++ print("\nsyscall errors for %s:\n" % (for_comm)) ++ else: ++ print("\nsyscall errors:\n") + +- print("%-30s %10s" % ("comm [pid]", "count")) +- print("%-30s %10s" % ("------------------------------", "----------")) ++ print("%-30s %10s" % ("comm [pid]", "count")) ++ print("%-30s %10s" % ("------------------------------", "----------")) + +- comm_keys = syscalls.keys() +- for comm in comm_keys: +- pid_keys = syscalls[comm].keys() +- for pid in pid_keys: +- print("\n%s [%d]" % (comm, pid)) +- id_keys = syscalls[comm][pid].keys() +- for id in id_keys: +- print(" syscall: %-16s" % syscall_name(id)) +- ret_keys = syscalls[comm][pid][id].keys() +- for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): +- print(" err = %-20s %10d" % (strerror(ret), val)) ++ comm_keys = syscalls.keys() ++ for comm in comm_keys: ++ pid_keys = syscalls[comm].keys() ++ for pid in pid_keys: ++ print("\n%s [%d]" % (comm, pid)) ++ id_keys = syscalls[comm][pid].keys() ++ for id in id_keys: ++ print(" syscall: %-16s" % syscall_name(id)) ++ ret_keys = syscalls[comm][pid][id].keys() ++ for ret, val in sorted(syscalls[comm][pid][id].items(), key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" err = %-20s %10d" % (strerror(ret), val)) +--- a/tools/perf/scripts/python/futex-contention.py ++++ b/tools/perf/scripts/python/futex-contention.py +@@ -46,5 +46,5 @@ def trace_end(): + for (tid, lock) in lock_waits: + min, max, avg, count = lock_waits[tid, lock] + print "%s[%d] lock %x contended %d times, %d avg ns" % \ +- (process_names[tid], tid, lock, count, avg) ++ (process_names[tid], tid, lock, count, avg) + +--- a/tools/perf/scripts/python/intel-pt-events.py ++++ b/tools/perf/scripts/python/intel-pt-events.py +@@ -85,22 +85,22 @@ def print_common_ip(sample, symbol, dso) + print "%16x %s (%s)" % (ip, symbol, dso) + + def process_event(param_dict): +- event_attr = param_dict["attr"] +- sample = param_dict["sample"] +- raw_buf = param_dict["raw_buf"] +- comm = param_dict["comm"] +- name = param_dict["ev_name"] ++ event_attr = param_dict["attr"] ++ sample = param_dict["sample"] ++ raw_buf = param_dict["raw_buf"] ++ comm = param_dict["comm"] ++ name = param_dict["ev_name"] + +- # Symbol and dso info are not always resolved +- if (param_dict.has_key("dso")): +- dso = param_dict["dso"] +- else: +- dso = "[unknown]" ++ # Symbol and dso info are not always resolved ++ if (param_dict.has_key("dso")): ++ dso = param_dict["dso"] ++ else: ++ dso = "[unknown]" + +- if (param_dict.has_key("symbol")): +- symbol = param_dict["symbol"] +- else: +- symbol = "[unknown]" ++ if (param_dict.has_key("symbol")): ++ symbol = param_dict["symbol"] ++ else: ++ symbol = "[unknown]" + + if name == "ptwrite": + print_common_start(comm, sample, name) +--- a/tools/perf/scripts/python/mem-phys-addr.py ++++ b/tools/perf/scripts/python/mem-phys-addr.py +@@ -44,12 +44,13 @@ def print_memory_type(): + print("%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), end='') + print("%-40s %10s %10s\n" % ("----------------------------------------", + "-----------", "-----------"), +- end=''); ++ end=''); + total = sum(load_mem_type_cnt.values()) + for mem_type, count in sorted(load_mem_type_cnt.most_common(), \ + key = lambda kv: (kv[1], kv[0]), reverse = True): +- print("%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total), +- end='') ++ print("%-40s %10d %10.1f%%\n" % ++ (mem_type, count, 100 * count / total), ++ end='') + + def trace_begin(): + parse_iomem() +--- a/tools/perf/scripts/python/net_dropmonitor.py ++++ b/tools/perf/scripts/python/net_dropmonitor.py +@@ -7,7 +7,7 @@ import os + import sys + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') ++ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + + from perf_trace_context import * + from Core import * +--- a/tools/perf/scripts/python/netdev-times.py ++++ b/tools/perf/scripts/python/netdev-times.py +@@ -124,14 +124,16 @@ def print_receive(hunk): + event = event_list[i] + if event['event_name'] == 'napi_poll': + print(PF_NAPI_POLL % +- (diff_msec(base_t, event['event_t']), event['dev'])) ++ (diff_msec(base_t, event['event_t']), ++ event['dev'])) + if i == len(event_list) - 1: + print("") + else: + print(PF_JOINT) + else: + print(PF_NET_RECV % +- (diff_msec(base_t, event['event_t']), event['skbaddr'], ++ (diff_msec(base_t, event['event_t']), ++ event['skbaddr'], + event['len'])) + if 'comm' in event.keys(): + print(PF_WJOINT) +@@ -256,7 +258,7 @@ def irq__irq_handler_exit(name, context, + all_event_list.append(event_info) + + def napi__napi_poll(name, context, cpu, sec, nsec, pid, comm, callchain, napi, +- dev_name, work=None, budget=None): ++ dev_name, work=None, budget=None): + event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, + napi, dev_name, work, budget) + all_event_list.append(event_info) +@@ -353,7 +355,7 @@ def handle_irq_softirq_exit(event_info): + if irq_list == [] or event_list == 0: + return + rec_data = {'sirq_ent_t':sirq_ent_t, 'sirq_ext_t':time, +- 'irq_list':irq_list, 'event_list':event_list} ++ 'irq_list':irq_list, 'event_list':event_list} + # merge information realted to a NET_RX softirq + receive_hunk_list.append(rec_data) + +@@ -390,7 +392,7 @@ def handle_netif_receive_skb(event_info) + skbaddr, skblen, dev_name) = event_info + if cpu in net_rx_dic.keys(): + rec_data = {'event_name':'netif_receive_skb', +- 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} ++ 'event_t':time, 'skbaddr':skbaddr, 'len':skblen} + event_list = net_rx_dic[cpu]['event_list'] + event_list.append(rec_data) + rx_skb_list.insert(0, rec_data) +--- a/tools/perf/scripts/python/sched-migration.py ++++ b/tools/perf/scripts/python/sched-migration.py +@@ -16,10 +16,10 @@ import sys + + from collections import defaultdict + try: +- from UserList import UserList ++ from UserList import UserList + except ImportError: +- # Python 3: UserList moved to the collections package +- from collections import UserList ++ # Python 3: UserList moved to the collections package ++ from collections import UserList + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +--- a/tools/perf/scripts/python/sctop.py ++++ b/tools/perf/scripts/python/sctop.py +@@ -13,9 +13,9 @@ from __future__ import print_function + import os, sys, time + + try: +- import thread ++ import thread + except ImportError: +- import _thread as thread ++ import _thread as thread + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +@@ -75,11 +75,12 @@ def print_syscall_totals(interval): + + print("%-40s %10s" % ("event", "count")) + print("%-40s %10s" % +- ("----------------------------------------", +- "----------")) ++ ("----------------------------------------", ++ "----------")) + +- for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ +- reverse = True): ++ for id, val in sorted(syscalls.items(), ++ key = lambda kv: (kv[1], kv[0]), ++ reverse = True): + try: + print("%-40s %10d" % (syscall_name(id), val)) + except TypeError: +--- a/tools/perf/scripts/python/stackcollapse.py ++++ b/tools/perf/scripts/python/stackcollapse.py +@@ -27,7 +27,7 @@ from collections import defaultdict + from optparse import OptionParser, make_option + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +- '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') ++ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + + from perf_trace_context import * + from Core import * +--- a/tools/perf/scripts/python/syscall-counts-by-pid.py ++++ b/tools/perf/scripts/python/syscall-counts-by-pid.py +@@ -39,11 +39,10 @@ def trace_end(): + print_syscall_totals() + + def raw_syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, id, args): +- ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, id, args): + if (for_comm and common_comm != for_comm) or \ +- (for_pid and common_pid != for_pid ): ++ (for_pid and common_pid != for_pid ): + return + try: + syscalls[common_comm][common_pid][id] += 1 +@@ -51,26 +50,26 @@ def raw_syscalls__sys_enter(event_name, + syscalls[common_comm][common_pid][id] = 1 + + def syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- id, args): ++ common_secs, common_nsecs, common_pid, common_comm, ++ id, args): + raw_syscalls__sys_enter(**locals()) + + def print_syscall_totals(): +- if for_comm is not None: +- print("\nsyscall events for %s:\n" % (for_comm)) +- else: +- print("\nsyscall events by comm/pid:\n") +- +- print("%-40s %10s" % ("comm [pid]/syscalls", "count")) +- print("%-40s %10s" % ("----------------------------------------", +- "----------")) +- +- comm_keys = syscalls.keys() +- for comm in comm_keys: +- pid_keys = syscalls[comm].keys() +- for pid in pid_keys: +- print("\n%s [%d]" % (comm, pid)) +- id_keys = syscalls[comm][pid].keys() +- for id, val in sorted(syscalls[comm][pid].items(), \ +- key = lambda kv: (kv[1], kv[0]), reverse = True): +- print(" %-38s %10d" % (syscall_name(id), val)) ++ if for_comm is not None: ++ print("\nsyscall events for %s:\n" % (for_comm)) ++ else: ++ print("\nsyscall events by comm/pid:\n") ++ ++ print("%-40s %10s" % ("comm [pid]/syscalls", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "----------")) ++ ++ comm_keys = syscalls.keys() ++ for comm in comm_keys: ++ pid_keys = syscalls[comm].keys() ++ for pid in pid_keys: ++ print("\n%s [%d]" % (comm, pid)) ++ id_keys = syscalls[comm][pid].keys() ++ for id, val in sorted(syscalls[comm][pid].items(), ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print(" %-38s %10d" % (syscall_name(id), val)) +--- a/tools/perf/scripts/python/syscall-counts.py ++++ b/tools/perf/scripts/python/syscall-counts.py +@@ -36,8 +36,8 @@ def trace_end(): + print_syscall_totals() + + def raw_syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- common_callchain, id, args): ++ common_secs, common_nsecs, common_pid, common_comm, ++ common_callchain, id, args): + if for_comm is not None: + if common_comm != for_comm: + return +@@ -47,20 +47,19 @@ def raw_syscalls__sys_enter(event_name, + syscalls[id] = 1 + + def syscalls__sys_enter(event_name, context, common_cpu, +- common_secs, common_nsecs, common_pid, common_comm, +- id, args): ++ common_secs, common_nsecs, common_pid, common_comm, id, args): + raw_syscalls__sys_enter(**locals()) + + def print_syscall_totals(): +- if for_comm is not None: +- print("\nsyscall events for %s:\n" % (for_comm)) +- else: +- print("\nsyscall events:\n") ++ if for_comm is not None: ++ print("\nsyscall events for %s:\n" % (for_comm)) ++ else: ++ print("\nsyscall events:\n") + +- print("%-40s %10s" % ("event", "count")) +- print("%-40s %10s" % ("----------------------------------------", +- "-----------")) ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "-----------")) + +- for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ +- reverse = True): +- print("%-40s %10d" % (syscall_name(id), val)) ++ for id, val in sorted(syscalls.items(), ++ key = lambda kv: (kv[1], kv[0]), reverse = True): ++ print("%-40s %10d" % (syscall_name(id), val)) diff --git a/debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch b/debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch new file mode 100644 index 000000000..066e2a396 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch @@ -0,0 +1,105 @@ +From: Tony Jones +Date: Fri, 1 Mar 2019 17:18:59 -0800 +Subject: perf script python: add Python3 support to +Origin: https://git.kernel.org/linus/57e604b16362273af6a517abaa6cd1133a7fc732 +Bug-Debian: https://bugs.debian.org/944641 + check-perf-trace.py + +Support both Python 2 and Python 3 in the check-perf-trace.py script. + +There may be differences in the ordering of output lines due to +differences in dictionary ordering etc. However the format within lines +should be unchanged. + +The use of from __future__ implies the minimum supported version of +Python2 is now v2.6 + +Signed-off-by: Tony Jones +Cc: Tom Zanussi +Link: http://lkml.kernel.org/r/20190302011903.2416-4-tonyj@suse.de +Signed-off-by: Seeteena Thoufeek +Signed-off-by: Arnaldo Carvalho de Melo +--- + tools/perf/scripts/python/check-perf-trace.py | 31 ++++++++++++++------------ + 1 file changed, 17 insertions(+), 14 deletions(-) + +--- a/tools/perf/scripts/python/check-perf-trace.py ++++ b/tools/perf/scripts/python/check-perf-trace.py +@@ -7,6 +7,8 @@ + # events, etc. Basically, if this script runs successfully and + # displays expected results, Python scripting support should be ok. + ++from __future__ import print_function ++ + import os + import sys + +@@ -19,7 +21,7 @@ from perf_trace_context import * + unhandled = autodict() + + def trace_begin(): +- print "trace_begin" ++ print("trace_begin") + pass + + def trace_end(): +@@ -33,7 +35,7 @@ def irq__softirq_entry(event_name, conte + + print_uncommon(context) + +- print "vec=%s\n" % (symbol_str("irq__softirq_entry", "vec", vec)), ++ print("vec=%s" % (symbol_str("irq__softirq_entry", "vec", vec))) + + def kmem__kmalloc(event_name, context, common_cpu, + common_secs, common_nsecs, common_pid, common_comm, +@@ -44,10 +46,10 @@ def kmem__kmalloc(event_name, context, c + + print_uncommon(context) + +- print "call_site=%u, ptr=%u, bytes_req=%u, " \ +- "bytes_alloc=%u, gfp_flags=%s\n" % \ ++ print("call_site=%u, ptr=%u, bytes_req=%u, " ++ "bytes_alloc=%u, gfp_flags=%s" % + (call_site, ptr, bytes_req, bytes_alloc, +- flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), ++ flag_str("kmem__kmalloc", "gfp_flags", gfp_flags))) + + def trace_unhandled(event_name, context, event_fields_dict): + try: +@@ -56,26 +58,27 @@ def trace_unhandled(event_name, context, + unhandled[event_name] = 1 + + def print_header(event_name, cpu, secs, nsecs, pid, comm): +- print "%-20s %5u %05u.%09u %8u %-20s " % \ ++ print("%-20s %5u %05u.%09u %8u %-20s " % + (event_name, cpu, secs, nsecs, pid, comm), ++ end=' ') + + # print trace fields not included in handler args + def print_uncommon(context): +- print "common_preempt_count=%d, common_flags=%s, " \ +- "common_lock_depth=%d, " % \ ++ print("common_preempt_count=%d, common_flags=%s, " ++ "common_lock_depth=%d, " % + (common_pc(context), trace_flag_str(common_flags(context)), +- common_lock_depth(context)) ++ common_lock_depth(context))) + + def print_unhandled(): + keys = unhandled.keys() + if not keys: + return + +- print "\nunhandled events:\n\n", ++ print("\nunhandled events:\n") + +- print "%-40s %10s\n" % ("event", "count"), +- print "%-40s %10s\n" % ("----------------------------------------", \ +- "-----------"), ++ print("%-40s %10s" % ("event", "count")) ++ print("%-40s %10s" % ("----------------------------------------", ++ "-----------")) + + for event_name in keys: +- print "%-40s %10d\n" % (event_name, unhandled[event_name]) ++ print("%-40s %10d\n" % (event_name, unhandled[event_name])) diff --git a/debian/patches/series b/debian/patches/series index 3f2ff81f2..30324d471 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -181,6 +181,23 @@ bugfix/x86/tools-turbostat-Add-checks-for-failure-of-fgets-and-.patch bugfix/all/libbpf-add-soname-to-shared-object.patch bugfix/all/libbpf-link-shared-object-with-libelf.patch bugfix/all/libbpf-generate-pkg-config.patch +bugfix/all/perf-script-python-Add-Python3-support-to-netdev-tim.patch +bugfix/all/perf-script-python-Add-Python3-support-to-failed-sys.patch +bugfix/all/perf-script-python-Add-Python3-support-to-mem-phys-a.patch +bugfix/all/perf-script-python-Add-Python3-support-to-net_dropmo.patch +bugfix/all/perf-script-python-Add-Python3-support-to-powerpc-hc.patch +bugfix/all/perf-script-python-Add-Python3-support-to-sctop.py.patch +bugfix/all/perf-script-python-Add-Python3-support-to-stackcolla.patch +bugfix/all/perf-script-python-Add-Python3-support-to-stat-cpi.p.patch +bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co.patch +bugfix/all/perf-script-python-Add-Python3-support-to-syscall-co-de667cce7f4f.patch +bugfix/all/perf-script-python-Remove-mixed-indentation.patch +bugfix/all/perf-script-python-Add-Python3-support-to-futex-cont.patch +bugfix/all/perf-script-python-add-Python3-support-to-check-perf.patch +bugfix/all/perf-script-python-Add-Python3-support-to-event_anal.patch +bugfix/all/perf-script-python-Add-Python3-support-to-intel-pt-e.patch +bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch +bugfix/all/perf-script-python-Add-Python3-support-to-export-to-ebf6c5c181ab.patch # wireless: Disable regulatory.db direct loading (until we sort out signing) debian/wireless-disable-regulatory.db-direct-loading.patch