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

Commit 9c9a43ed authored by Mattia Dongili's avatar Mattia Dongili Committed by Dave Jones
Browse files

[CPUFREQ] return error when failing to set minfreq



I just stumbled on this bug/feature, this is how to reproduce it:

# echo 450000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
# echo 450000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
# echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# cpufreq-info -p
450000 450000 powersave
# echo 1800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq ; echo $?
0
# cpufreq-info -p
450000 450000 powersave

Here it is. The kernel refuses to set a min_freq higher than the
max_freq but it allows a max_freq lower than min_freq (lowering min_freq
also).

This behaviour is pretty straightforward (but undocumented) and it
doesn't return an error altough failing to accomplish the requested
action (set min_freq).
The problem (IMO) is basically that userspace is not allowed to set a
full policy atomically while the kernel always does that thus it must
enforce an ordering on operations.

The attached patch returns -EINVAL if trying to increase frequencies
starting from scaling_min_freq and documents the correct ordering of writes.

Signed-off-by: default avatarMattia Dongili <malattia@linux.it>
Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>
Signed-off-by: default avatarDave Jones <davej@redhat.com>

--
parent 49b1e3ea
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -157,6 +157,9 @@ scaling_min_freq and
scaling_max_freq		show the current "policy limits" (in
scaling_max_freq		show the current "policy limits" (in
				kHz). By echoing new values into these
				kHz). By echoing new values into these
				files, you can change these limits.
				files, you can change these limits.
				NOTE: when setting a policy you need to
				first set scaling_max_freq, then
				scaling_min_freq.




If you have selected the "userspace" governor which allows you to
If you have selected the "userspace" governor which allows you to
+5 −0
Original line number Original line Diff line number Diff line
@@ -1343,6 +1343,11 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli


	memcpy(&policy->cpuinfo, &data->cpuinfo, sizeof(struct cpufreq_cpuinfo));
	memcpy(&policy->cpuinfo, &data->cpuinfo, sizeof(struct cpufreq_cpuinfo));


	if (policy->min > data->min && policy->min > policy->max) {
		ret = -EINVAL;
		goto error_out;
	}

	/* verify the cpu speed can be set within this limit */
	/* verify the cpu speed can be set within this limit */
	ret = cpufreq_driver->verify(policy);
	ret = cpufreq_driver->verify(policy);
	if (ret)
	if (ret)