tools/power turbostat: if --num_iterations, print for specific number of iterations
authorChen Yu <yu.c.chen@intel.com>
Thu, 26 Apr 2018 00:41:03 +0000 (08:41 +0800)
committerLen Brown <len.brown@intel.com>
Sat, 2 Jun 2018 03:12:45 +0000 (23:12 -0400)
There's a use case during test to only print specific round of iterations
if --num_iterations is specified, for example, with this patch applied:

turbostat -i 5 -n 4
will capture 4 samples with 5 seconds interval.

[lenb: renamed to --num_iterations from --iterations]

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
Reviewed-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
tools/power/x86/turbostat/turbostat.8
tools/power/x86/turbostat/turbostat.c

index 4cffa4a5a2b715f416746164fb05c84572e75d58..ca9ef70176249294644a1beeea2b141086cfe75c 100644 (file)
@@ -67,6 +67,8 @@ The column name "all" can be used to enable all disabled-by-default built-in cou
 .PP
 \fB--interval seconds\fP overrides the default 5.0 second measurement interval.
 .PP
+\fB--num_iterations num\fP number of the measurement iterations.
+.PP
 \fB--out output_file\fP turbostat output is written to the specified output_file.
 The file is truncated if it already exists, and it is created if it does not exist.
 .PP
index 1cb38c12a8b54e8142d385d27428712ee738399e..6910773e85a9bcc72ebedd6501519e2b6567d7d8 100644 (file)
@@ -51,6 +51,7 @@ int *fd_percpu;
 struct timeval interval_tv = {5, 0};
 struct timespec interval_ts = {5, 0};
 struct timespec one_msec = {0, 1000000};
+unsigned int num_iterations;
 unsigned int debug;
 unsigned int quiet;
 unsigned int shown;
@@ -496,6 +497,7 @@ void help(void)
        "--interval sec.subsec  Override default 5-second measurement interval\n"
        "--help         print this help message\n"
        "--list         list column headers only\n"
+       "--num_iterations num   number of the measurement iterations\n"
        "--out file     create or truncate \"file\" for all output\n"
        "--version      print version information\n"
        "\n"
@@ -2763,6 +2765,7 @@ void turbostat_loop()
 {
        int retval;
        int restarted = 0;
+       int done_iters = 0;
 
        setup_signal_handler();
 
@@ -2781,6 +2784,7 @@ restart:
                goto restart;
        }
        restarted = 0;
+       done_iters = 0;
        gettimeofday(&tv_even, (struct timezone *)NULL);
 
        while (1) {
@@ -2809,6 +2813,8 @@ restart:
                flush_output_stdout();
                if (exit_requested)
                        break;
+               if (num_iterations && ++done_iters >= num_iterations)
+                       break;
                do_sleep();
                if (snapshot_proc_sysfs_files())
                        goto restart;
@@ -2830,6 +2836,8 @@ restart:
                flush_output_stdout();
                if (exit_requested)
                        break;
+               if (num_iterations && ++done_iters >= num_iterations)
+                       break;
        }
 }
 
@@ -5212,6 +5220,7 @@ void cmdline(int argc, char **argv)
                {"debug",       no_argument,            0, 'd'},        /* internal, not documented */
                {"enable",      required_argument,      0, 'e'},
                {"interval",    required_argument,      0, 'i'},
+               {"num_iterations",      required_argument,      0, 'n'},
                {"help",        no_argument,            0, 'h'},
                {"hide",        required_argument,      0, 'H'},        // meh, -h taken by --help
                {"Joules",      no_argument,            0, 'J'},
@@ -5227,7 +5236,7 @@ void cmdline(int argc, char **argv)
 
        progname = argv[0];
 
-       while ((opt = getopt_long_only(argc, argv, "+C:c:Dde:hi:Jo:qST:v",
+       while ((opt = getopt_long_only(argc, argv, "+C:c:Dde:hi:Jn:o:qST:v",
                                long_options, &option_index)) != -1) {
                switch (opt) {
                case 'a':
@@ -5287,6 +5296,15 @@ void cmdline(int argc, char **argv)
                case 'q':
                        quiet = 1;
                        break;
+               case 'n':
+                       num_iterations = strtod(optarg, NULL);
+
+                       if (num_iterations <= 0) {
+                               fprintf(outf, "iterations %d should be positive number\n",
+                                       num_iterations);
+                               exit(2);
+                       }
+                       break;
                case 's':
                        /*
                         * --show: show only those specified