diff options
| author | Len Brown <len.brown@intel.com> | 2012-11-08 22:38:05 -0500 | 
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2012-11-27 00:03:06 -0500 | 
| commit | e52966c084f9d9ea12be2ac7df801d610d4a19a5 (patch) | |
| tree | 4ea59e63067349ce8671cdcf7fe06a62c0b1933b /tools/power | |
| parent | 3fc808aaa052dec7b155f3242c6c0eabf0c49127 (diff) | |
| download | linux-e52966c084f9d9ea12be2ac7df801d610d4a19a5.tar.bz2 | |
tools/power turbostat: prevent infinite loop on migration error path
Turbostat assumed if it can't migrate to a CPU, then the CPU
must have gone off-line and turbostat should re-initialize
with the new topology.
But if turbostat can not migrate because it is restricted by
a cpuset, then it will fail to migrate even after re-initialization,
resulting in an infinite loop.
Spit out a warning when we can't migrate
and endure only 2 re-initialize cycles in a row
before giving up and exiting.
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'tools/power')
| -rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 3c063a00f3bf..77e76b11382f 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c @@ -656,8 +656,10 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)  {  	int cpu = t->cpu_id; -	if (cpu_migrate(cpu)) +	if (cpu_migrate(cpu)) { +		fprintf(stderr, "Could not migrate to CPU %d\n", cpu);  		return -1; +	}  	t->tsc = rdtsc();	/* we are running on local CPU of interest */ @@ -1088,15 +1090,22 @@ int mark_cpu_present(int cpu)  void turbostat_loop()  {  	int retval; +	int restarted = 0;  restart: +	restarted++; +  	retval = for_all_cpus(get_counters, EVEN_COUNTERS);  	if (retval < -1) {  		exit(retval);  	} else if (retval == -1) { +		if (restarted > 1) { +			exit(retval); +		}  		re_initialize();  		goto restart;  	} +	restarted = 0;  	gettimeofday(&tv_even, (struct timezone *)NULL);  	while (1) { |