[PATCH 1/2] cpufreq: add __find_governor helper and clean up someerror handling

From: Jeremy Fitzhardinge
Date: Thu Jul 06 2006 - 15:28:43 EST


Adds a __find_governor() helper function to look up a governor by
name. Also restructures some error handling to conform to the
"single-exit" model which is generally preferred for kernel code.

Signed-off-by: Jeremy Fitzhardinge <jeremy@xxxxxxxx>

---
drivers/cpufreq/cpufreq.c | 59 ++++++++++++++++++++++++++-------------------
1 file changed, 35 insertions(+), 24 deletions(-)


diff -r 46ca283d1fe1 drivers/cpufreq/cpufreq.c
--- a/drivers/cpufreq/cpufreq.c Mon Jul 03 13:37:39 2006 -0700
+++ b/drivers/cpufreq/cpufreq.c Wed Jul 05 22:26:52 2006 -0700
@@ -284,39 +284,52 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transit
* SYSFS INTERFACE *
*********************************************************************/

+static struct cpufreq_governor *__find_governor(const char *str_governor)
+{
+ struct cpufreq_governor *t;
+
+ list_for_each_entry(t, &cpufreq_governor_list, governor_list)
+ if (!strnicmp(str_governor,t->name,CPUFREQ_NAME_LEN))
+ return t;
+
+ return NULL;
+}
+
/**
* cpufreq_parse_governor - parse a governor string
*/
static int cpufreq_parse_governor (char *str_governor, unsigned int *policy,
struct cpufreq_governor **governor)
{
+ int err = -EINVAL;
+
if (!cpufreq_driver)
- return -EINVAL;
+ goto out;
+
if (cpufreq_driver->setpolicy) {
if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
*policy = CPUFREQ_POLICY_PERFORMANCE;
- return 0;
+ err = 0;
} else if (!strnicmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) {
*policy = CPUFREQ_POLICY_POWERSAVE;
- return 0;
+ err = 0;
}
- return -EINVAL;
- } else {
+ } else if (cpufreq_driver->target) {
struct cpufreq_governor *t;
+
mutex_lock(&cpufreq_governor_mutex);
- if (!cpufreq_driver || !cpufreq_driver->target)
- goto out;
- list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
- if (!strnicmp(str_governor,t->name,CPUFREQ_NAME_LEN)) {
- *governor = t;
- mutex_unlock(&cpufreq_governor_mutex);
- return 0;
- }
+
+ t = __find_governor(str_governor);
+
+ if (t != NULL) {
+ *governor = t;
+ err = 0;
}
-out:
+
mutex_unlock(&cpufreq_governor_mutex);
}
- return -EINVAL;
+ out:
+ return err;
}


@@ -1273,23 +1286,21 @@ EXPORT_SYMBOL_GPL(cpufreq_governor);

int cpufreq_register_governor(struct cpufreq_governor *governor)
{
- struct cpufreq_governor *t;
+ int err;

if (!governor)
return -EINVAL;

mutex_lock(&cpufreq_governor_mutex);

- list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
- if (!strnicmp(governor->name,t->name,CPUFREQ_NAME_LEN)) {
- mutex_unlock(&cpufreq_governor_mutex);
- return -EBUSY;
- }
- }
- list_add(&governor->governor_list, &cpufreq_governor_list);
+ err = -EBUSY;
+ if (__find_governor(governor->name) == NULL) {
+ err = 0;
+ list_add(&governor->governor_list, &cpufreq_governor_list);
+ }

mutex_unlock(&cpufreq_governor_mutex);
- return 0;
+ return err;
}
EXPORT_SYMBOL_GPL(cpufreq_register_governor);


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/