summaryrefslogtreecommitdiffstats
path: root/tools/power
diff options
context:
space:
mode:
authorDoug Smythies <doug.smythies@gmail.com>2018-05-04 09:46:22 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-05-17 04:19:34 -0400
commit35459105deb26430653a7299a86bc66fb4dd5773 (patch)
treeb1c4b47fabf5b73c8d2af0c2633648d56f56daa0 /tools/power
parent67b8d5c7081221efa252e111cd52532ec6d4266f (diff)
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 <dsmythies@telus.net> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'tools/power')
-rwxr-xr-xtools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py54
1 files changed, 35 insertions, 19 deletions
diff --git a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py
index 29f50d4cfea0..84e2b648e622 100755
--- a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py
+++ b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py
@@ -28,6 +28,7 @@ import subprocess
28import os 28import os
29import time 29import time
30import re 30import re
31import signal
31import sys 32import sys
32import getopt 33import getopt
33import Gnuplot 34import Gnuplot
@@ -78,11 +79,12 @@ def print_help():
78 print(' Or') 79 print(' Or')
79 print(' ./intel_pstate_tracer.py [--cpu cpus] ---trace_file <trace_file> --name <test_name>') 80 print(' ./intel_pstate_tracer.py [--cpu cpus] ---trace_file <trace_file> --name <test_name>')
80 print(' To generate trace file, parse and plot, use (sudo required):') 81 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>')
82 print(' Or') 83 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>')
84 print(' Optional argument:') 85 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')
86 print(' Output:') 88 print(' Output:')
87 print(' If not already present, creates a "results/test_name" folder in the current working directory with:') 89 print(' If not already present, creates a "results/test_name" folder in the current working directory with:')
88 print(' cpu.csv - comma seperated values file with trace contents and some additional calculations.') 90 print(' cpu.csv - comma seperated values file with trace contents and some additional calculations.')
@@ -379,7 +381,7 @@ def clear_trace_file():
379 f_handle.close() 381 f_handle.close()
380 except: 382 except:
381 print('IO error clearing trace file ') 383 print('IO error clearing trace file ')
382 quit() 384 sys.exit(2)
383 385
384def enable_trace(): 386def enable_trace():
385 """ Enable trace """ 387 """ Enable trace """
@@ -389,7 +391,7 @@ def enable_trace():
389 , 'w').write("1") 391 , 'w').write("1")
390 except: 392 except:
391 print('IO error enabling trace ') 393 print('IO error enabling trace ')
392 quit() 394 sys.exit(2)
393 395
394def disable_trace(): 396def disable_trace():
395 """ Disable trace """ 397 """ Disable trace """
@@ -399,17 +401,17 @@ def disable_trace():
399 , 'w').write("0") 401 , 'w').write("0")
400 except: 402 except:
401 print('IO error disabling trace ') 403 print('IO error disabling trace ')
402 quit() 404 sys.exit(2)
403 405
404def set_trace_buffer_size(): 406def set_trace_buffer_size():
405 """ Set trace buffer size """ 407 """ Set trace buffer size """
406 408
407 try: 409 try:
408 open('/sys/kernel/debug/tracing/buffer_size_kb' 410 with open('/sys/kernel/debug/tracing/buffer_size_kb', 'w') as fp:
409 , 'w').write("10240") 411 fp.write(memory)
410 except: 412 except:
411 print('IO error setting trace buffer size ') 413 print('IO error setting trace buffer size ')
412 quit() 414 sys.exit(2)
413 415
414def free_trace_buffer(): 416def free_trace_buffer():
415 """ Free the trace buffer memory """ 417 """ Free the trace buffer memory """
@@ -418,8 +420,8 @@ def free_trace_buffer():
418 open('/sys/kernel/debug/tracing/buffer_size_kb' 420 open('/sys/kernel/debug/tracing/buffer_size_kb'
419 , 'w').write("1") 421 , 'w').write("1")
420 except: 422 except:
421 print('IO error setting trace buffer size ') 423 print('IO error freeing trace buffer ')
422 quit() 424 sys.exit(2)
423 425
424def read_trace_data(filename): 426def read_trace_data(filename):
425 """ Read and parse trace data """ 427 """ Read and parse trace data """
@@ -431,7 +433,7 @@ def read_trace_data(filename):
431 data = open(filename, 'r').read() 433 data = open(filename, 'r').read()
432 except: 434 except:
433 print('Error opening ', filename) 435 print('Error opening ', filename)
434 quit() 436 sys.exit(2)
435 437
436 for line in data.splitlines(): 438 for line in data.splitlines():
437 search_obj = \ 439 search_obj = \
@@ -489,10 +491,22 @@ def read_trace_data(filename):
489# Now seperate the main overall csv file into per CPU csv files. 491# Now seperate the main overall csv file into per CPU csv files.
490 split_csv() 492 split_csv()
491 493
494def 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
503signal.signal(signal.SIGINT, signal_handler)
504
492interval = "" 505interval = ""
493filename = "" 506filename = ""
494cpu_list = "" 507cpu_list = ""
495testname = "" 508testname = ""
509memory = "10240"
496graph_data_present = False; 510graph_data_present = False;
497 511
498valid1 = False 512valid1 = False
@@ -501,7 +515,7 @@ valid2 = False
501cpu_mask = zeros((MAX_CPUS,), dtype=int) 515cpu_mask = zeros((MAX_CPUS,), dtype=int)
502 516
503try: 517try:
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="])
505except getopt.GetoptError: 519except getopt.GetoptError:
506 print_help() 520 print_help()
507 sys.exit(2) 521 sys.exit(2)
@@ -521,6 +535,8 @@ for opt, arg in opts:
521 elif opt in ("-n", "--name"): 535 elif opt in ("-n", "--name"):
522 valid2 = True 536 valid2 = True
523 testname = arg 537 testname = arg
538 elif opt in ("-m", "--memory"):
539 memory = arg
524 540
525if not (valid1 and valid2): 541if not (valid1 and valid2):
526 print_help() 542 print_help()
@@ -569,6 +585,11 @@ current_max_cpu = 0
569 585
570read_trace_data(filename) 586read_trace_data(filename)
571 587
588clear_trace_file()
589# Free the memory
590if interval:
591 free_trace_buffer()
592
572if graph_data_present == False: 593if graph_data_present == False:
573 print('No valid data to plot') 594 print('No valid data to plot')
574 sys.exit(2) 595 sys.exit(2)
@@ -593,9 +614,4 @@ for root, dirs, files in os.walk('.'):
593 for f in files: 614 for f in files:
594 fix_ownership(f) 615 fix_ownership(f)
595 616
596clear_trace_file()
597# Free the memory
598if interval:
599 free_trace_buffer()
600
601os.chdir('../../') 617os.chdir('../../')