aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.net>2009-08-07 23:30:08 +0200
committerDominik Brodowski <linux@dominikbrodowski.net>2009-08-07 23:30:08 +0200
commita675efd506d63c2762ed017155e55099fb0dfffc (patch)
treeac8c235e34ed585d94c50ad5a91b3c68506c07cc
parent358943e18b06a272dfb2f30ea7bf2d1fdc770bdf (diff)
downloadcpufrequtils-a675efd506d63c2762ed017155e55099fb0dfffc.tar.gz
libcpufreq: add support for related_cpus
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
-rw-r--r--lib/cpufreq.c13
-rw-r--r--lib/cpufreq.h11
-rw-r--r--lib/interfaces.h3
-rw-r--r--lib/sysfs.c15
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;