Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cpupower: Revert library ABI changes from commit ae2917093fb60bdc1ed3e

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>

authored by

Thomas Renninger and committed by
Shuah Khan
41ddb7e1 b3a987b0

+88 -24
+69 -11
tools/power/cpupower/lib/cpufreq.c
··· 332 332 } 333 333 334 334 335 - struct cpufreq_frequencies 336 - *cpufreq_get_frequencies(const char *type, unsigned int cpu) 335 + struct cpufreq_available_frequencies 336 + *cpufreq_get_available_frequencies(unsigned int cpu) 337 337 { 338 - struct cpufreq_frequencies *first = NULL; 339 - struct cpufreq_frequencies *current = NULL; 338 + struct cpufreq_available_frequencies *first = NULL; 339 + struct cpufreq_available_frequencies *current = NULL; 340 340 char one_value[SYSFS_PATH_MAX]; 341 341 char linebuf[MAX_LINE_LEN]; 342 - char fname[MAX_LINE_LEN]; 343 342 unsigned int pos, i; 344 343 unsigned int len; 345 344 346 - snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); 347 - 348 - len = sysfs_cpufreq_read_file(cpu, fname, 349 - linebuf, sizeof(linebuf)); 345 + len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies", 346 + linebuf, sizeof(linebuf)); 350 347 if (len == 0) 351 348 return NULL; 352 349 ··· 388 391 return NULL; 389 392 } 390 393 391 - void cpufreq_put_frequencies(struct cpufreq_frequencies *any) 394 + struct cpufreq_available_frequencies 395 + *cpufreq_get_boost_frequencies(unsigned int cpu) 392 396 { 393 - struct cpufreq_frequencies *tmp, *next; 397 + struct cpufreq_available_frequencies *first = NULL; 398 + struct cpufreq_available_frequencies *current = NULL; 399 + char one_value[SYSFS_PATH_MAX]; 400 + char linebuf[MAX_LINE_LEN]; 401 + unsigned int pos, i; 402 + unsigned int len; 403 + 404 + len = sysfs_cpufreq_read_file(cpu, "scaling_boost_frequencies", 405 + linebuf, sizeof(linebuf)); 406 + if (len == 0) 407 + return NULL; 408 + 409 + pos = 0; 410 + for (i = 0; i < len; i++) { 411 + if (linebuf[i] == ' ' || linebuf[i] == '\n') { 412 + if (i - pos < 2) 413 + continue; 414 + if (i - pos >= SYSFS_PATH_MAX) 415 + goto error_out; 416 + if (current) { 417 + current->next = malloc(sizeof(*current)); 418 + if (!current->next) 419 + goto error_out; 420 + current = current->next; 421 + } else { 422 + first = malloc(sizeof(*first)); 423 + if (!first) 424 + goto error_out; 425 + current = first; 426 + } 427 + current->first = first; 428 + current->next = NULL; 429 + 430 + memcpy(one_value, linebuf + pos, i - pos); 431 + one_value[i - pos] = '\0'; 432 + if (sscanf(one_value, "%lu", &current->frequency) != 1) 433 + goto error_out; 434 + 435 + pos = i + 1; 436 + } 437 + } 438 + 439 + return first; 440 + 441 + error_out: 442 + while (first) { 443 + current = first->next; 444 + free(first); 445 + first = current; 446 + } 447 + return NULL; 448 + } 449 + 450 + void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any) 451 + { 452 + struct cpufreq_available_frequencies *tmp, *next; 394 453 395 454 if (!any) 396 455 return; ··· 457 404 free(tmp); 458 405 tmp = next; 459 406 } 407 + } 408 + 409 + void cpufreq_put_boost_frequencies(struct cpufreq_available_frequencies *any) 410 + { 411 + cpufreq_put_available_frequencies(any); 460 412 } 461 413 462 414 static struct cpufreq_affected_cpus *sysfs_get_cpu_list(unsigned int cpu,
+13 -7
tools/power/cpupower/lib/cpufreq.h
··· 20 20 struct cpufreq_available_governors *first; 21 21 }; 22 22 23 - struct cpufreq_frequencies { 23 + struct cpufreq_available_frequencies { 24 24 unsigned long frequency; 25 - struct cpufreq_frequencies *next; 26 - struct cpufreq_frequencies *first; 25 + struct cpufreq_available_frequencies *next; 26 + struct cpufreq_available_frequencies *first; 27 27 }; 28 28 29 29 ··· 124 124 * cpufreq_put_frequencies after use. 125 125 */ 126 126 127 - struct cpufreq_frequencies 128 - *cpufreq_get_frequencies(const char *type, unsigned int cpu); 127 + struct cpufreq_available_frequencies 128 + *cpufreq_get_available_frequencies(unsigned int cpu); 129 129 130 - void cpufreq_put_frequencies( 131 - struct cpufreq_frequencies *first); 130 + void cpufreq_put_available_frequencies( 131 + struct cpufreq_available_frequencies *first); 132 + 133 + struct cpufreq_available_frequencies 134 + *cpufreq_get_boost_frequencies(unsigned int cpu); 135 + 136 + void cpufreq_put_boost_frequencies( 137 + struct cpufreq_available_frequencies *first); 132 138 133 139 134 140 /* determine affected CPUs
+6 -6
tools/power/cpupower/utils/cpufreq-info.c
··· 244 244 245 245 static int get_boost_mode(unsigned int cpu) 246 246 { 247 - struct cpufreq_frequencies *freqs; 247 + struct cpufreq_available_frequencies *freqs; 248 248 249 249 if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || 250 250 cpupower_cpu_info.vendor == X86_VENDOR_HYGON || 251 251 cpupower_cpu_info.vendor == X86_VENDOR_INTEL) 252 252 return get_boost_mode_x86(cpu); 253 253 254 - freqs = cpufreq_get_frequencies("boost", cpu); 254 + freqs = cpufreq_get_boost_frequencies(cpu); 255 255 if (freqs) { 256 256 printf(_(" boost frequency steps: ")); 257 257 while (freqs->next) { ··· 261 261 } 262 262 print_speed(freqs->frequency); 263 263 printf("\n"); 264 - cpufreq_put_frequencies(freqs); 264 + cpufreq_put_available_frequencies(freqs); 265 265 } 266 266 267 267 return 0; ··· 475 475 476 476 static void debug_output_one(unsigned int cpu) 477 477 { 478 - struct cpufreq_frequencies *freqs; 478 + struct cpufreq_available_frequencies *freqs; 479 479 480 480 get_driver(cpu); 481 481 get_related_cpus(cpu); ··· 483 483 get_latency(cpu, 1); 484 484 get_hardware_limits(cpu, 1); 485 485 486 - freqs = cpufreq_get_frequencies("available", cpu); 486 + freqs = cpufreq_get_available_frequencies(cpu); 487 487 if (freqs) { 488 488 printf(_(" available frequency steps: ")); 489 489 while (freqs->next) { ··· 493 493 } 494 494 print_speed(freqs->frequency); 495 495 printf("\n"); 496 - cpufreq_put_frequencies(freqs); 496 + cpufreq_put_available_frequencies(freqs); 497 497 } 498 498 499 499 get_available_governors(cpu);