Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e53695f authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki
Browse files

cpufreq: governors: Fix WARN_ON() for multi-policy platforms



On multi-policy systems there is a single instance of governor for both the
policies (if same governor is chosen for both policies). With the code update
from following patches:

8eeed095 cpufreq: governors: Get rid of dbs_data->enable field
b394058f cpufreq: governors: Reset tunables only for cpufreq_unregister_governor()

We are creating/removing sysfs directory of governor for for every call to
GOV_START and STOP. This would fail for multi-policy system as there is a
per-policy call to START/STOP.

This patch reuses the governor->initialized variable to detect total users of
governor.

Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 4bd4e428
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1552,8 +1552,10 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
						policy->cpu, event);
	ret = policy->governor->governor(policy, event);

	if (!policy->governor->initialized && (event == CPUFREQ_GOV_START))
		policy->governor->initialized = 1;
	if (event == CPUFREQ_GOV_START)
		policy->governor->initialized++;
	else if (event == CPUFREQ_GOV_STOP)
		policy->governor->initialized--;

	/* we keep one module reference alive for
			each CPU governed by this CPU */
+19 −13
Original line number Diff line number Diff line
@@ -247,12 +247,14 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data,
					     dbs_data->gov_dbs_timer);
		}

		if (!policy->governor->initialized) {
			rc = sysfs_create_group(cpufreq_global_kobject,
					dbs_data->attr_group);
			if (rc) {
				mutex_unlock(&dbs_data->mutex);
				return rc;
			}
		}

		/*
		 * conservative does not implement micro like ondemand
@@ -262,13 +264,15 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data,
			cs_dbs_info->down_skip = 0;
			cs_dbs_info->enable = 1;
			cs_dbs_info->requested_freq = policy->cur;

			if (!policy->governor->initialized) {
				cpufreq_register_notifier(cs_ops->notifier_block,
						CPUFREQ_TRANSITION_NOTIFIER);

			if (!policy->governor->initialized)
				dbs_data->min_sampling_rate =
					MIN_SAMPLING_RATE_RATIO *
					jiffies_to_usecs(10);
			}
		} else {
			od_dbs_info->rate_mult = 1;
			od_dbs_info->sample_type = OD_NORMAL_SAMPLE;
@@ -311,11 +315,13 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data,
		mutex_lock(&dbs_data->mutex);
		mutex_destroy(&cpu_cdbs->timer_mutex);

		if (policy->governor->initialized == 1) {
			sysfs_remove_group(cpufreq_global_kobject,
					dbs_data->attr_group);
			if (dbs_data->governor == GOV_CONSERVATIVE)
				cpufreq_unregister_notifier(cs_ops->notifier_block,
						CPUFREQ_TRANSITION_NOTIFIER);
		}
		mutex_unlock(&dbs_data->mutex);

		break;