Skip to content

Commit d91bb17

Browse files
committed
tools/power turbostat: graceful fail on garbage input
When invald MSR's are specified on the command line, turbostat should simply print an error and exit. Signed-off-by: Len Brown <len.brown@intel.com>
1 parent 39300ff commit d91bb17

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

tools/power/x86/turbostat/turbostat.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,10 @@ int get_msr(int cpu, off_t offset, unsigned long long *msr)
206206
retval = pread(fd, msr, sizeof *msr, offset);
207207
close(fd);
208208

209-
if (retval != sizeof *msr)
209+
if (retval != sizeof *msr) {
210+
fprintf(stderr, "%s offset 0x%zx read failed\n", pathname, offset);
210211
return -1;
212+
}
211213

212214
return 0;
213215
}
@@ -1101,7 +1103,9 @@ void turbostat_loop()
11011103

11021104
restart:
11031105
retval = for_all_cpus(get_counters, EVEN_COUNTERS);
1104-
if (retval) {
1106+
if (retval < -1) {
1107+
exit(retval);
1108+
} else if (retval == -1) {
11051109
re_initialize();
11061110
goto restart;
11071111
}
@@ -1114,7 +1118,9 @@ void turbostat_loop()
11141118
}
11151119
sleep(interval_sec);
11161120
retval = for_all_cpus(get_counters, ODD_COUNTERS);
1117-
if (retval) {
1121+
if (retval < -1) {
1122+
exit(retval);
1123+
} else if (retval == -1) {
11181124
re_initialize();
11191125
goto restart;
11201126
}
@@ -1126,7 +1132,9 @@ void turbostat_loop()
11261132
flush_stdout();
11271133
sleep(interval_sec);
11281134
retval = for_all_cpus(get_counters, EVEN_COUNTERS);
1129-
if (retval) {
1135+
if (retval < -1) {
1136+
exit(retval);
1137+
} else if (retval == -1) {
11301138
re_initialize();
11311139
goto restart;
11321140
}
@@ -1545,8 +1553,11 @@ void turbostat_init()
15451553
int fork_it(char **argv)
15461554
{
15471555
pid_t child_pid;
1556+
int status;
15481557

1549-
for_all_cpus(get_counters, EVEN_COUNTERS);
1558+
status = for_all_cpus(get_counters, EVEN_COUNTERS);
1559+
if (status)
1560+
exit(status);
15501561
/* clear affinity side-effect of get_counters() */
15511562
sched_setaffinity(0, cpu_present_setsize, cpu_present_set);
15521563
gettimeofday(&tv_even, (struct timezone *)NULL);
@@ -1556,7 +1567,6 @@ int fork_it(char **argv)
15561567
/* child */
15571568
execvp(argv[0], argv);
15581569
} else {
1559-
int status;
15601570

15611571
/* parent */
15621572
if (child_pid == -1) {
@@ -1568,7 +1578,7 @@ int fork_it(char **argv)
15681578
signal(SIGQUIT, SIG_IGN);
15691579
if (waitpid(child_pid, &status, 0) == -1) {
15701580
perror("wait");
1571-
exit(1);
1581+
exit(status);
15721582
}
15731583
}
15741584
/*
@@ -1585,7 +1595,7 @@ int fork_it(char **argv)
15851595

15861596
fprintf(stderr, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec/1000000.0);
15871597

1588-
return 0;
1598+
return status;
15891599
}
15901600

15911601
void cmdline(int argc, char **argv)

0 commit comments

Comments
 (0)