Skip to content

Commit 3545910

Browse files
Doug Smythiesrafaeljw
authored andcommitted
tools/power/x86/intel_pstate_tracer: Add optional setting of trace buffer memory allocation
Allow the user to override the default trace buffer memory allocation by adding a command line option to override the default. The patch also: Adds a SIGINT (i.e. CTRL C exit) handler, so that things can be cleaned up before exit. Moves the postion of some other cleanup from after to before the potential "No valid data to plot" exit. Replaces all quit() calls with sys.exit, because quit() is not supposed to be used in scripts. Signed-off-by: Doug Smythies <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 67b8d5c commit 3545910

File tree

1 file changed

+35
-19
lines changed

1 file changed

+35
-19
lines changed

tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import os
2929
import time
3030
import re
31+
import signal
3132
import sys
3233
import getopt
3334
import Gnuplot
@@ -78,11 +79,12 @@ def print_help():
7879
print(' Or')
7980
print(' ./intel_pstate_tracer.py [--cpu cpus] ---trace_file <trace_file> --name <test_name>')
8081
print(' To generate trace file, parse and plot, use (sudo required):')
81-
print(' sudo ./intel_pstate_tracer.py [-c cpus] -i <interval> -n <test_name>')
82+
print(' sudo ./intel_pstate_tracer.py [-c cpus] -i <interval> -n <test_name> -m <kbytes>')
8283
print(' Or')
83-
print(' sudo ./intel_pstate_tracer.py [--cpu cpus] --interval <interval> --name <test_name>')
84+
print(' sudo ./intel_pstate_tracer.py [--cpu cpus] --interval <interval> --name <test_name> --memory <kbytes>')
8485
print(' Optional argument:')
85-
print(' cpus: comma separated list of CPUs')
86+
print(' cpus: comma separated list of CPUs')
87+
print(' kbytes: Kilo bytes of memory per CPU to allocate to the trace buffer. Default: 10240')
8688
print(' Output:')
8789
print(' If not already present, creates a "results/test_name" folder in the current working directory with:')
8890
print(' cpu.csv - comma seperated values file with trace contents and some additional calculations.')
@@ -379,7 +381,7 @@ def clear_trace_file():
379381
f_handle.close()
380382
except:
381383
print('IO error clearing trace file ')
382-
quit()
384+
sys.exit(2)
383385

384386
def enable_trace():
385387
""" Enable trace """
@@ -389,7 +391,7 @@ def enable_trace():
389391
, 'w').write("1")
390392
except:
391393
print('IO error enabling trace ')
392-
quit()
394+
sys.exit(2)
393395

394396
def disable_trace():
395397
""" Disable trace """
@@ -399,17 +401,17 @@ def disable_trace():
399401
, 'w').write("0")
400402
except:
401403
print('IO error disabling trace ')
402-
quit()
404+
sys.exit(2)
403405

404406
def set_trace_buffer_size():
405407
""" Set trace buffer size """
406408

407409
try:
408-
open('/sys/kernel/debug/tracing/buffer_size_kb'
409-
, 'w').write("10240")
410+
with open('/sys/kernel/debug/tracing/buffer_size_kb', 'w') as fp:
411+
fp.write(memory)
410412
except:
411-
print('IO error setting trace buffer size ')
412-
quit()
413+
print('IO error setting trace buffer size ')
414+
sys.exit(2)
413415

414416
def free_trace_buffer():
415417
""" Free the trace buffer memory """
@@ -418,8 +420,8 @@ def free_trace_buffer():
418420
open('/sys/kernel/debug/tracing/buffer_size_kb'
419421
, 'w').write("1")
420422
except:
421-
print('IO error setting trace buffer size ')
422-
quit()
423+
print('IO error freeing trace buffer ')
424+
sys.exit(2)
423425

424426
def read_trace_data(filename):
425427
""" Read and parse trace data """
@@ -431,7 +433,7 @@ def read_trace_data(filename):
431433
data = open(filename, 'r').read()
432434
except:
433435
print('Error opening ', filename)
434-
quit()
436+
sys.exit(2)
435437

436438
for line in data.splitlines():
437439
search_obj = \
@@ -489,10 +491,22 @@ def read_trace_data(filename):
489491
# Now seperate the main overall csv file into per CPU csv files.
490492
split_csv()
491493

494+
def signal_handler(signal, frame):
495+
print(' SIGINT: Forcing cleanup before exit.')
496+
if interval:
497+
disable_trace()
498+
clear_trace_file()
499+
# Free the memory
500+
free_trace_buffer()
501+
sys.exit(0)
502+
503+
signal.signal(signal.SIGINT, signal_handler)
504+
492505
interval = ""
493506
filename = ""
494507
cpu_list = ""
495508
testname = ""
509+
memory = "10240"
496510
graph_data_present = False;
497511

498512
valid1 = False
@@ -501,7 +515,7 @@ def read_trace_data(filename):
501515
cpu_mask = zeros((MAX_CPUS,), dtype=int)
502516

503517
try:
504-
opts, args = getopt.getopt(sys.argv[1:],"ht:i:c:n:",["help","trace_file=","interval=","cpu=","name="])
518+
opts, args = getopt.getopt(sys.argv[1:],"ht:i:c:n:m:",["help","trace_file=","interval=","cpu=","name=","memory="])
505519
except getopt.GetoptError:
506520
print_help()
507521
sys.exit(2)
@@ -521,6 +535,8 @@ def read_trace_data(filename):
521535
elif opt in ("-n", "--name"):
522536
valid2 = True
523537
testname = arg
538+
elif opt in ("-m", "--memory"):
539+
memory = arg
524540

525541
if not (valid1 and valid2):
526542
print_help()
@@ -569,6 +585,11 @@ def read_trace_data(filename):
569585

570586
read_trace_data(filename)
571587

588+
clear_trace_file()
589+
# Free the memory
590+
if interval:
591+
free_trace_buffer()
592+
572593
if graph_data_present == False:
573594
print('No valid data to plot')
574595
sys.exit(2)
@@ -593,9 +614,4 @@ def read_trace_data(filename):
593614
for f in files:
594615
fix_ownership(f)
595616

596-
clear_trace_file()
597-
# Free the memory
598-
if interval:
599-
free_trace_buffer()
600-
601617
os.chdir('../../')

0 commit comments

Comments
 (0)