#include <linux/workqueue.h>
#include "cpufreq_governor.h"
+static DEFINE_MUTEX(cpufreq_governor_lock);
static struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
{
int rc;
int governor = cdata->governor;
+ mutex_lock(&cpufreq_governor_lock);
if (have_governor_per_policy())
dbs_data = policy->governor_data;
else
} else if (dbs_data) {
dbs_data->usage_count++;
policy->governor_data = dbs_data;
+ mutex_unlock(&cpufreq_governor_lock);
return 0;
}
dbs_data = kzalloc(sizeof(*dbs_data), GFP_KERNEL);
if (!dbs_data) {
pr_err("%s: POLICY_INIT: kzalloc failed\n", __func__);
+ mutex_unlock(&cpufreq_governor_lock);
return -ENOMEM;
}
if (rc) {
pr_err("%s: POLICY_INIT: init() failed\n", __func__);
kfree(dbs_data);
+ mutex_unlock(&cpufreq_governor_lock);
return rc;
}
if (rc) {
cdata->exit(dbs_data);
kfree(dbs_data);
+ mutex_unlock(&cpufreq_governor_lock);
return rc;
}
if (!have_governor_per_policy())
cdata->gdbs_data = dbs_data;
+ mutex_unlock(&cpufreq_governor_lock);
return 0;
case CPUFREQ_GOV_POLICY_EXIT:
if (!--dbs_data->usage_count) {
}
policy->governor_data = NULL;
+ mutex_unlock(&cpufreq_governor_lock);
return 0;
}
switch (event) {
case CPUFREQ_GOV_START:
- if (!policy->cur)
+ if (!policy->cur) {
+ mutex_unlock(&cpufreq_governor_lock);
return -EINVAL;
-
+ }
if (governor == GOV_CONSERVATIVE) {
cs_tuners = dbs_data->tuners;
cs_dbs_info = dbs_data->cdata->get_cpu_dbs_info_s(cpu);
mutex_unlock(&cpu_cdbs->timer_mutex);
break;
}
+ mutex_unlock(&cpufreq_governor_lock);
return 0;
}
EXPORT_SYMBOL_GPL(cpufreq_governor_dbs);