Skip to content

Commit a79a588

Browse files
committed
Merge tag 'pm-6.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management fixes from Rafael Wysocki: "These address system suspend failures under memory pressure in some configurations, fix up RAPL handling on platforms where PL1 cannot be disabled, and fix a documentation typo: - Prevent the Intel RAPL power capping driver from allowing PL1 to be exceeded by mistake on systems when PL1 cannot be disabled (Zhang Rui) - Fix a typo in the ABI documentation (Sumanth Gavini) - Allow swap to be used a bit longer during system suspend and hibernation to avoid suspend failures under memory pressure (Mario Limonciello)" * tag 'pm-6.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: PM: sleep: docs: Replace "diasble" with "disable" powercap: intel_rapl: Do not change CLAMPING bit if ENABLE bit cannot be changed PM: Restrict swap use to later in the suspend sequence
2 parents 49dcc4f + 250d057 commit a79a588

File tree

8 files changed

+29
-13
lines changed

8 files changed

+29
-13
lines changed

Documentation/ABI/testing/sysfs-devices-power

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ Date: January 2009
5656
Contact: Rafael J. Wysocki <[email protected]>
5757
Description:
5858
The /sys/devices/.../async attribute allows the user space to
59-
enable or diasble the device's suspend and resume callbacks to
59+
enable or disable the device's suspend and resume callbacks to
6060
be executed asynchronously (ie. in separate threads, in parallel
6161
with the main suspend/resume thread) during system-wide power
6262
transitions (eg. suspend to RAM, hibernation).

drivers/base/power/main.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,7 @@ void dpm_complete(pm_message_t state)
12361236
*/
12371237
void dpm_resume_end(pm_message_t state)
12381238
{
1239+
pm_restore_gfp_mask();
12391240
dpm_resume(state);
12401241
dpm_complete(state);
12411242
}
@@ -2176,8 +2177,10 @@ int dpm_suspend_start(pm_message_t state)
21762177
error = dpm_prepare(state);
21772178
if (error)
21782179
dpm_save_failed_step(SUSPEND_PREPARE);
2179-
else
2180+
else {
2181+
pm_restrict_gfp_mask();
21802182
error = dpm_suspend(state);
2183+
}
21812184

21822185
dpm_show_time(starttime, state, error, "start");
21832186
return error;

drivers/powercap/intel_rapl_common.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,12 +341,28 @@ static int set_domain_enable(struct powercap_zone *power_zone, bool mode)
341341
{
342342
struct rapl_domain *rd = power_zone_to_rapl_domain(power_zone);
343343
struct rapl_defaults *defaults = get_defaults(rd->rp);
344+
u64 val;
344345
int ret;
345346

346347
cpus_read_lock();
347348
ret = rapl_write_pl_data(rd, POWER_LIMIT1, PL_ENABLE, mode);
348-
if (!ret && defaults->set_floor_freq)
349+
if (ret)
350+
goto end;
351+
352+
ret = rapl_read_pl_data(rd, POWER_LIMIT1, PL_ENABLE, false, &val);
353+
if (ret)
354+
goto end;
355+
356+
if (mode != val) {
357+
pr_debug("%s cannot be %s\n", power_zone->name,
358+
str_enabled_disabled(mode));
359+
goto end;
360+
}
361+
362+
if (defaults->set_floor_freq)
349363
defaults->set_floor_freq(rd, mode);
364+
365+
end:
350366
cpus_read_unlock();
351367

352368
return ret;

include/linux/suspend.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,8 @@ extern int unregister_pm_notifier(struct notifier_block *nb);
446446
extern void ksys_sync_helper(void);
447447
extern void pm_report_hw_sleep_time(u64 t);
448448
extern void pm_report_max_hw_sleep(u64 t);
449+
void pm_restrict_gfp_mask(void);
450+
void pm_restore_gfp_mask(void);
449451

450452
#define pm_notifier(fn, pri) { \
451453
static struct notifier_block fn##_nb = \
@@ -492,6 +494,9 @@ static inline int unregister_pm_notifier(struct notifier_block *nb)
492494
static inline void pm_report_hw_sleep_time(u64 t) {};
493495
static inline void pm_report_max_hw_sleep(u64 t) {};
494496

497+
static inline void pm_restrict_gfp_mask(void) {}
498+
static inline void pm_restore_gfp_mask(void) {}
499+
495500
static inline void ksys_sync_helper(void) {}
496501

497502
#define pm_notifier(fn, pri) do { (void)(fn); } while (0)

kernel/kexec_core.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,7 @@ int kernel_kexec(void)
11361136
Resume_devices:
11371137
dpm_resume_end(PMSG_RESTORE);
11381138
Resume_console:
1139+
pm_restore_gfp_mask();
11391140
console_resume_all();
11401141
thaw_processes();
11411142
Restore_console:

kernel/power/hibernate.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,6 @@ int hibernation_snapshot(int platform_mode)
423423
}
424424

425425
console_suspend_all();
426-
pm_restrict_gfp_mask();
427426

428427
error = dpm_suspend(PMSG_FREEZE);
429428

@@ -559,7 +558,6 @@ int hibernation_restore(int platform_mode)
559558

560559
pm_prepare_console();
561560
console_suspend_all();
562-
pm_restrict_gfp_mask();
563561
error = dpm_suspend_start(PMSG_QUIESCE);
564562
if (!error) {
565563
error = resume_target_kernel(platform_mode);
@@ -571,7 +569,6 @@ int hibernation_restore(int platform_mode)
571569
BUG_ON(!error);
572570
}
573571
dpm_resume_end(PMSG_RECOVER);
574-
pm_restore_gfp_mask();
575572
console_resume_all();
576573
pm_restore_console();
577574
return error;

kernel/power/power.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,6 @@ static inline void suspend_test_finish(const char *label) {}
239239
/* kernel/power/main.c */
240240
extern int pm_notifier_call_chain_robust(unsigned long val_up, unsigned long val_down);
241241
extern int pm_notifier_call_chain(unsigned long val);
242-
void pm_restrict_gfp_mask(void);
243-
void pm_restore_gfp_mask(void);
244-
#else
245-
static inline void pm_restrict_gfp_mask(void) {}
246-
static inline void pm_restore_gfp_mask(void) {}
247242
#endif
248243

249244
#ifdef CONFIG_HIGHMEM

kernel/power/suspend.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@ int suspend_devices_and_enter(suspend_state_t state)
540540
return error;
541541

542542
Recover_platform:
543+
pm_restore_gfp_mask();
543544
platform_recover(state);
544545
goto Resume_devices;
545546
}
@@ -606,9 +607,7 @@ static int enter_state(suspend_state_t state)
606607

607608
trace_suspend_resume(TPS("suspend_enter"), state, false);
608609
pm_pr_dbg("Suspending system (%s)\n", mem_sleep_labels[state]);
609-
pm_restrict_gfp_mask();
610610
error = suspend_devices_and_enter(state);
611-
pm_restore_gfp_mask();
612611

613612
Finish:
614613
events_check_enabled = false;

0 commit comments

Comments
 (0)