mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
cpufreq: governor: Move abstract gov_attr_set code to seperate file
Move abstract code related to struct gov_attr_set to a separate (new) file so it can be shared with (future) goverernors that won't share more code with "ondemand" and "conservative". No intentional functional changes. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
This commit is contained in:
parent
0dd3c1d678
commit
2d0c58ad60
@ -18,7 +18,11 @@ config CPU_FREQ
|
|||||||
|
|
||||||
if CPU_FREQ
|
if CPU_FREQ
|
||||||
|
|
||||||
|
config CPU_FREQ_GOV_ATTR_SET
|
||||||
|
bool
|
||||||
|
|
||||||
config CPU_FREQ_GOV_COMMON
|
config CPU_FREQ_GOV_COMMON
|
||||||
|
select CPU_FREQ_GOV_ATTR_SET
|
||||||
select IRQ_WORK
|
select IRQ_WORK
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o
|
|||||||
obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
|
obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o
|
obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o
|
obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o
|
||||||
|
obj-$(CONFIG_CPU_FREQ_GOV_ATTR_SET) += cpufreq_governor_attr_set.o
|
||||||
|
|
||||||
obj-$(CONFIG_CPUFREQ_DT) += cpufreq-dt.o
|
obj-$(CONFIG_CPUFREQ_DT) += cpufreq-dt.o
|
||||||
|
|
||||||
|
@ -112,53 +112,6 @@ void gov_update_cpu_data(struct dbs_data *dbs_data)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gov_update_cpu_data);
|
EXPORT_SYMBOL_GPL(gov_update_cpu_data);
|
||||||
|
|
||||||
static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
|
|
||||||
{
|
|
||||||
return container_of(kobj, struct gov_attr_set, kobj);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct governor_attr *to_gov_attr(struct attribute *attr)
|
|
||||||
{
|
|
||||||
return container_of(attr, struct governor_attr, attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t governor_show(struct kobject *kobj, struct attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
struct governor_attr *gattr = to_gov_attr(attr);
|
|
||||||
|
|
||||||
return gattr->show(to_gov_attr_set(kobj), buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t governor_store(struct kobject *kobj, struct attribute *attr,
|
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
struct gov_attr_set *attr_set = to_gov_attr_set(kobj);
|
|
||||||
struct governor_attr *gattr = to_gov_attr(attr);
|
|
||||||
int ret = -EBUSY;
|
|
||||||
|
|
||||||
mutex_lock(&attr_set->update_lock);
|
|
||||||
|
|
||||||
if (attr_set->usage_count)
|
|
||||||
ret = gattr->store(attr_set, buf, count);
|
|
||||||
|
|
||||||
mutex_unlock(&attr_set->update_lock);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sysfs Ops for accessing governor attributes.
|
|
||||||
*
|
|
||||||
* All show/store invocations for governor specific sysfs attributes, will first
|
|
||||||
* call the below show/store callbacks and the attribute specific callback will
|
|
||||||
* be called from within it.
|
|
||||||
*/
|
|
||||||
static const struct sysfs_ops governor_sysfs_ops = {
|
|
||||||
.show = governor_show,
|
|
||||||
.store = governor_store,
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int dbs_update(struct cpufreq_policy *policy)
|
unsigned int dbs_update(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
struct policy_dbs_info *policy_dbs = policy->governor_data;
|
struct policy_dbs_info *policy_dbs = policy->governor_data;
|
||||||
@ -425,41 +378,6 @@ static void free_policy_dbs_info(struct policy_dbs_info *policy_dbs,
|
|||||||
gov->free(policy_dbs);
|
gov->free(policy_dbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gov_attr_set_init(struct gov_attr_set *attr_set,
|
|
||||||
struct list_head *list_node)
|
|
||||||
{
|
|
||||||
INIT_LIST_HEAD(&attr_set->policy_list);
|
|
||||||
mutex_init(&attr_set->update_lock);
|
|
||||||
attr_set->usage_count = 1;
|
|
||||||
list_add(list_node, &attr_set->policy_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gov_attr_set_get(struct gov_attr_set *attr_set,
|
|
||||||
struct list_head *list_node)
|
|
||||||
{
|
|
||||||
mutex_lock(&attr_set->update_lock);
|
|
||||||
attr_set->usage_count++;
|
|
||||||
list_add(list_node, &attr_set->policy_list);
|
|
||||||
mutex_unlock(&attr_set->update_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int gov_attr_set_put(struct gov_attr_set *attr_set,
|
|
||||||
struct list_head *list_node)
|
|
||||||
{
|
|
||||||
unsigned int count;
|
|
||||||
|
|
||||||
mutex_lock(&attr_set->update_lock);
|
|
||||||
list_del(list_node);
|
|
||||||
count = --attr_set->usage_count;
|
|
||||||
mutex_unlock(&attr_set->update_lock);
|
|
||||||
if (count)
|
|
||||||
return count;
|
|
||||||
|
|
||||||
kobject_put(&attr_set->kobj);
|
|
||||||
mutex_destroy(&attr_set->update_lock);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cpufreq_governor_init(struct cpufreq_policy *policy)
|
static int cpufreq_governor_init(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
struct dbs_governor *gov = dbs_governor_of(policy);
|
struct dbs_governor *gov = dbs_governor_of(policy);
|
||||||
|
@ -48,6 +48,12 @@ struct gov_attr_set {
|
|||||||
int usage_count;
|
int usage_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern const struct sysfs_ops governor_sysfs_ops;
|
||||||
|
|
||||||
|
void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node);
|
||||||
|
void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node);
|
||||||
|
unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Abbreviations:
|
* Abbreviations:
|
||||||
* dbs: used as a shortform for demand based switching It helps to keep variable
|
* dbs: used as a shortform for demand based switching It helps to keep variable
|
||||||
|
84
drivers/cpufreq/cpufreq_governor_attr_set.c
Normal file
84
drivers/cpufreq/cpufreq_governor_attr_set.c
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Abstract code for CPUFreq governor tunable sysfs attributes.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016, Intel Corporation
|
||||||
|
* Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cpufreq_governor.h"
|
||||||
|
|
||||||
|
static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
|
||||||
|
{
|
||||||
|
return container_of(kobj, struct gov_attr_set, kobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct governor_attr *to_gov_attr(struct attribute *attr)
|
||||||
|
{
|
||||||
|
return container_of(attr, struct governor_attr, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t governor_show(struct kobject *kobj, struct attribute *attr,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
struct governor_attr *gattr = to_gov_attr(attr);
|
||||||
|
|
||||||
|
return gattr->show(to_gov_attr_set(kobj), buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t governor_store(struct kobject *kobj, struct attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct gov_attr_set *attr_set = to_gov_attr_set(kobj);
|
||||||
|
struct governor_attr *gattr = to_gov_attr(attr);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&attr_set->update_lock);
|
||||||
|
ret = attr_set->usage_count ? gattr->store(attr_set, buf, count) : -EBUSY;
|
||||||
|
mutex_unlock(&attr_set->update_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct sysfs_ops governor_sysfs_ops = {
|
||||||
|
.show = governor_show,
|
||||||
|
.store = governor_store,
|
||||||
|
};
|
||||||
|
EXPORT_SYMBOL_GPL(governor_sysfs_ops);
|
||||||
|
|
||||||
|
void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node)
|
||||||
|
{
|
||||||
|
INIT_LIST_HEAD(&attr_set->policy_list);
|
||||||
|
mutex_init(&attr_set->update_lock);
|
||||||
|
attr_set->usage_count = 1;
|
||||||
|
list_add(list_node, &attr_set->policy_list);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(gov_attr_set_init);
|
||||||
|
|
||||||
|
void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node)
|
||||||
|
{
|
||||||
|
mutex_lock(&attr_set->update_lock);
|
||||||
|
attr_set->usage_count++;
|
||||||
|
list_add(list_node, &attr_set->policy_list);
|
||||||
|
mutex_unlock(&attr_set->update_lock);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(gov_attr_set_get);
|
||||||
|
|
||||||
|
unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node)
|
||||||
|
{
|
||||||
|
unsigned int count;
|
||||||
|
|
||||||
|
mutex_lock(&attr_set->update_lock);
|
||||||
|
list_del(list_node);
|
||||||
|
count = --attr_set->usage_count;
|
||||||
|
mutex_unlock(&attr_set->update_lock);
|
||||||
|
if (count)
|
||||||
|
return count;
|
||||||
|
|
||||||
|
kobject_put(&attr_set->kobj);
|
||||||
|
mutex_destroy(&attr_set->update_lock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(gov_attr_set_put);
|
Loading…
x
Reference in New Issue
Block a user