diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2009-08-07 23:30:08 +0200 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2009-08-07 23:30:08 +0200 |
commit | a675efd506d63c2762ed017155e55099fb0dfffc (patch) | |
tree | ac8c235e34ed585d94c50ad5a91b3c68506c07cc | |
parent | 358943e18b06a272dfb2f30ea7bf2d1fdc770bdf (diff) | |
download | cpufrequtils-a675efd506d63c2762ed017155e55099fb0dfffc.tar.gz |
libcpufreq: add support for related_cpus
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
-rw-r--r-- | lib/cpufreq.c | 13 | ||||
-rw-r--r-- | lib/cpufreq.h | 11 | ||||
-rw-r--r-- | lib/interfaces.h | 3 | ||||
-rw-r--r-- | lib/sysfs.c | 15 |
4 files changed, 39 insertions, 3 deletions
diff --git a/lib/cpufreq.c b/lib/cpufreq.c index 7cd228c..1273b3f 100644 --- a/lib/cpufreq.c +++ b/lib/cpufreq.c @@ -153,6 +153,19 @@ void cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *any) { } +struct cpufreq_affected_cpus * cpufreq_get_related_cpus(unsigned int cpu) { + struct cpufreq_affected_cpus * ret; + ret = sysfs_get_related_cpus(cpu); + if (!ret) + ret = proc_get_related_cpus(cpu); + return (ret); +} + +void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *any) { + cpufreq_put_affected_cpus(any); +} + + int cpufreq_set_policy(unsigned int cpu, struct cpufreq_policy *policy) { int ret; if (!policy || !(policy->governor)) diff --git a/lib/cpufreq.h b/lib/cpufreq.h index 9c0854b..f87c765 100644 --- a/lib/cpufreq.h +++ b/lib/cpufreq.h @@ -151,6 +151,17 @@ extern struct cpufreq_affected_cpus * cpufreq_get_affected_cpus(unsigned int cpu extern void cpufreq_put_affected_cpus(struct cpufreq_affected_cpus *first); +/* determine related CPUs + * + * Remember to call cpufreq_put_related_cpus when no longer needed + * to avoid memory leakage, please. + */ + +extern struct cpufreq_affected_cpus * cpufreq_get_related_cpus(unsigned int cpu); + +extern void cpufreq_put_related_cpus(struct cpufreq_affected_cpus *first); + + /* determine stats for cpufreq subsystem * * This is not available in all kernel versions or configurations. diff --git a/lib/interfaces.h b/lib/interfaces.h index e2559cb..2262b65 100644 --- a/lib/interfaces.h +++ b/lib/interfaces.h @@ -9,6 +9,7 @@ extern struct cpufreq_policy * sysfs_get_policy(unsigned int cpu); extern struct cpufreq_available_governors * sysfs_get_available_governors(unsigned int cpu); extern struct cpufreq_available_frequencies * sysfs_get_available_frequencies(unsigned int cpu); extern struct cpufreq_affected_cpus * sysfs_get_affected_cpus(unsigned int cpu); +extern struct cpufreq_affected_cpus * sysfs_get_related_cpus(unsigned int cpu); extern struct cpufreq_stats * sysfs_get_stats(unsigned int cpu, unsigned long long *total_time); extern unsigned long sysfs_get_transitions(unsigned int cpu); extern int sysfs_set_policy(unsigned int cpu, struct cpufreq_policy *policy); @@ -28,6 +29,7 @@ static inline struct cpufreq_policy * sysfs_get_policy(unsigned int cpu) { retur static inline struct cpufreq_available_governors * sysfs_get_available_governors(unsigned int cpu) { return NULL; } static inline struct cpufreq_available_frequencies * sysfs_get_available_frequencies(unsigned int cpu) { return NULL; } static inline struct cpufreq_affected_cpus * sysfs_get_affected_cpus(unsigned int cpu) { return NULL; } +static inline struct cpufreq_related_cpus * sysfs_get_affected_cpus(unsigned int cpu) { return NULL; } static inline struct cpufreq_stats * sysfs_get_stats(unsigned int cpu, unsigned long long *total_time) { return NULL; } static inline unsigned long sysfs_get_transitions(unsigned int cpu) { return 0; } static inline int sysfs_set_policy(unsigned int cpu, struct cpufreq_policy *policy) { return -ENOSYS; } @@ -64,6 +66,7 @@ static inline char * proc_get_driver(unsigned int cpu) {return NULL; } static inline struct cpufreq_available_governors * proc_get_available_governors(unsigned int cpu) { return NULL; } static inline struct cpufreq_available_frequencies * proc_get_available_frequencies(unsigned int cpu) { return NULL; } static inline struct cpufreq_affected_cpus * proc_get_affected_cpus(unsigned int cpu) { return NULL; } +static inline struct cpufreq_affected_cpus * proc_get_related_cpus(unsigned int cpu) { return NULL; } static inline int proc_modify_policy_min(unsigned int cpu, unsigned long min_freq) { return -ENOSYS; } static inline int proc_modify_policy_max(unsigned int cpu, unsigned long max_freq) { return -ENOSYS; } static inline int proc_modify_policy_governor(unsigned int cpu, char *governor) { return -ENOSYS; } diff --git a/lib/sysfs.c b/lib/sysfs.c index 58e6cbd..f0492d9 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -1,5 +1,5 @@ /* - * (C) 2004 Dominik Brodowski <linux@dominikbrodowski.de> + * (C) 2004-2009 Dominik Brodowski <linux@dominikbrodowski.de> * * Licensed under the terms of the GNU GPL License version 2. */ @@ -370,7 +370,8 @@ struct cpufreq_available_frequencies * sysfs_get_available_frequencies(unsigned return NULL; } -struct cpufreq_affected_cpus * sysfs_get_affected_cpus(unsigned int cpu) { +static struct cpufreq_affected_cpus * sysfs_get_cpu_list(unsigned int cpu, + const char *file) { struct cpufreq_affected_cpus *first = NULL; struct cpufreq_affected_cpus *current = NULL; char one_value[SYSFS_PATH_MAX]; @@ -378,7 +379,7 @@ struct cpufreq_affected_cpus * sysfs_get_affected_cpus(unsigned int cpu) { unsigned int pos, i; unsigned int len; - if ( ( len = sysfs_read_file(cpu, "affected_cpus", linebuf, sizeof(linebuf))) == 0 ) + if ( ( len = sysfs_read_file(cpu, file, linebuf, sizeof(linebuf))) == 0 ) { return NULL; } @@ -427,6 +428,14 @@ struct cpufreq_affected_cpus * sysfs_get_affected_cpus(unsigned int cpu) { return NULL; } +struct cpufreq_affected_cpus * sysfs_get_affected_cpus(unsigned int cpu) { + return sysfs_get_cpu_list(cpu, "affected_cpus"); +} + +struct cpufreq_affected_cpus * sysfs_get_related_cpus(unsigned int cpu) { + return sysfs_get_cpu_list(cpu, "related_cpus"); +} + struct cpufreq_stats * sysfs_get_stats(unsigned int cpu, unsigned long long *total_time) { struct cpufreq_stats *first = NULL; struct cpufreq_stats *current = NULL; |