[CPUFREQ] Introduce global, not per core: /sys/devices/system/cpu/cpufreq
Currently everything in the cpufreq layer is per core based. This does not reflect reality, for example ondemand on conservative governors have global sysfs variables. Introduce a global cpufreq directory and add the kobject to the governor struct, so that governors can easily access it. The directory is initialized in the cpufreq_core_init initcall and thus will always be created if cpufreq is compiled in, even if no cpufreq driver is active later. Signed-off-by: Thomas Renninger <trenn@suse.de> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
4bfa042cd3
commit
8aa84ad8d6
|
@ -686,6 +686,9 @@ static struct attribute *default_attrs[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct kobject *cpufreq_global_kobject;
|
||||||
|
EXPORT_SYMBOL(cpufreq_global_kobject);
|
||||||
|
|
||||||
#define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
|
#define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
|
||||||
#define to_attr(a) container_of(a, struct freq_attr, attr)
|
#define to_attr(a) container_of(a, struct freq_attr, attr)
|
||||||
|
|
||||||
|
@ -1935,7 +1938,11 @@ static int __init cpufreq_core_init(void)
|
||||||
per_cpu(policy_cpu, cpu) = -1;
|
per_cpu(policy_cpu, cpu) = -1;
|
||||||
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
|
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cpufreq_global_kobject = kobject_create_and_add("cpufreq",
|
||||||
|
&cpu_sysdev_class.kset.kobj);
|
||||||
|
BUG_ON(!cpufreq_global_kobject);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
core_initcall(cpufreq_core_init);
|
core_initcall(cpufreq_core_init);
|
||||||
|
|
|
@ -65,6 +65,9 @@ static inline int cpufreq_unregister_notifier(struct notifier_block *nb,
|
||||||
|
|
||||||
struct cpufreq_governor;
|
struct cpufreq_governor;
|
||||||
|
|
||||||
|
/* /sys/devices/system/cpu/cpufreq: entry point for global variables */
|
||||||
|
extern struct kobject *cpufreq_global_kobject;
|
||||||
|
|
||||||
#define CPUFREQ_ETERNAL (-1)
|
#define CPUFREQ_ETERNAL (-1)
|
||||||
struct cpufreq_cpuinfo {
|
struct cpufreq_cpuinfo {
|
||||||
unsigned int max_freq;
|
unsigned int max_freq;
|
||||||
|
@ -274,6 +277,13 @@ struct freq_attr {
|
||||||
ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
|
ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct global_attr {
|
||||||
|
struct attribute attr;
|
||||||
|
ssize_t (*show)(struct kobject *kobj,
|
||||||
|
struct attribute *attr, char *buf);
|
||||||
|
ssize_t (*store)(struct kobject *a, struct attribute *b,
|
||||||
|
const char *c, size_t count);
|
||||||
|
};
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* CPUFREQ 2.6. INTERFACE *
|
* CPUFREQ 2.6. INTERFACE *
|
||||||
|
|
Loading…
Reference in New Issue