summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@stericsson.com>2011-04-11 14:36:45 +0200
committerHenrik Aberg <henrik.aberg@stericsson.com>2011-05-18 09:40:11 +0200
commita3a28fa28e6b6820965138dbd4392a89bbd7ddf3 (patch)
tree7dec0d3231279741ef56ff930bb555a4e7186233 /drivers
parentc7607aa48335420e3a53178b4ad9152a32af84e0 (diff)
cpuidle: add interface for modifying multiplier
ST-Ericsson ID: 337167 Change-Id: I26ef492fd200960b40638c8a5a1f706ee24705bb Signed-off-by: Vincent Guittot <vincent.guittot@stericsson.com> Signed-off-by: Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21971 Reviewed-by: QATEST Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/cpuidle/governors/menu.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
index f508690eb95..f9c6ca7b937 100644
--- a/drivers/cpuidle/governors/menu.c
+++ b/drivers/cpuidle/governors/menu.c
@@ -19,6 +19,8 @@
#include <linux/tick.h>
#include <linux/sched.h>
#include <linux/math64.h>
+#include <linux/cpu.h>
+#include <linux/sysfs.h>
#define BUCKETS 12
#define INTERVALS 8
@@ -121,6 +123,7 @@ struct menu_device {
int interval_ptr;
};
+static int tune_multiplier = 1024;
#define LOAD_INT(x) ((x) >> FSHIFT)
#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
@@ -170,6 +173,9 @@ static inline int performance_multiplier(void)
{
int mult = 1;
+ if (tune_multiplier <= 1)
+ return tune_multiplier;
+
/* for higher loadavg, we are more reluctant */
mult += 2 * get_loadavg();
@@ -177,6 +183,9 @@ static inline int performance_multiplier(void)
/* for IO wait tasks (per cpu!) we add 5x each */
mult += 10 * nr_iowait_cpu(smp_processor_id());
+ if (tune_multiplier != 1024)
+ mult = (tune_multiplier * mult) / 1024;
+
return mult;
}
@@ -379,6 +388,54 @@ static void menu_update(struct cpuidle_device *dev)
data->interval_ptr = 0;
}
+int cpuidle_set_multiplier(unsigned int value)
+{
+
+ if (value > 1024)
+ tune_multiplier = 1024;
+ else
+ tune_multiplier = value;
+
+ return 0;
+}
+EXPORT_SYMBOL(cpuidle_set_multiplier);
+
+static ssize_t show_multiplier(struct sysdev_class *class,
+ struct sysdev_class_attribute *attr,
+ char *buf)
+{
+ return sprintf(buf, "%d\n", tune_multiplier);
+}
+
+static ssize_t store_multiplier(struct sysdev_class *class,
+ struct sysdev_class_attribute *attr,
+ const char *buf, size_t count)
+{
+ unsigned int input;
+ int ret;
+ ret = sscanf(buf, "%u", &input);
+
+ if (ret != 1)
+ return -EINVAL;
+
+ cpuidle_set_multiplier(input);
+
+ return count;
+}
+
+
+static SYSDEV_CLASS_ATTR(multiplier, 0644, show_multiplier, store_multiplier);
+
+static struct attribute *dbs_attributes[] = {
+ &attr_multiplier.attr,
+ NULL
+};
+
+static struct attribute_group dbs_attr_group = {
+ .attrs = dbs_attributes,
+ .name = "cpuidle",
+};
+
/**
* menu_enable_device - scans a CPU's states and does setup
* @dev: the CPU
@@ -406,7 +463,15 @@ static struct cpuidle_governor menu_governor = {
*/
static int __init init_menu(void)
{
- return cpuidle_register_governor(&menu_governor);
+ int ret;
+
+ ret = cpuidle_register_governor(&menu_governor);
+
+ sysfs_merge_group(&(cpu_sysdev_class.kset.kobj),
+ &dbs_attr_group);
+
+ return ret;
+
}
/**
@@ -414,6 +479,9 @@ static int __init init_menu(void)
*/
static void __exit exit_menu(void)
{
+ sysfs_unmerge_group(&(cpu_sysdev_class.kset.kobj),
+ &dbs_attr_group);
+
cpuidle_unregister_governor(&menu_governor);
}