Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a0609c0 authored by Len Brown's avatar Len Brown
Browse files

tools/power turbostat: allow sub-sec intervals



turbostat -i interval_sec

will sample and display statistics every interval_sec.
interval_sec used to be a whole number of seconds,
but now we accept a decimal, as small as 0.001 sec (1 ms).

Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent f0057310
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ name as necessary to disambiguate it from others is necessary. Note that option
\fB--debug\fP displays additional system configuration information.  Invoking this parameter
more than once may also enable internal turbostat debug information.
.PP
\fB--interval seconds\fP overrides the default 5-second measurement interval.
\fB--interval seconds\fP overrides the default 5.0 second measurement interval.
.PP
\fB--help\fP displays usage for the most common parameters.
.PP
+16 −4
Original line number Diff line number Diff line
@@ -38,12 +38,13 @@
#include <string.h>
#include <ctype.h>
#include <sched.h>
#include <time.h>
#include <cpuid.h>
#include <linux/capability.h>
#include <errno.h>

char *proc_stat = "/proc/stat";
unsigned int interval_sec = 5;
struct timespec interval_ts = {5, 0};
unsigned int debug;
unsigned int rapl_joules;
unsigned int summary_only;
@@ -1728,7 +1729,7 @@ void turbostat_loop()
			re_initialize();
			goto restart;
		}
		sleep(interval_sec);
		nanosleep(&interval_ts, NULL);
		retval = for_all_cpus(get_counters, ODD_COUNTERS);
		if (retval < -1) {
			exit(retval);
@@ -1742,7 +1743,7 @@ void turbostat_loop()
		compute_average(EVEN_COUNTERS);
		format_all_counters(EVEN_COUNTERS);
		flush_stdout();
		sleep(interval_sec);
		nanosleep(&interval_ts, NULL);
		retval = for_all_cpus(get_counters, EVEN_COUNTERS);
		if (retval < -1) {
			exit(retval);
@@ -3347,7 +3348,18 @@ void cmdline(int argc, char **argv)
			help();
			exit(1);
		case 'i':
			interval_sec = atoi(optarg);
			{
				double interval = strtod(optarg, NULL);

				if (interval < 0.001) {
					fprintf(stderr, "interval %f seconds is too small\n",
						interval);
					exit(2);
				}

				interval_ts.tv_sec = interval;
				interval_ts.tv_nsec = (interval - interval_ts.tv_sec) * 1000000000;
			}
			break;
		case 'J':
			rapl_joules++;