diff options
| author | Palmer Cox <p@lmercox.com> | 2012-11-27 13:17:46 +0100 | 
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2012-11-27 23:07:19 +0100 | 
| commit | 35a169737cdf9155e890d60eae2b8fffc16d16ba (patch) | |
| tree | d119819f5ef7ae6af01cb7d931538b77b4c8bff4 /tools/power | |
| parent | 53d2000ebe0618219f73ac866701533237180044 (diff) | |
| download | linux-35a169737cdf9155e890d60eae2b8fffc16d16ba.tar.bz2 | |
cpupower tools: Fix malloc of cpu_info structure
The cpu_info member of cpupower_topology was being declared as an unnamed
structure. This member was then being malloced using the size of the
parent cpupower_topology * the number of cpus. This works
because cpu_info is smaller than cpupower_topology. However, there is
no guarantee that will always be the case. Making cpu_info its own
top level structure (named cpuid_core_info) allows for mallocing the actual
size of this structure. This also lets us get rid of a redefinition of
the structure in topology.c with slightly different field names.
Signed-off-by: Palmer Cox <p@lmercox.com>
Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'tools/power')
| -rw-r--r-- | tools/power/cpupower/utils/helpers/helpers.h | 17 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/helpers/topology.c | 14 | 
2 files changed, 12 insertions, 19 deletions
| diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h index 2eb584cf2f55..f84985f630e2 100644 --- a/tools/power/cpupower/utils/helpers/helpers.h +++ b/tools/power/cpupower/utils/helpers/helpers.h @@ -92,6 +92,14 @@ extern int get_cpu_info(unsigned int cpu, struct cpupower_cpu_info *cpu_info);  extern struct cpupower_cpu_info cpupower_cpu_info;  /* cpuid and cpuinfo helpers  **************************/ +struct cpuid_core_info { +	int pkg; +	int core; +	int cpu; + +	/* flags */ +	unsigned int is_online:1; +};  /* CPU topology/hierarchy parsing ******************/  struct cpupower_topology { @@ -101,14 +109,7 @@ struct cpupower_topology {  	unsigned int threads; /* per core */  	/* Array gets mallocated with cores entries, holding per core info */ -	struct { -		int pkg; -		int core; -		int cpu; - -		/* flags */ -		unsigned int is_online:1; -	} *core_info; +	struct cpuid_core_info *core_info;  };  extern int get_cpu_topology(struct cpupower_topology *cpu_top); diff --git a/tools/power/cpupower/utils/helpers/topology.c b/tools/power/cpupower/utils/helpers/topology.c index 216f3e3466ce..4e2b583ea17b 100644 --- a/tools/power/cpupower/utils/helpers/topology.c +++ b/tools/power/cpupower/utils/helpers/topology.c @@ -36,14 +36,6 @@ static int sysfs_topology_read_file(unsigned int cpu, const char *fname, int *re  	return 0;  } -struct cpuid_core_info { -	unsigned int pkg; -	unsigned int thread; -	unsigned int cpu; -	/* flags */ -	unsigned int is_online:1; -}; -  static int __compare(const void *t1, const void *t2)  {  	struct cpuid_core_info *top1 = (struct cpuid_core_info *)t1; @@ -52,9 +44,9 @@ static int __compare(const void *t1, const void *t2)  		return -1;  	else if (top1->pkg > top2->pkg)  		return 1; -	else if (top1->thread < top2->thread) +	else if (top1->core < top2->core)  		return -1; -	else if (top1->thread > top2->thread) +	else if (top1->core > top2->core)  		return 1;  	else if (top1->cpu < top2->cpu)  		return -1; @@ -74,7 +66,7 @@ int get_cpu_topology(struct cpupower_topology *cpu_top)  {  	int cpu, cpus = sysconf(_SC_NPROCESSORS_CONF); -	cpu_top->core_info = malloc(sizeof(struct cpupower_topology) * cpus); +	cpu_top->core_info = malloc(sizeof(struct cpuid_core_info) * cpus);  	if (cpu_top->core_info == NULL)  		return -ENOMEM;  	cpu_top->pkgs = cpu_top->cores = 0; |