History

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()

Linus Torvalds committed 3 years ago

Commit d3f70432 parents c830632 5783ecc4 files · +32 −26Browse files

Unified · Split

4 files
  1. drivers/cpufreq/acpi-cpufreq.c +1 −1
  2. drivers/cpufreq/pcc-cpufreq.c +1 −1
  3. tools/power/cpupower/lib/powercap.c +16 −7
  4. tools/power/cpupower/utils/idle_monitor/mperf_monitor.c +14 −17
drivers/cpufreq/acpi-cpufreq.c+1−1
@@ -975,7 +975,7 @@ static int __init acpi_cpufreq_probe(struct platform_device *pdev) · 974 unmodified lines
975975
976976 /* don't keep reloading if cpufreq_driver exists */
977977 if (cpufreq_get_current_driver())
978− return -EEXIST;
978+ return -ENODEV;
979979
980980 pr_debug("%s\n", __func__);
981981
drivers/cpufreq/pcc-cpufreq.c+1−1
@@ -583,7 +583,7 @@ static int __init pcc_cpufreq_probe(struct platform_device *pdev) · 582 unmodified lines
583583
584584 /* Skip initialization if another cpufreq driver is there. */
585585 if (cpufreq_get_current_driver())
586− return -EEXIST;
586+ return -ENODEV;
587587
588588 if (acpi_disabled)
589589 return -ENODEV;
tools/power/cpupower/lib/powercap.c+16−7
@@ -40,25 +40,34 @@ static int sysfs_get_enabled(char *path, int *mode) · 39 unmodified lines
4040 {
4141 int fd;
4242 char yes_no;
43+ int ret = 0;
4344
4445 *mode = 0;
4546
4647 fd = open(path, O_RDONLY);
47− if (fd == -1)
48− return -1;
48+ if (fd == -1) {
49+ ret = -1;
50+ goto out;
51+ }
4952
5053 if (read(fd, &yes_no, 1) != 1) {
51− close(fd);
52− return -1;
54+ ret = -1;
55+ goto out_close;
5356 }
5457
5558 if (yes_no == '1') {
5659 *mode = 1;
57− return 0;
60+ goto out_close;
5861 } else if (yes_no == '0') {
59− return 0;
62+ goto out_close;
63+ } else {
64+ ret = -1;
65+ goto out_close;
6066 }
61− return -1;
67+out_close:
68+ close(fd);
69+out:
70+ return ret;
6271 }
6372
6473 int powercap_get_enabled(int *mode)
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c+14−17
@@ -70,8 +70,8 @@ static int max_freq_mode; · 69 unmodified lines
7070 */
7171 static unsigned long max_frequency;
7272
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;
7575 static unsigned long long *mperf_previous_count;
7676 static unsigned long long *aperf_previous_count;
7777 static unsigned long long *mperf_current_count;
@@ -169,7 +169,7 @@ static int mperf_get_count_percent(unsigned int id, double *percent, · 91 unmodified lines
169169 aperf_diff = aperf_current_count[cpu] - aperf_previous_count[cpu];
170170
171171 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];
173173 *percent = 100.0 * mperf_diff / tsc_diff;
174174 dprint("%s: TSC Ref - mperf_diff: %llu, tsc_diff: %llu\n",
175175 mperf_cstates[id].name, mperf_diff, tsc_diff);
@@ -206,7 +206,7 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count, · 30 unmodified lines
206206
207207 if (max_freq_mode == MAX_FREQ_TSC_REF) {
208208 /* 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];
210210 time_diff = timespec_diff_us(time_start, time_end);
211211 max_frequency = tsc_diff / time_diff;
212212 }
@@ -225,33 +225,27 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count, · 12 unmodified lines
225225 static int mperf_start(void)
226226 {
227227 int cpu;
228− unsigned long long dbg;
229228
230229 clock_gettime(CLOCK_REALTIME, &time_start);
231− mperf_get_tsc(&tsc_at_measure_start);
232230
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]);
234233 mperf_init_stats(cpu);
234+ }
235235
236− mperf_get_tsc(&dbg);
237− dprint("TSC diff: %llu\n", dbg - tsc_at_measure_start);
238236 return 0;
239237 }
240238
241239 static int mperf_stop(void)
242240 {
243− unsigned long long dbg;
244241 int cpu;
245242
246− for (cpu = 0; cpu < cpu_count; cpu++)
243+ for (cpu = 0; cpu < cpu_count; cpu++) {
247244 mperf_measure_stats(cpu);
245+ mperf_get_tsc(&tsc_at_measure_end[cpu]);
246+ }
248247
249− mperf_get_tsc(&tsc_at_measure_end);
250248 clock_gettime(CLOCK_REALTIME, &time_end);
251−
252− mperf_get_tsc(&dbg);
253− dprint("TSC diff: %llu\n", dbg - tsc_at_measure_end);
254−
255249 return 0;
256250 }
257251
@@ -353,7 +347,8 @@ struct cpuidle_monitor *mperf_register(void) · 95 unmodified lines
353347 aperf_previous_count = calloc(cpu_count, sizeof(unsigned long long));
354348 mperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
355349 aperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
356−
350+ tsc_at_measure_start = calloc(cpu_count, sizeof(unsigned long long));
351+ tsc_at_measure_end = calloc(cpu_count, sizeof(unsigned long long));
357352 mperf_monitor.name_len = strlen(mperf_monitor.name);
358353 return &mperf_monitor;
359354 }
@@ -364,6 +359,8 @@ void mperf_unregister(void) · 4 unmodified lines
364359 free(aperf_previous_count);
365360 free(mperf_current_count);
366361 free(aperf_current_count);
362+ free(tsc_at_measure_start);
363+ free(tsc_at_measure_end);
367364 free(is_valid);
368365 }
369366