lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YiG1Ppe/wFfvuuPH@amd.com>
Date:   Fri, 4 Mar 2022 14:44:14 +0800
From:   Huang Rui <ray.huang@....com>
To:     "Su, Jinzhou (Joe)" <Jinzhou.Su@....com>
Cc:     "rjw@...ysocki.net" <rjw@...ysocki.net>,
        "linux-pm@...r.kernel.org" <linux-pm@...r.kernel.org>,
        "srinivas.pandruvada@...ux.intel.com" 
        <srinivas.pandruvada@...ux.intel.com>,
        "dsmythies@...us.net" <dsmythies@...us.net>,
        "viresh.kumar@...aro.org" <viresh.kumar@...aro.org>,
        "todd.e.brandt@...ux.intel.com" <todd.e.brandt@...ux.intel.com>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
        "Sharma, Deepak" <Deepak.Sharma@....com>,
        "Deucher, Alexander" <Alexander.Deucher@....com>,
        "Du, Xiaojian" <Xiaojian.Du@....com>,
        "Yuan, Perry" <Perry.Yuan@....com>,
        "Meng, Li (Jassmine)" <Li.Meng@....com>
Subject: Re: [PATCH V2 2/4] tools/power/x86/intel_pstate_tracer: make tracer
 as a module

On Fri, Mar 04, 2022 at 02:07:22PM +0800, Su, Jinzhou (Joe) wrote:
> Make intel_pstate_tracer as a module. Other trace event can import
> this module to analyze their trace data.
> 
> Signed-off-by: Jinzhou Su <Jinzhou.Su@....com>
> Acked-by: Doug Smythies <dsmythies@...us.net>

Reviewed-by: Huang Rui <ray.huang@....com>

> ---
>  .../intel_pstate_tracer.py                    | 260 +++++++++---------
>  1 file changed, 129 insertions(+), 131 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 e15e20696d17..b46e9eb8f5aa 100755
> --- a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py
> +++ b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py
> @@ -63,7 +63,7 @@ C_USEC = 3
>  C_SEC = 2
>  C_CPU = 1
>  
> -global sample_num, last_sec_cpu, last_usec_cpu, start_time, testname
> +global sample_num, last_sec_cpu, last_usec_cpu, start_time, testname, trace_file
>  
>  # 11 digits covers uptime to 115 days
>  getcontext().prec = 11
> @@ -72,17 +72,17 @@ sample_num =0
>  last_sec_cpu = [0] * MAX_CPUS
>  last_usec_cpu = [0] * MAX_CPUS
>  
> -def print_help():
> -    print('intel_pstate_tracer.py:')
> +def print_help(driver_name):
> +    print('%s_tracer.py:'%driver_name)
>      print('  Usage:')
>      print('    If the trace file is available, then to simply parse and plot, use (sudo not required):')
> -    print('      ./intel_pstate_tracer.py [-c cpus] -t <trace_file> -n <test_name>')
> +    print('      ./%s_tracer.py [-c cpus] -t <trace_file> -n <test_name>'%driver_name)
>      print('    Or')
> -    print('      ./intel_pstate_tracer.py [--cpu cpus] ---trace_file <trace_file> --name <test_name>')
> +    print('      ./%s_tracer.py [--cpu cpus] ---trace_file <trace_file> --name <test_name>'%driver_name)
>      print('    To generate trace file, parse and plot, use (sudo required):')
> -    print('      sudo ./intel_pstate_tracer.py [-c cpus] -i <interval> -n <test_name> -m <kbytes>')
> +    print('      sudo ./%s_tracer.py [-c cpus] -i <interval> -n <test_name> -m <kbytes>'%driver_name)
>      print('    Or')
> -    print('      sudo ./intel_pstate_tracer.py [--cpu cpus] --interval <interval> --name <test_name> --memory <kbytes>')
> +    print('      sudo ./%s_tracer.py [--cpu cpus] --interval <interval> --name <test_name> --memory <kbytes>'%driver_name)
>      print('    Optional argument:')
>      print('      cpus:   comma separated list of CPUs')
>      print('      kbytes: Kilo bytes of memory per CPU to allocate to the trace buffer. Default: 10240')
> @@ -323,7 +323,7 @@ def set_4_plot_linestyles(g_plot):
>      g_plot('set style line 3 linetype 1 linecolor rgb "purple" pointtype -1')
>      g_plot('set style line 4 linetype 1 linecolor rgb "blue" pointtype -1')
>  
> -def store_csv(cpu_int, time_pre_dec, time_post_dec, core_busy, scaled, _from, _to, mperf, aperf, tsc, freq_ghz, io_boost, common_comm, load, duration_ms, sample_num, elapsed_time, tsc_ghz):
> +def store_csv(cpu_int, time_pre_dec, time_post_dec, core_busy, scaled, _from, _to, mperf, aperf, tsc, freq_ghz, io_boost, common_comm, load, duration_ms, sample_num, elapsed_time, tsc_ghz, cpu_mask):
>      """ Store master csv file information """
>  
>      global graph_data_present
> @@ -342,11 +342,9 @@ def store_csv(cpu_int, time_pre_dec, time_post_dec, core_busy, scaled, _from, _t
>  
>      graph_data_present = True;
>  
> -def split_csv():
> +def split_csv(current_max_cpu, cpu_mask):
>      """ seperate the all csv file into per CPU csv files. """
>  
> -    global current_max_cpu
> -
>      if os.path.exists('cpu.csv'):
>          for index in range(0, current_max_cpu + 1):
>              if cpu_mask[int(index)] != 0:
> @@ -381,27 +379,25 @@ def clear_trace_file():
>          print('IO error clearing trace file ')
>          sys.exit(2)
>  
> -def enable_trace():
> +def enable_trace(trace_file):
>      """ Enable trace """
>  
>      try:
> -       open('/sys/kernel/debug/tracing/events/power/pstate_sample/enable'
> -                 , 'w').write("1")
> +        open(trace_file,'w').write("1")
>      except:
>          print('IO error enabling trace ')
>          sys.exit(2)
>  
> -def disable_trace():
> +def disable_trace(trace_file):
>      """ Disable trace """
>  
>      try:
> -       open('/sys/kernel/debug/tracing/events/power/pstate_sample/enable'
> -                 , 'w').write("0")
> +       open(trace_file, 'w').write("0")
>      except:
>          print('IO error disabling trace ')
>          sys.exit(2)
>  
> -def set_trace_buffer_size():
> +def set_trace_buffer_size(memory):
>      """ Set trace buffer size """
>  
>      try:
> @@ -421,7 +417,7 @@ def free_trace_buffer():
>          print('IO error freeing trace buffer ')
>          sys.exit(2)
>  
> -def read_trace_data(filename):
> +def read_trace_data(filename, cpu_mask):
>      """ Read and parse trace data """
>  
>      global current_max_cpu
> @@ -481,135 +477,137 @@ def read_trace_data(filename):
>                  tsc_ghz = Decimal(0)
>                  if duration_ms != Decimal(0) :
>                      tsc_ghz = Decimal(tsc)/duration_ms/Decimal(1000000)
> -                store_csv(cpu_int, time_pre_dec, time_post_dec, core_busy, scaled, _from, _to, mperf, aperf, tsc, freq_ghz, io_boost, common_comm, load, duration_ms, sample_num, elapsed_time, tsc_ghz)
> +                store_csv(cpu_int, time_pre_dec, time_post_dec, core_busy, scaled, _from, _to, mperf, aperf, tsc, freq_ghz, io_boost, common_comm, load, duration_ms, sample_num, elapsed_time, tsc_ghz, cpu_mask)
>  
>              if cpu_int > current_max_cpu:
>                  current_max_cpu = cpu_int
>  # End of for each trace line loop
>  # Now seperate the main overall csv file into per CPU csv files.
> -    split_csv()
> +    split_csv(current_max_cpu, cpu_mask)
>  
>  def signal_handler(signal, frame):
>      print(' SIGINT: Forcing cleanup before exit.')
>      if interval:
> -        disable_trace()
> +        disable_trace(trace_file)
>          clear_trace_file()
>          # Free the memory
>          free_trace_buffer()
>          sys.exit(0)
>  
> -signal.signal(signal.SIGINT, signal_handler)
> +if __name__ == "__main__":
> +    trace_file = "/sys/kernel/debug/tracing/events/power/pstate_sample/enable"
> +    signal.signal(signal.SIGINT, signal_handler)
>  
> -interval = ""
> -filename = ""
> -cpu_list = ""
> -testname = ""
> -memory = "10240"
> -graph_data_present = False;
> +    interval = ""
> +    filename = ""
> +    cpu_list = ""
> +    testname = ""
> +    memory = "10240"
> +    graph_data_present = False;
>  
> -valid1 = False
> -valid2 = False
> +    valid1 = False
> +    valid2 = False
>  
> -cpu_mask = zeros((MAX_CPUS,), dtype=int)
> +    cpu_mask = zeros((MAX_CPUS,), dtype=int)
>  
> -try:
> -    opts, args = getopt.getopt(sys.argv[1:],"ht:i:c:n:m:",["help","trace_file=","interval=","cpu=","name=","memory="])
> -except getopt.GetoptError:
> -    print_help()
> -    sys.exit(2)
> -for opt, arg in opts:
> -    if opt == '-h':
> -        print()
> +    try:
> +        opts, args = getopt.getopt(sys.argv[1:],"ht:i:c:n:m:",["help","trace_file=","interval=","cpu=","name=","memory="])
> +    except getopt.GetoptError:
> +        print_help('intel_pstate')
> +        sys.exit(2)
> +    for opt, arg in opts:
> +        if opt == '-h':
> +            print_help('intel_pstate')
> +            sys.exit()
> +        elif opt in ("-t", "--trace_file"):
> +            valid1 = True
> +            location = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
> +            filename = os.path.join(location, arg)
> +        elif opt in ("-i", "--interval"):
> +            valid1 = True
> +            interval = arg
> +        elif opt in ("-c", "--cpu"):
> +            cpu_list = arg
> +        elif opt in ("-n", "--name"):
> +            valid2 = True
> +            testname = arg
> +        elif opt in ("-m", "--memory"):
> +            memory = arg
> +
> +    if not (valid1 and valid2):
> +        print_help('intel_pstate')
>          sys.exit()
> -    elif opt in ("-t", "--trace_file"):
> -        valid1 = True
> -        location = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
> -        filename = os.path.join(location, arg)
> -    elif opt in ("-i", "--interval"):
> -        valid1 = True
> -        interval = arg
> -    elif opt in ("-c", "--cpu"):
> -        cpu_list = arg
> -    elif opt in ("-n", "--name"):
> -        valid2 = True
> -        testname = arg
> -    elif opt in ("-m", "--memory"):
> -        memory = arg
> -
> -if not (valid1 and valid2):
> -    print_help()
> -    sys.exit()
> -
> -if cpu_list:
> -    for p in re.split("[,]", cpu_list):
> -        if int(p) < MAX_CPUS :
> -            cpu_mask[int(p)] = 1
> -else:
> -    for i in range (0, MAX_CPUS):
> -        cpu_mask[i] = 1
> -
> -if not os.path.exists('results'):
> -    os.mkdir('results')
> +
> +    if cpu_list:
> +        for p in re.split("[,]", cpu_list):
> +            if int(p) < MAX_CPUS :
> +                cpu_mask[int(p)] = 1
> +    else:
> +        for i in range (0, MAX_CPUS):
> +            cpu_mask[i] = 1
> +
> +    if not os.path.exists('results'):
> +        os.mkdir('results')
> +        # The regular user needs to own the directory, not root.
> +        fix_ownership('results')
> +
> +    os.chdir('results')
> +    if os.path.exists(testname):
> +        print('The test name directory already exists. Please provide a unique test name. Test re-run not supported, yet.')
> +        sys.exit()
> +    os.mkdir(testname)
>      # The regular user needs to own the directory, not root.
> -    fix_ownership('results')
> -
> -os.chdir('results')
> -if os.path.exists(testname):
> -    print('The test name directory already exists. Please provide a unique test name. Test re-run not supported, yet.')
> -    sys.exit()
> -os.mkdir(testname)
> -# The regular user needs to own the directory, not root.
> -fix_ownership(testname)
> -os.chdir(testname)
> -
> -# Temporary (or perhaps not)
> -cur_version = sys.version_info
> -print('python version (should be >= 2.7):')
> -print(cur_version)
> -
> -# Left as "cleanup" for potential future re-run ability.
> -cleanup_data_files()
> -
> -if interval:
> -    filename = "/sys/kernel/debug/tracing/trace"
> -    clear_trace_file()
> -    set_trace_buffer_size()
> -    enable_trace()
> -    print('Sleeping for ', interval, 'seconds')
> -    time.sleep(int(interval))
> -    disable_trace()
> -
> -current_max_cpu = 0
> -
> -read_trace_data(filename)
> -
> -if interval:
> -    clear_trace_file()
> -    # Free the memory
> -    free_trace_buffer()
> -
> -if graph_data_present == False:
> -    print('No valid data to plot')
> -    sys.exit(2)
> -
> -for cpu_no in range(0, current_max_cpu + 1):
> -    plot_perf_busy_with_sample(cpu_no)
> -    plot_perf_busy(cpu_no)
> -    plot_durations(cpu_no)
> -    plot_loads(cpu_no)
> -
> -plot_pstate_cpu_with_sample()
> -plot_pstate_cpu()
> -plot_load_cpu()
> -plot_frequency_cpu()
> -plot_duration_cpu()
> -plot_scaled_cpu()
> -plot_boost_cpu()
> -plot_ghz_cpu()
> -
> -# It is preferrable, but not necessary, that the regular user owns the files, not root.
> -for root, dirs, files in os.walk('.'):
> -    for f in files:
> -        fix_ownership(f)
> -
> -os.chdir('../../')
> +    fix_ownership(testname)
> +    os.chdir(testname)
> +
> +    # Temporary (or perhaps not)
> +    cur_version = sys.version_info
> +    print('python version (should be >= 2.7):')
> +    print(cur_version)
> +
> +    # Left as "cleanup" for potential future re-run ability.
> +    cleanup_data_files()
> +
> +    if interval:
> +        filename = "/sys/kernel/debug/tracing/trace"
> +        clear_trace_file()
> +        set_trace_buffer_size(memory)
> +        enable_trace(trace_file)
> +        print('Sleeping for ', interval, 'seconds')
> +        time.sleep(int(interval))
> +        disable_trace(trace_file)
> +
> +    current_max_cpu = 0
> +
> +    read_trace_data(filename, cpu_mask)
> +
> +    if interval:
> +        clear_trace_file()
> +        # Free the memory
> +        free_trace_buffer()
> +
> +    if graph_data_present == False:
> +        print('No valid data to plot')
> +        sys.exit(2)
> +
> +    for cpu_no in range(0, current_max_cpu + 1):
> +        plot_perf_busy_with_sample(cpu_no)
> +        plot_perf_busy(cpu_no)
> +        plot_durations(cpu_no)
> +        plot_loads(cpu_no)
> +
> +    plot_pstate_cpu_with_sample()
> +    plot_pstate_cpu()
> +    plot_load_cpu()
> +    plot_frequency_cpu()
> +    plot_duration_cpu()
> +    plot_scaled_cpu()
> +    plot_boost_cpu()
> +    plot_ghz_cpu()
> +
> +    # It is preferrable, but not necessary, that the regular user owns the files, not root.
> +    for root, dirs, files in os.walk('.'):
> +        for f in files:
> +            fix_ownership(f)
> +
> +    os.chdir('../../')
> -- 
> 2.27.0
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ