From: Ben Hutchings Date: Thu, 3 Nov 2016 21:25:26 +0000 (-0600) Subject: cpupower: Fix checks for CPU existence X-Git-Tag: archive/raspbian/4.9.13-1+rpi1~11^2^2^2^2^2^2~8 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=90d22326c896782addb4fbaa98f2bed945f8d68d;p=linux-4.9.git cpupower: Fix checks for CPU existence Calls to cpufreq_cpu_exists(cpu) were converted to cpupower_is_cpu_online(cpu) when libcpupower was introduced and the former function was deleted. However, cpupower_is_cpu_online() returns 1 on success whereas cpufreq_cpu_exists() returned 0 on success. It also does not distinguish physically absent and offline CPUs, and does not set errno. In cpufreq-set, test for cpupower_is_cpu_online(cpu) != 1. In cpufreq-bench, which prints an error message for offline CPUs, properly distinguish and report the zero and negative cases. Reported-by: Jose Reported-by: Julien RIVAUD Cc: stable # 4.7+ Fixes: ac5a181d065d ("cpupower: Add cpuidle parts into library") Signed-off-by: Ben Hutchings Gbp-Pq: Topic bugfix/all Gbp-Pq: Name cpupower-fix-checks-for-cpu-existence.patch --- diff --git a/tools/power/cpupower/bench/system.c b/tools/power/cpupower/bench/system.c index c25a74ae51ba..fd1bb3790ceb 100644 --- a/tools/power/cpupower/bench/system.c +++ b/tools/power/cpupower/bench/system.c @@ -58,12 +58,19 @@ long long int get_time() int set_cpufreq_governor(char *governor, unsigned int cpu) { + int rc; dprintf("set %s as cpufreq governor\n", governor); - if (cpupower_is_cpu_online(cpu) != 0) { - perror("cpufreq_cpu_exists"); - fprintf(stderr, "error: cpu %u does not exist\n", cpu); + rc = cpupower_is_cpu_online(cpu); + if (rc != 1) { + if (rc < 0) + fprintf(stderr, "cpupower_is_cpu_online: %s\n", + strerror(-rc)); + else + fprintf(stderr, + "error: cpu %u is offline or does not exist\n", + cpu); return -1; } diff --git a/tools/power/cpupower/utils/cpufreq-set.c b/tools/power/cpupower/utils/cpufreq-set.c index b4bf76971dc9..1eef0aed6423 100644 --- a/tools/power/cpupower/utils/cpufreq-set.c +++ b/tools/power/cpupower/utils/cpufreq-set.c @@ -296,7 +296,7 @@ int cmd_freq_set(int argc, char **argv) struct cpufreq_affected_cpus *cpus; if (!bitmask_isbitset(cpus_chosen, cpu) || - cpupower_is_cpu_online(cpu)) + cpupower_is_cpu_online(cpu) != 1) continue; cpus = cpufreq_get_related_cpus(cpu); @@ -316,10 +316,7 @@ int cmd_freq_set(int argc, char **argv) cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu) || - cpupower_is_cpu_online(cpu)) - continue; - - if (cpupower_is_cpu_online(cpu) != 1) + cpupower_is_cpu_online(cpu) != 1) continue; printf(_("Setting cpu: %d\n"), cpu);