| From 1aa27bd53a6a857e8246fad39cd7d7dfba74eca4 Mon Sep 17 00:00:00 2001 |
| From: Thomas Renninger <trenn@suse.de> |
| Date: Fri, 17 Jan 2020 08:55:54 +0100 |
| Subject: [PATCH] cpupower: Revert library ABI changes from commit |
| ae2917093fb60bdc1ed3e |
| |
| commit 41ddb7e1f79693d904502ae9bea609837973eff8 upstream. |
| |
| Commit ae2917093fb6 ("tools/power/cpupower: Display boost frequency |
| separately") modified the library function: |
| |
| struct cpufreq_available_frequencies |
| *cpufreq_get_available_frequencies(unsigned int cpu) |
| |
| to |
| struct cpufreq_frequencies |
| *cpufreq_get_frequencies(const char *type, unsigned int cpu) |
| |
| This patch recovers the old API and implements the new functionality |
| in a newly introduce method: |
| struct cpufreq_boost_frequencies |
| *cpufreq_get_available_frequencies(unsigned int cpu) |
| |
| This one should get merged into stable kernels back to 5.0 when |
| the above had been introduced. |
| |
| Fixes: ae2917093fb6 ("tools/power/cpupower: Display boost frequency separately") |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Thomas Renninger <trenn@suse.de> |
| Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/power/cpupower/lib/cpufreq.c b/tools/power/cpupower/lib/cpufreq.c |
| index 2f55d4d23446..6e04304560ca 100644 |
| --- a/tools/power/cpupower/lib/cpufreq.c |
| +++ b/tools/power/cpupower/lib/cpufreq.c |
| @@ -332,21 +332,74 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any) |
| } |
| |
| |
| -struct cpufreq_frequencies |
| -*cpufreq_get_frequencies(const char *type, unsigned int cpu) |
| +struct cpufreq_available_frequencies |
| +*cpufreq_get_available_frequencies(unsigned int cpu) |
| { |
| - struct cpufreq_frequencies *first = NULL; |
| - struct cpufreq_frequencies *current = NULL; |
| + struct cpufreq_available_frequencies *first = NULL; |
| + struct cpufreq_available_frequencies *current = NULL; |
| char one_value[SYSFS_PATH_MAX]; |
| char linebuf[MAX_LINE_LEN]; |
| - char fname[MAX_LINE_LEN]; |
| unsigned int pos, i; |
| unsigned int len; |
| |
| - snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); |
| + len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies", |
| + linebuf, sizeof(linebuf)); |
| + if (len == 0) |
| + return NULL; |
| |
| - len = sysfs_cpufreq_read_file(cpu, fname, |
| - linebuf, sizeof(linebuf)); |
| + pos = 0; |
| + for (i = 0; i < len; i++) { |
| + if (linebuf[i] == ' ' || linebuf[i] == '\n') { |
| + if (i - pos < 2) |
| + continue; |
| + if (i - pos >= SYSFS_PATH_MAX) |
| + goto error_out; |
| + if (current) { |
| + current->next = malloc(sizeof(*current)); |
| + if (!current->next) |
| + goto error_out; |
| + current = current->next; |
| + } else { |
| + first = malloc(sizeof(*first)); |
| + if (!first) |
| + goto error_out; |
| + current = first; |
| + } |
| + current->first = first; |
| + current->next = NULL; |
| + |
| + memcpy(one_value, linebuf + pos, i - pos); |
| + one_value[i - pos] = '\0'; |
| + if (sscanf(one_value, "%lu", ¤t->frequency) != 1) |
| + goto error_out; |
| + |
| + pos = i + 1; |
| + } |
| + } |
| + |
| + return first; |
| + |
| + error_out: |
| + while (first) { |
| + current = first->next; |
| + free(first); |
| + first = current; |
| + } |
| + return NULL; |
| +} |
| + |
| +struct cpufreq_available_frequencies |
| +*cpufreq_get_boost_frequencies(unsigned int cpu) |
| +{ |
| + struct cpufreq_available_frequencies *first = NULL; |
| + struct cpufreq_available_frequencies *current = NULL; |
| + char one_value[SYSFS_PATH_MAX]; |
| + char linebuf[MAX_LINE_LEN]; |
| + unsigned int pos, i; |
| + unsigned int len; |
| + |
| + len = sysfs_cpufreq_read_file(cpu, "scaling_boost_frequencies", |
| + linebuf, sizeof(linebuf)); |
| if (len == 0) |
| return NULL; |
| |
| @@ -391,9 +444,9 @@ struct cpufreq_frequencies |
| return NULL; |
| } |
| |
| -void cpufreq_put_frequencies(struct cpufreq_frequencies *any) |
| +void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any) |
| { |
| - struct cpufreq_frequencies *tmp, *next; |
| + struct cpufreq_available_frequencies *tmp, *next; |
| |
| if (!any) |
| return; |
| @@ -406,6 +459,11 @@ void cpufreq_put_frequencies(struct cpufreq_frequencies *any) |
| } |
| } |
| |
| +void cpufreq_put_boost_frequencies(struct cpufreq_available_frequencies *any) |
| +{ |
| + cpufreq_put_available_frequencies(any); |
| +} |
| + |
| static struct cpufreq_affected_cpus *sysfs_get_cpu_list(unsigned int cpu, |
| const char *file) |
| { |
| diff --git a/tools/power/cpupower/lib/cpufreq.h b/tools/power/cpupower/lib/cpufreq.h |
| index a55f0d19215b..95f4fd9e2656 100644 |
| --- a/tools/power/cpupower/lib/cpufreq.h |
| +++ b/tools/power/cpupower/lib/cpufreq.h |
| @@ -20,10 +20,10 @@ struct cpufreq_available_governors { |
| struct cpufreq_available_governors *first; |
| }; |
| |
| -struct cpufreq_frequencies { |
| +struct cpufreq_available_frequencies { |
| unsigned long frequency; |
| - struct cpufreq_frequencies *next; |
| - struct cpufreq_frequencies *first; |
| + struct cpufreq_available_frequencies *next; |
| + struct cpufreq_available_frequencies *first; |
| }; |
| |
| |
| @@ -124,11 +124,17 @@ void cpufreq_put_available_governors( |
| * cpufreq_put_frequencies after use. |
| */ |
| |
| -struct cpufreq_frequencies |
| -*cpufreq_get_frequencies(const char *type, unsigned int cpu); |
| +struct cpufreq_available_frequencies |
| +*cpufreq_get_available_frequencies(unsigned int cpu); |
| |
| -void cpufreq_put_frequencies( |
| - struct cpufreq_frequencies *first); |
| +void cpufreq_put_available_frequencies( |
| + struct cpufreq_available_frequencies *first); |
| + |
| +struct cpufreq_available_frequencies |
| +*cpufreq_get_boost_frequencies(unsigned int cpu); |
| + |
| +void cpufreq_put_boost_frequencies( |
| + struct cpufreq_available_frequencies *first); |
| |
| |
| /* determine affected CPUs |
| diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c |
| index e63cf55f81cf..6efc0f6b1b11 100644 |
| --- a/tools/power/cpupower/utils/cpufreq-info.c |
| +++ b/tools/power/cpupower/utils/cpufreq-info.c |
| @@ -244,14 +244,14 @@ static int get_boost_mode_x86(unsigned int cpu) |
| |
| static int get_boost_mode(unsigned int cpu) |
| { |
| - struct cpufreq_frequencies *freqs; |
| + struct cpufreq_available_frequencies *freqs; |
| |
| if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || |
| cpupower_cpu_info.vendor == X86_VENDOR_HYGON || |
| cpupower_cpu_info.vendor == X86_VENDOR_INTEL) |
| return get_boost_mode_x86(cpu); |
| |
| - freqs = cpufreq_get_frequencies("boost", cpu); |
| + freqs = cpufreq_get_boost_frequencies(cpu); |
| if (freqs) { |
| printf(_(" boost frequency steps: ")); |
| while (freqs->next) { |
| @@ -261,7 +261,7 @@ static int get_boost_mode(unsigned int cpu) |
| } |
| print_speed(freqs->frequency); |
| printf("\n"); |
| - cpufreq_put_frequencies(freqs); |
| + cpufreq_put_available_frequencies(freqs); |
| } |
| |
| return 0; |
| @@ -475,7 +475,7 @@ static int get_latency(unsigned int cpu, unsigned int human) |
| |
| static void debug_output_one(unsigned int cpu) |
| { |
| - struct cpufreq_frequencies *freqs; |
| + struct cpufreq_available_frequencies *freqs; |
| |
| get_driver(cpu); |
| get_related_cpus(cpu); |
| @@ -483,7 +483,7 @@ static void debug_output_one(unsigned int cpu) |
| get_latency(cpu, 1); |
| get_hardware_limits(cpu, 1); |
| |
| - freqs = cpufreq_get_frequencies("available", cpu); |
| + freqs = cpufreq_get_available_frequencies(cpu); |
| if (freqs) { |
| printf(_(" available frequency steps: ")); |
| while (freqs->next) { |
| @@ -493,7 +493,7 @@ static void debug_output_one(unsigned int cpu) |
| } |
| print_speed(freqs->frequency); |
| printf("\n"); |
| - cpufreq_put_frequencies(freqs); |
| + cpufreq_put_available_frequencies(freqs); |
| } |
| |
| get_available_governors(cpu); |
| -- |
| 2.7.4 |
| |