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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pm-6.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management fixes from Rafael Wysocki:
"These fix two issues in the cpupower utility and get rid of a spurious
warning message printed to the kernel log by the ACPI cpufreq driver
after recent changes.

Specifics:

- Get rid of a warning message printed by the ACPI cpufreq driver
after recent changes in it when anohter CPU performance scaling
driver is registered already when it starts (Petr Pavlu)

- Make cpupower read TSC on each CPU right before reading MPERF so as
to reduce the potential time difference between the TSC and MPERF
accesses and improve the C0 percentage calculation (Wyes Karny)

- Fix a possible file handle leak and clean up the code in the
sysfs_get_enabled() function in cpupower (Hao Zeng)"

* tag 'pm-6.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
cpufreq: ACPI: Prevent a warning when another frequency driver is loaded
cpupower: Make TSC read per CPU for Mperf monitor
cpupower:Fix resource leaks in sysfs_get_enabled()

+32 -26
+1 -1
drivers/cpufreq/acpi-cpufreq.c
··· 975 975 976 976 /* don't keep reloading if cpufreq_driver exists */ 977 977 if (cpufreq_get_current_driver()) 978 - return -EEXIST; 978 + return -ENODEV; 979 979 980 980 pr_debug("%s\n", __func__); 981 981
+1 -1
drivers/cpufreq/pcc-cpufreq.c
··· 583 583 584 584 /* Skip initialization if another cpufreq driver is there. */ 585 585 if (cpufreq_get_current_driver()) 586 - return -EEXIST; 586 + return -ENODEV; 587 587 588 588 if (acpi_disabled) 589 589 return -ENODEV;
+16 -7
tools/power/cpupower/lib/powercap.c
··· 40 40 { 41 41 int fd; 42 42 char yes_no; 43 + int ret = 0; 43 44 44 45 *mode = 0; 45 46 46 47 fd = open(path, O_RDONLY); 47 - if (fd == -1) 48 - return -1; 48 + if (fd == -1) { 49 + ret = -1; 50 + goto out; 51 + } 49 52 50 53 if (read(fd, &yes_no, 1) != 1) { 51 - close(fd); 52 - return -1; 54 + ret = -1; 55 + goto out_close; 53 56 } 54 57 55 58 if (yes_no == '1') { 56 59 *mode = 1; 57 - return 0; 60 + goto out_close; 58 61 } else if (yes_no == '0') { 59 - return 0; 62 + goto out_close; 63 + } else { 64 + ret = -1; 65 + goto out_close; 60 66 } 61 - return -1; 67 + out_close: 68 + close(fd); 69 + out: 70 + return ret; 62 71 } 63 72 64 73 int powercap_get_enabled(int *mode)
+14 -17
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
··· 70 70 */ 71 71 static unsigned long max_frequency; 72 72 73 - static unsigned long long tsc_at_measure_start; 74 - static unsigned long long tsc_at_measure_end; 73 + static unsigned long long *tsc_at_measure_start; 74 + static unsigned long long *tsc_at_measure_end; 75 75 static unsigned long long *mperf_previous_count; 76 76 static unsigned long long *aperf_previous_count; 77 77 static unsigned long long *mperf_current_count; ··· 169 169 aperf_diff = aperf_current_count[cpu] - aperf_previous_count[cpu]; 170 170 171 171 if (max_freq_mode == MAX_FREQ_TSC_REF) { 172 - tsc_diff = tsc_at_measure_end - tsc_at_measure_start; 172 + tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu]; 173 173 *percent = 100.0 * mperf_diff / tsc_diff; 174 174 dprint("%s: TSC Ref - mperf_diff: %llu, tsc_diff: %llu\n", 175 175 mperf_cstates[id].name, mperf_diff, tsc_diff); ··· 206 206 207 207 if (max_freq_mode == MAX_FREQ_TSC_REF) { 208 208 /* Calculate max_freq from TSC count */ 209 - tsc_diff = tsc_at_measure_end - tsc_at_measure_start; 209 + tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu]; 210 210 time_diff = timespec_diff_us(time_start, time_end); 211 211 max_frequency = tsc_diff / time_diff; 212 212 } ··· 225 225 static int mperf_start(void) 226 226 { 227 227 int cpu; 228 - unsigned long long dbg; 229 228 230 229 clock_gettime(CLOCK_REALTIME, &time_start); 231 - mperf_get_tsc(&tsc_at_measure_start); 232 230 233 - for (cpu = 0; cpu < cpu_count; cpu++) 231 + for (cpu = 0; cpu < cpu_count; cpu++) { 232 + mperf_get_tsc(&tsc_at_measure_start[cpu]); 234 233 mperf_init_stats(cpu); 234 + } 235 235 236 - mperf_get_tsc(&dbg); 237 - dprint("TSC diff: %llu\n", dbg - tsc_at_measure_start); 238 236 return 0; 239 237 } 240 238 241 239 static int mperf_stop(void) 242 240 { 243 - unsigned long long dbg; 244 241 int cpu; 245 242 246 - for (cpu = 0; cpu < cpu_count; cpu++) 243 + for (cpu = 0; cpu < cpu_count; cpu++) { 247 244 mperf_measure_stats(cpu); 245 + mperf_get_tsc(&tsc_at_measure_end[cpu]); 246 + } 248 247 249 - mperf_get_tsc(&tsc_at_measure_end); 250 248 clock_gettime(CLOCK_REALTIME, &time_end); 251 - 252 - mperf_get_tsc(&dbg); 253 - dprint("TSC diff: %llu\n", dbg - tsc_at_measure_end); 254 - 255 249 return 0; 256 250 } 257 251 ··· 347 353 aperf_previous_count = calloc(cpu_count, sizeof(unsigned long long)); 348 354 mperf_current_count = calloc(cpu_count, sizeof(unsigned long long)); 349 355 aperf_current_count = calloc(cpu_count, sizeof(unsigned long long)); 350 - 356 + tsc_at_measure_start = calloc(cpu_count, sizeof(unsigned long long)); 357 + tsc_at_measure_end = calloc(cpu_count, sizeof(unsigned long long)); 351 358 mperf_monitor.name_len = strlen(mperf_monitor.name); 352 359 return &mperf_monitor; 353 360 } ··· 359 364 free(aperf_previous_count); 360 365 free(mperf_current_count); 361 366 free(aperf_current_count); 367 + free(tsc_at_measure_start); 368 + free(tsc_at_measure_end); 362 369 free(is_valid); 363 370 } 364 371