Skip to contentSkip to conversation

Allow any governor to be used as default

PATCH New Severi Salminen 1 participant 1 message May 29, 2007 CPU frequency scaling framework

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Allow any governor to be used as default

This patch allows the user to select any cpufreq governor as the default governor - not just 'performance' or 'userspave'. This patch is inspired by and based on the patch provided in this bug:

http://bugme.osdl.org/show_bug.cgi?id=8384

The above patch, however, doesn't allow the selection of 'ondemand' or 'conservative'.

I added the necessary descriptions and options to Kconfig, made relevant functions non-static and updated cpufreq.h.

In order to allow the selection of 'ondemand' or 'conservative' I had to rename a function cpufreq_gov_dbs() in cpufreq_ondemand.c and cpufreq_conservative.c to prevent name collision - the function has to be non-static. The functions are now cpufreq_gov_ondemand() and cpufreq_gov_conservative(). I think this is more in line with the naming of other governors.

Those two files also have functions cpufreq_gov_dbs_init() and cpufreq_gov_dbs_exit(). They could also be renamed for consistency but it is not necessary as they are both static. I didn't touch them in this patch.

This patch works on 2.6.21.2.

PS. This is my first patch so any feedback concerning anything is welcome.

---

diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_conservative.c linux-2.6.21.2/drivers/cpufreq/cpufreq_conservative.c
--- linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_conservative.c

2007-05-24 00:33:55.000000000 +0300

+++ linux-2.6.21.2/drivers/cpufreq/cpufreq_conservative.c 2007-05-24
16:16:17.000000000 +0300
@@ -551,7 +551,7 @@
return 0;
}

-static struct cpufreq_governor cpufreq_gov_dbs = { +struct cpufreq_governor cpufreq_gov_conservative = {
.name = "conservative",
.governor = cpufreq_governor_dbs,
.owner = THIS_MODULE,
@@ -559,7 +559,7 @@

static int __init cpufreq_gov_dbs_init(void)
{
- return cpufreq_register_governor(&cpufreq_gov_dbs);
+ return cpufreq_register_governor(&cpufreq_gov_conservative);
}

static void __exit cpufreq_gov_dbs_exit(void)
@@ -567,7 +567,7 @@
/* Make sure that the scheduled work is indeed not running */ flush_scheduled_work();

- cpufreq_unregister_governor(&cpufreq_gov_dbs);
+ cpufreq_unregister_governor(&cpufreq_gov_conservative);
}

diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_ondemand.c linux-2.6.21.2/drivers/cpufreq/cpufreq_ondemand.c
--- linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_ondemand.c 2007-05-24
00:33:55.000000000 +0300
+++ linux-2.6.21.2/drivers/cpufreq/cpufreq_ondemand.c 2007-05-24
16:15:42.000000000 +0300
@@ -573,7 +573,7 @@
return 0;
}

-static struct cpufreq_governor cpufreq_gov_dbs = { +struct cpufreq_governor cpufreq_gov_ondemand = {
.name = "ondemand",
.governor = cpufreq_governor_dbs,
.owner = THIS_MODULE,
@@ -586,12 +586,12 @@
printk(KERN_ERR "Creation of kondemand failed\n"); return -EFAULT;
}
- return cpufreq_register_governor(&cpufreq_gov_dbs);
+ return cpufreq_register_governor(&cpufreq_gov_ondemand);
}

static void __exit cpufreq_gov_dbs_exit(void)
{
- cpufreq_unregister_governor(&cpufreq_gov_dbs);
+ cpufreq_unregister_governor(&cpufreq_gov_ondemand);
destroy_workqueue(kondemand_wq);
}

diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_powersave.c linux-2.6.21.2/drivers/cpufreq/cpufreq_powersave.c
--- linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_powersave.c

2007-05-24 00:33:55.000000000 +0300

+++ linux-2.6.21.2/drivers/cpufreq/cpufreq_powersave.c 2007-05-24
15:18:49.000000000 +0300
@@ -35,7 +35,7 @@
return 0;
}

-static struct cpufreq_governor cpufreq_gov_powersave = { +struct cpufreq_governor cpufreq_gov_powersave = {
.name = "powersave",
.governor = cpufreq_governor_powersave,
.owner = THIS_MODULE,
diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/Kconfig linux-2.6.21.2/drivers/cpufreq/Kconfig
--- linux-2.6.21.2-vanilla/drivers/cpufreq/Kconfig 2007-05-24
00:33:55.000000000 +0300
+++ linux-2.6.21.2/drivers/cpufreq/Kconfig 2007-05-24 16:20:06.000000000
+0300
@@ -66,6 +66,14 @@
the frequency statically to the highest frequency supported by the CPU.

+config CPU_FREQ_DEFAULT_GOV_POWERSAVE

+        bool "powersave"
+        select CPU_FREQ_GOV_POWERSAVE
+        help
+          Use the CPUFreq governor 'powersave' as default. This sets
+          the frequency statically to the lowest frequency supported by
+          the CPU.

+
config CPU_FREQ_DEFAULT_GOV_USERSPACE
bool "userspace"
select CPU_FREQ_GOV_USERSPACE
@@ -75,6 +83,22 @@
program shall be able to set the CPU dynamically without having to enable the userspace governor manually.

+config CPU_FREQ_DEFAULT_GOV_ONDEMAND

+        bool "ondemand"
+        select CPU_FREQ_GOV_ONDEMAND
+        help
+          Use the CPUFreq governor 'ondemand' as default. This governor
+          does a periodic polling and changes frequency based on the
+          CPU utilization.
+
+config CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
+        bool "conservative"
+        select CPU_FREQ_GOV_CONSERVATIVE
+        help
+          Use the CPUFreq governor 'conservative' as default. This governor
+          does a periodic polling and changes frequency based on the
+          CPU utilization.

+
endchoice

config CPU_FREQ_GOV_PERFORMANCE
diff -ur linux-2.6.21.2-vanilla/include/linux/cpufreq.h linux-2.6.21.2/include/linux/cpufreq.h
--- linux-2.6.21.2-vanilla/include/linux/cpufreq.h 2007-05-24
00:33:55.000000000 +0300
+++ linux-2.6.21.2/include/linux/cpufreq.h 2007-05-24 15:45:38.000000000
+0300
@@ -283,9 +283,18 @@
#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE extern struct cpufreq_governor cpufreq_gov_performance;
#define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_performance
+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE) +extern struct cpufreq_governor cpufreq_gov_powersave;
+#define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_powersave
#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE) extern struct cpufreq_governor cpufreq_gov_userspace;
#define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_userspace
+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND) +extern struct cpufreq_governor cpufreq_gov_ondemand;
+#define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_ondemand
+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE) +extern struct cpufreq_governor cpufreq_gov_conservative;
+#define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_conservative
#endif

drivers/cpufreq/cpufreq_conservative.c +3 -3
diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_conservative.c linux-2.6.21.2/drivers/cpufreq/cpufreq_conservative.c
@@ -551,7 +551,7 @@
 	return 0;
 }
 
-static struct cpufreq_governor cpufreq_gov_dbs = {
+struct cpufreq_governor cpufreq_gov_conservative = {
 	.name		= "conservative",
 	.governor	= cpufreq_governor_dbs,
 	.owner		= THIS_MODULE,
@@ -559,7 +559,7 @@
 
 static int __init cpufreq_gov_dbs_init(void)
 {
-	return cpufreq_register_governor(&cpufreq_gov_dbs);
+	return cpufreq_register_governor(&cpufreq_gov_conservative);
 }
 
 static void __exit cpufreq_gov_dbs_exit(void)
@@ -567,7 +567,7 @@
 	/* Make sure that the scheduled work is indeed not running */
 	flush_scheduled_work();
 
-	cpufreq_unregister_governor(&cpufreq_gov_dbs);
+	cpufreq_unregister_governor(&cpufreq_gov_conservative);
 }
 
 
drivers/cpufreq/cpufreq_ondemand.c +3 -3
diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_ondemand.c linux-2.6.21.2/drivers/cpufreq/cpufreq_ondemand.c
@@ -573,7 +573,7 @@
 	return 0;
 }
 
-static struct cpufreq_governor cpufreq_gov_dbs = {
+struct cpufreq_governor cpufreq_gov_ondemand = {
 	.name = "ondemand",
 	.governor = cpufreq_governor_dbs,
 	.owner = THIS_MODULE,
@@ -586,12 +586,12 @@
 		printk(KERN_ERR "Creation of kondemand failed\n");
 		return -EFAULT;
 	}
-	return cpufreq_register_governor(&cpufreq_gov_dbs);
+	return cpufreq_register_governor(&cpufreq_gov_ondemand);
 }
 
 static void __exit cpufreq_gov_dbs_exit(void)
 {
-	cpufreq_unregister_governor(&cpufreq_gov_dbs);
+	cpufreq_unregister_governor(&cpufreq_gov_ondemand);
 	destroy_workqueue(kondemand_wq);
 }
 
drivers/cpufreq/cpufreq_powersave.c +1 -1
diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/cpufreq_powersave.c linux-2.6.21.2/drivers/cpufreq/cpufreq_powersave.c
@@ -35,7 +35,7 @@
 	return 0;
 }
 
-static struct cpufreq_governor cpufreq_gov_powersave = {
+struct cpufreq_governor cpufreq_gov_powersave = {
 	.name		= "powersave",
 	.governor	= cpufreq_governor_powersave,
 	.owner		= THIS_MODULE,
drivers/cpufreq/Kconfig +24 -0
diff -ur linux-2.6.21.2-vanilla/drivers/cpufreq/Kconfig linux-2.6.21.2/drivers/cpufreq/Kconfig
@@ -66,6 +66,14 @@
 	  the frequency statically to the highest frequency supported by
 	  the CPU.
 
+config CPU_FREQ_DEFAULT_GOV_POWERSAVE
+        bool "powersave"
+        select CPU_FREQ_GOV_POWERSAVE
+        help
+          Use the CPUFreq governor 'powersave' as default. This sets
+          the frequency statically to the lowest frequency supported by
+          the CPU.
+
 config CPU_FREQ_DEFAULT_GOV_USERSPACE
 	bool "userspace"
 	select CPU_FREQ_GOV_USERSPACE
@@ -75,6 +83,22 @@
 	  program shall be able to set the CPU dynamically without having
 	  to enable the userspace governor manually.
 
+config CPU_FREQ_DEFAULT_GOV_ONDEMAND
+        bool "ondemand"
+        select CPU_FREQ_GOV_ONDEMAND
+        help
+          Use the CPUFreq governor 'ondemand' as default. This governor
+          does a periodic polling and changes frequency based on the 
+          CPU utilization.
+
+config CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
+        bool "conservative"
+        select CPU_FREQ_GOV_CONSERVATIVE
+        help
+          Use the CPUFreq governor 'conservative' as default. This governor
+          does a periodic polling and changes frequency based on the 
+          CPU utilization.
+
 endchoice
 
 config CPU_FREQ_GOV_PERFORMANCE
include/linux/cpufreq.h +9 -0
diff -ur linux-2.6.21.2-vanilla/include/linux/cpufreq.h linux-2.6.21.2/include/linux/cpufreq.h
@@ -283,9 +283,18 @@
 #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
 extern struct cpufreq_governor cpufreq_gov_performance;
 #define CPUFREQ_DEFAULT_GOVERNOR	&cpufreq_gov_performance
+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE)
+extern struct cpufreq_governor cpufreq_gov_powersave;
+#define CPUFREQ_DEFAULT_GOVERNOR	&cpufreq_gov_powersave
 #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
 extern struct cpufreq_governor cpufreq_gov_userspace;
 #define CPUFREQ_DEFAULT_GOVERNOR	&cpufreq_gov_userspace
+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND)
+extern struct cpufreq_governor cpufreq_gov_ondemand;
+#define CPUFREQ_DEFAULT_GOVERNOR	&cpufreq_gov_ondemand
+#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE)
+extern struct cpufreq_governor cpufreq_gov_conservative;
+#define CPUFREQ_DEFAULT_GOVERNOR	&cpufreq_gov_conservative
 #endif
 
 

_______________________________________________
Cpufreq mailing list
[email protected]
http://lists.linux.org.uk/mailman/listinfo/cpufreq