104 lines
3.8 KiB
Diff
104 lines
3.8 KiB
Diff
|
From 36b9aa5a8e071ac6349d2d7f9c23a25abcdc316d Mon Sep 17 00:00:00 2001
|
||
|
From: Adam Duskett <aduskett@gmail.com>
|
||
|
Date: Tue, 2 Nov 2021 10:30:55 -0700
|
||
|
Subject: [PATCH] pmu-query.py: fix python3 errors, add linux platform support
|
||
|
|
||
|
Unfortuantly, commit 0212b382624c744491a845c75dfb2a527d4a821f broke pmu-query
|
||
|
in some unexpected ways.
|
||
|
|
||
|
First, urllib.request.urlopen returns a bytes-object in Python3, which results
|
||
|
in the csv.DictReader throwing the error: `TypeError: initial_value must be
|
||
|
str or None, not HTTPResponse` A simple .read().decode('utf-8') appended to
|
||
|
the end of urlopen fixes the error.
|
||
|
|
||
|
Second, passing the map_file_raw string to DictReader results in a malformed
|
||
|
dictionary. Fix this by wrapping the raw text string in io.StringIO().
|
||
|
|
||
|
Third: During the python2 -> python3 refactoring, I accidentally switched some
|
||
|
logic in the pull request. `if core_path != ''` changed to `if not core_path`,
|
||
|
which breaks the logic, the same goes for
|
||
|
`if offcore_path != ''` -> `if not offcore_path`. Change these to
|
||
|
`if core_path` and `if offcore_path` respectively.
|
||
|
|
||
|
From upstream commit: 7a670261c2063595f2330e6cc2a7f19eb18b6ea8
|
||
|
|
||
|
Signed-off-by: Adam Duskett <aduskett@gmail.com>
|
||
|
---
|
||
|
pmu-query.py | 20 ++++++++++++++------
|
||
|
1 file changed, 14 insertions(+), 6 deletions(-)
|
||
|
|
||
|
diff --git a/pmu-query.py b/pmu-query.py
|
||
|
index 5595819..bc1e57b 100755
|
||
|
--- a/pmu-query.py
|
||
|
+++ b/pmu-query.py
|
||
|
@@ -1,4 +1,5 @@
|
||
|
#!/usr/bin/env python3
|
||
|
+import io
|
||
|
import urllib.request
|
||
|
import urllib.parse
|
||
|
import json
|
||
|
@@ -8,6 +9,7 @@ import sys
|
||
|
import platform
|
||
|
import getopt
|
||
|
import re
|
||
|
+import shutil
|
||
|
|
||
|
all_flag = False
|
||
|
download_flag = False
|
||
|
@@ -29,8 +31,8 @@ except getopt.GetoptError as err:
|
||
|
sys.exit(-2)
|
||
|
|
||
|
if filename is None:
|
||
|
- map_file_raw = urllib.request.urlopen("https://download.01.org/perfmon/mapfile.csv")
|
||
|
- map_dict = csv.DictReader(map_file_raw)
|
||
|
+ map_file_raw = urllib.request.urlopen("https://download.01.org/perfmon/mapfile.csv").read().decode('utf-8')
|
||
|
+ map_dict = csv.DictReader(io.StringIO(map_file_raw), delimiter=',')
|
||
|
map_file = []
|
||
|
core_path = ""
|
||
|
offcore_path = ""
|
||
|
@@ -45,20 +47,26 @@ if filename is None:
|
||
|
p = subprocess.Popen(["./pcm-core.exe -c"], stdout=subprocess.PIPE, shell=True)
|
||
|
elif platform.system() == "Windows":
|
||
|
p = subprocess.Popen(["pcm-core.exe", "-c"], stdout=subprocess.PIPE, shell=True)
|
||
|
+ elif platform.system() == "Linux":
|
||
|
+ pcm_core = shutil.which("pcm-core")
|
||
|
+ if not pcm_core:
|
||
|
+ print("Could not find pcm-core executable!")
|
||
|
+ sys.exit(-1)
|
||
|
+ p = subprocess.Popen([pcm_core, "-c"], stdout=subprocess.PIPE, shell=True)
|
||
|
else:
|
||
|
p = subprocess.Popen(["./pcm-core.x -c"], stdout=subprocess.PIPE, shell=True)
|
||
|
|
||
|
(output, err) = p.communicate()
|
||
|
p_status = p.wait()
|
||
|
for model in map_file:
|
||
|
- if re.search(model["Family-model"], output):
|
||
|
+ if re.search(model["Family-model"], output.decode("utf-8")):
|
||
|
if model["EventType"] == "core":
|
||
|
core_path = model["Filename"]
|
||
|
elif model["EventType"] == "offcore":
|
||
|
offcore_path = model["Filename"]
|
||
|
print(model)
|
||
|
|
||
|
- if not core_path:
|
||
|
+ if core_path:
|
||
|
json_core_data = urllib.request.urlopen(
|
||
|
"https://download.01.org/perfmon" + core_path
|
||
|
)
|
||
|
@@ -67,10 +75,10 @@ if filename is None:
|
||
|
with open(core_path.split("/")[-1], "w") as outfile:
|
||
|
json.dump(core_events, outfile, sort_keys=True, indent=4)
|
||
|
else:
|
||
|
- print("no core event found for %s CPU, program abort..." % output)
|
||
|
+ print("no core event found for %s CPU, program abort..." % output.decode("utf-8"))
|
||
|
sys.exit(-1)
|
||
|
|
||
|
- if not offcore_path:
|
||
|
+ if offcore_path:
|
||
|
json_offcore_data = urllib.request.urlopen(
|
||
|
"https://download.01.org/perfmon" + offcore_path
|
||
|
)
|
||
|
--
|
||
|
2.32.0
|
||
|
|