Skip to content

Commit 2d0c58a

Browse files
committed
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 <[email protected]> Acked-by: Viresh Kumar <[email protected]>
1 parent 0dd3c1d commit 2d0c58a

File tree

5 files changed

+95
-82
lines changed

5 files changed

+95
-82
lines changed

drivers/cpufreq/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ config CPU_FREQ
1818

1919
if CPU_FREQ
2020

21+
config CPU_FREQ_GOV_ATTR_SET
22+
bool
23+
2124
config CPU_FREQ_GOV_COMMON
25+
select CPU_FREQ_GOV_ATTR_SET
2226
select IRQ_WORK
2327
bool
2428

drivers/cpufreq/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o
1111
obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
1212
obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o
1313
obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o
14+
obj-$(CONFIG_CPU_FREQ_GOV_ATTR_SET) += cpufreq_governor_attr_set.o
1415

1516
obj-$(CONFIG_CPUFREQ_DT) += cpufreq-dt.o
1617

drivers/cpufreq/cpufreq_governor.c

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -112,53 +112,6 @@ void gov_update_cpu_data(struct dbs_data *dbs_data)
112112
}
113113
EXPORT_SYMBOL_GPL(gov_update_cpu_data);
114114

115-
static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
116-
{
117-
return container_of(kobj, struct gov_attr_set, kobj);
118-
}
119-
120-
static inline struct governor_attr *to_gov_attr(struct attribute *attr)
121-
{
122-
return container_of(attr, struct governor_attr, attr);
123-
}
124-
125-
static ssize_t governor_show(struct kobject *kobj, struct attribute *attr,
126-
char *buf)
127-
{
128-
struct governor_attr *gattr = to_gov_attr(attr);
129-
130-
return gattr->show(to_gov_attr_set(kobj), buf);
131-
}
132-
133-
static ssize_t governor_store(struct kobject *kobj, struct attribute *attr,
134-
const char *buf, size_t count)
135-
{
136-
struct gov_attr_set *attr_set = to_gov_attr_set(kobj);
137-
struct governor_attr *gattr = to_gov_attr(attr);
138-
int ret = -EBUSY;
139-
140-
mutex_lock(&attr_set->update_lock);
141-
142-
if (attr_set->usage_count)
143-
ret = gattr->store(attr_set, buf, count);
144-
145-
mutex_unlock(&attr_set->update_lock);
146-
147-
return ret;
148-
}
149-
150-
/*
151-
* Sysfs Ops for accessing governor attributes.
152-
*
153-
* All show/store invocations for governor specific sysfs attributes, will first
154-
* call the below show/store callbacks and the attribute specific callback will
155-
* be called from within it.
156-
*/
157-
static const struct sysfs_ops governor_sysfs_ops = {
158-
.show = governor_show,
159-
.store = governor_store,
160-
};
161-
162115
unsigned int dbs_update(struct cpufreq_policy *policy)
163116
{
164117
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,
425378
gov->free(policy_dbs);
426379
}
427380

428-
static void gov_attr_set_init(struct gov_attr_set *attr_set,
429-
struct list_head *list_node)
430-
{
431-
INIT_LIST_HEAD(&attr_set->policy_list);
432-
mutex_init(&attr_set->update_lock);
433-
attr_set->usage_count = 1;
434-
list_add(list_node, &attr_set->policy_list);
435-
}
436-
437-
static void gov_attr_set_get(struct gov_attr_set *attr_set,
438-
struct list_head *list_node)
439-
{
440-
mutex_lock(&attr_set->update_lock);
441-
attr_set->usage_count++;
442-
list_add(list_node, &attr_set->policy_list);
443-
mutex_unlock(&attr_set->update_lock);
444-
}
445-
446-
static unsigned int gov_attr_set_put(struct gov_attr_set *attr_set,
447-
struct list_head *list_node)
448-
{
449-
unsigned int count;
450-
451-
mutex_lock(&attr_set->update_lock);
452-
list_del(list_node);
453-
count = --attr_set->usage_count;
454-
mutex_unlock(&attr_set->update_lock);
455-
if (count)
456-
return count;
457-
458-
kobject_put(&attr_set->kobj);
459-
mutex_destroy(&attr_set->update_lock);
460-
return 0;
461-
}
462-
463381
static int cpufreq_governor_init(struct cpufreq_policy *policy)
464382
{
465383
struct dbs_governor *gov = dbs_governor_of(policy);

drivers/cpufreq/cpufreq_governor.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ struct gov_attr_set {
4848
int usage_count;
4949
};
5050

51+
extern const struct sysfs_ops governor_sysfs_ops;
52+
53+
void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node);
54+
void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node);
55+
unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node);
56+
5157
/*
5258
* Abbreviations:
5359
* dbs: used as a shortform for demand based switching It helps to keep variable
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Abstract code for CPUFreq governor tunable sysfs attributes.
3+
*
4+
* Copyright (C) 2016, Intel Corporation
5+
* Author: Rafael J. Wysocki <[email protected]>
6+
*
7+
* This program is free software; you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License version 2 as
9+
* published by the Free Software Foundation.
10+
*/
11+
12+
#include "cpufreq_governor.h"
13+
14+
static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
15+
{
16+
return container_of(kobj, struct gov_attr_set, kobj);
17+
}
18+
19+
static inline struct governor_attr *to_gov_attr(struct attribute *attr)
20+
{
21+
return container_of(attr, struct governor_attr, attr);
22+
}
23+
24+
static ssize_t governor_show(struct kobject *kobj, struct attribute *attr,
25+
char *buf)
26+
{
27+
struct governor_attr *gattr = to_gov_attr(attr);
28+
29+
return gattr->show(to_gov_attr_set(kobj), buf);
30+
}
31+
32+
static ssize_t governor_store(struct kobject *kobj, struct attribute *attr,
33+
const char *buf, size_t count)
34+
{
35+
struct gov_attr_set *attr_set = to_gov_attr_set(kobj);
36+
struct governor_attr *gattr = to_gov_attr(attr);
37+
int ret;
38+
39+
mutex_lock(&attr_set->update_lock);
40+
ret = attr_set->usage_count ? gattr->store(attr_set, buf, count) : -EBUSY;
41+
mutex_unlock(&attr_set->update_lock);
42+
return ret;
43+
}
44+
45+
const struct sysfs_ops governor_sysfs_ops = {
46+
.show = governor_show,
47+
.store = governor_store,
48+
};
49+
EXPORT_SYMBOL_GPL(governor_sysfs_ops);
50+
51+
void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node)
52+
{
53+
INIT_LIST_HEAD(&attr_set->policy_list);
54+
mutex_init(&attr_set->update_lock);
55+
attr_set->usage_count = 1;
56+
list_add(list_node, &attr_set->policy_list);
57+
}
58+
EXPORT_SYMBOL_GPL(gov_attr_set_init);
59+
60+
void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node)
61+
{
62+
mutex_lock(&attr_set->update_lock);
63+
attr_set->usage_count++;
64+
list_add(list_node, &attr_set->policy_list);
65+
mutex_unlock(&attr_set->update_lock);
66+
}
67+
EXPORT_SYMBOL_GPL(gov_attr_set_get);
68+
69+
unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node)
70+
{
71+
unsigned int count;
72+
73+
mutex_lock(&attr_set->update_lock);
74+
list_del(list_node);
75+
count = --attr_set->usage_count;
76+
mutex_unlock(&attr_set->update_lock);
77+
if (count)
78+
return count;
79+
80+
kobject_put(&attr_set->kobj);
81+
mutex_destroy(&attr_set->update_lock);
82+
return 0;
83+
}
84+
EXPORT_SYMBOL_GPL(gov_attr_set_put);

0 commit comments

Comments
 (0)