History

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

Pull power management fixes from Rafael Wysocki: "These fix issues related to the handling of compressed hibernation images and a recent intel_pstate driver regression: - Fix issues related to using inadequate data types and incorrect use of atomic variables in the compressed hibernation images handling code that were introduced during the 6.9 development cycle (Mario Limonciello) - Move a X86_FEATURE_IDA check from turbo_is_disabled() to the places where a new value for MSR_IA32_PERF_CTL is computed in intel_pstate to address a regression preventing users from enabling turbo frequencies post-boot (Srinivas Pandruvada)" * tag 'pm-6.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: cpufreq: intel_pstate: Check IDA only before MSR_IA32_PERF_CTL writes PM: hibernate: Fix style issues in save_compressed_image() PM: hibernate: Use atomic64_t for compressed_size variable PM: hibernate: Emit an error when image writing fails

Linus Torvalds committed 1 year ago

Commit aecba2e2 parents 6a3cc1b 161284b2 files · +17 −14Browse files

Unified · Split

2 files
  1. drivers/cpufreq/intel_pstate.c +4 −5
  2. kernel/power/swap.c +13 −9
drivers/cpufreq/intel_pstate.c+4−5
@@ -603,9 +603,6 @@ static bool turbo_is_disabled(void) · 602 unmodified lines
603603 {
604604 u64 misc_en;
605605
606− if (!cpu_feature_enabled(X86_FEATURE_IDA))
607− return true;
608−
609606 rdmsrq(MSR_IA32_MISC_ENABLE, misc_en);
610607
611608 return !!(misc_en & MSR_IA32_MISC_ENABLE_TURBO_DISABLE);
@@ -2106,7 +2103,8 @@ static u64 atom_get_val(struct cpudata *cpudata, int pstate) · 1494 unmodified lines
21062103 u32 vid;
21072104
21082105 val = (u64)pstate << 8;
2109− if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
2106+ if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled) &&
2107+ cpu_feature_enabled(X86_FEATURE_IDA))
21102108 val |= (u64)1 << 32;
21112109
21122110 vid_fp = cpudata->vid.min + mul_fp(
@@ -2271,7 +2269,8 @@ static u64 core_get_val(struct cpudata *cpudata, int pstate) · 158 unmodified lines
22712269 u64 val;
22722270
22732271 val = (u64)pstate << 8;
2274− if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
2272+ if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled) &&
2273+ cpu_feature_enabled(X86_FEATURE_IDA))
22752274 val |= (u64)1 << 32;
22762275
22772276 return val;
kernel/power/swap.c+13−9
@@ -635,7 +635,7 @@ struct cmp_data { · 634 unmodified lines
635635 };
636636
637637 /* Indicates the image size after compression */
638−static atomic_t compressed_size = ATOMIC_INIT(0);
638+static atomic64_t compressed_size = ATOMIC_INIT(0);
639639
640640 /*
641641 * Compression function that runs in its own thread.
@@ -664,7 +664,7 @@ static int compress_threadfn(void *data) · 22 unmodified lines
664664 d->ret = crypto_acomp_compress(d->cr);
665665 d->cmp_len = d->cr->dlen;
666666
667− atomic_set(&compressed_size, atomic_read(&compressed_size) + d->cmp_len);
667+ atomic64_add(d->cmp_len, &compressed_size);
668668 atomic_set_release(&d->stop, 1);
669669 wake_up(&d->done);
670670 }
@@ -689,14 +689,14 @@ static int save_compressed_image(struct swap_map_handle *handle, · 18 unmodified lines
689689 ktime_t start;
690690 ktime_t stop;
691691 size_t off;
692− unsigned thr, run_threads, nr_threads;
692+ unsigned int thr, run_threads, nr_threads;
693693 unsigned char *page = NULL;
694694 struct cmp_data *data = NULL;
695695 struct crc_data *crc = NULL;
696696
697697 hib_init_batch(&hb);
698698
699− atomic_set(&compressed_size, 0);
699+ atomic64_set(&compressed_size, 0);
700700
701701 /*
702702 * We'll limit the number of threads for compression to limit memory
@@ -877,11 +877,14 @@ out_finish: · 174 unmodified lines
877877 stop = ktime_get();
878878 if (!ret)
879879 ret = err2;
880− if (!ret)
880+ if (!ret) {
881+ swsusp_show_speed(start, stop, nr_to_write, "Wrote");
882+ pr_info("Image size after compression: %lld kbytes\n",
883+ (atomic64_read(&compressed_size) / 1024));
881884 pr_info("Image saving done\n");
882− swsusp_show_speed(start, stop, nr_to_write, "Wrote");
883− pr_info("Image size after compression: %d kbytes\n",
884− (atomic_read(&compressed_size) / 1024));
885+ } else {
886+ pr_err("Image saving failed: %d\n", ret);
887+ }
885888
886889 out_clean:
887890 hib_finish_batch(&hb);
@@ -899,7 +902,8 @@ out_clean: · 11 unmodified lines
899902 }
900903 vfree(data);
901904 }
902− if (page) free_page((unsigned long)page);
905+ if (page)
906+ free_page((unsigned long)page);
903907
904908 return ret;
905909 }