mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
Power management fixes for 6.16-rc5
- 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). -----BEGIN PGP SIGNATURE----- iQFGBAABCAAwFiEEcM8Aw/RY0dgsiRUR7l+9nS/U47UFAmhoNlcSHHJqd0Byand5 c29ja2kubmV0AAoJEO5fvZ0v1OO1ihIH/0cmL1jGT/syrPc9cKi3aWrzA0vn1TAp 28QCPmP0u35DoegSl2PclwcT66CKC1qPCqNTAgLZUBoXw4SILCxqorPdBJoj/jNi i4nhXwE7xRfAHuPpkCQRYcU/uVkSczF1SKtCz0Tvy8oacqEcHJ5wA3iqkr6CNCTe FZP+dkZB5citAaH09ysNQAQsewsrJEsgVQFwClgE0qzQrd1sRwVAuq8gtNlS4LFq 5vtRxpSwCAIFUCFKwxfWiRZBQNFoEJMcPXdPVo7L1AoV8L57Y8dwVPim0+mOiK4i LWoP165J9/U//r28ujVlxq96U7pv1F0fJ9mCPxTeyAU5YYsymZv5Et4= =bk6K -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
a79a588fc1
|
@ -56,7 +56,7 @@ Date: January 2009
|
|||
Contact: Rafael J. Wysocki <rjw@rjwysocki.net>
|
||||
Description:
|
||||
The /sys/devices/.../async attribute allows the user space to
|
||||
enable or diasble the device's suspend and resume callbacks to
|
||||
enable or disable the device's suspend and resume callbacks to
|
||||
be executed asynchronously (ie. in separate threads, in parallel
|
||||
with the main suspend/resume thread) during system-wide power
|
||||
transitions (eg. suspend to RAM, hibernation).
|
||||
|
|
|
@ -1236,6 +1236,7 @@ void dpm_complete(pm_message_t state)
|
|||
*/
|
||||
void dpm_resume_end(pm_message_t state)
|
||||
{
|
||||
pm_restore_gfp_mask();
|
||||
dpm_resume(state);
|
||||
dpm_complete(state);
|
||||
}
|
||||
|
@ -2176,8 +2177,10 @@ int dpm_suspend_start(pm_message_t state)
|
|||
error = dpm_prepare(state);
|
||||
if (error)
|
||||
dpm_save_failed_step(SUSPEND_PREPARE);
|
||||
else
|
||||
else {
|
||||
pm_restrict_gfp_mask();
|
||||
error = dpm_suspend(state);
|
||||
}
|
||||
|
||||
dpm_show_time(starttime, state, error, "start");
|
||||
return error;
|
||||
|
|
|
@ -341,12 +341,28 @@ static int set_domain_enable(struct powercap_zone *power_zone, bool mode)
|
|||
{
|
||||
struct rapl_domain *rd = power_zone_to_rapl_domain(power_zone);
|
||||
struct rapl_defaults *defaults = get_defaults(rd->rp);
|
||||
u64 val;
|
||||
int ret;
|
||||
|
||||
cpus_read_lock();
|
||||
ret = rapl_write_pl_data(rd, POWER_LIMIT1, PL_ENABLE, mode);
|
||||
if (!ret && defaults->set_floor_freq)
|
||||
if (ret)
|
||||
goto end;
|
||||
|
||||
ret = rapl_read_pl_data(rd, POWER_LIMIT1, PL_ENABLE, false, &val);
|
||||
if (ret)
|
||||
goto end;
|
||||
|
||||
if (mode != val) {
|
||||
pr_debug("%s cannot be %s\n", power_zone->name,
|
||||
str_enabled_disabled(mode));
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (defaults->set_floor_freq)
|
||||
defaults->set_floor_freq(rd, mode);
|
||||
|
||||
end:
|
||||
cpus_read_unlock();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -446,6 +446,8 @@ extern int unregister_pm_notifier(struct notifier_block *nb);
|
|||
extern void ksys_sync_helper(void);
|
||||
extern void pm_report_hw_sleep_time(u64 t);
|
||||
extern void pm_report_max_hw_sleep(u64 t);
|
||||
void pm_restrict_gfp_mask(void);
|
||||
void pm_restore_gfp_mask(void);
|
||||
|
||||
#define pm_notifier(fn, pri) { \
|
||||
static struct notifier_block fn##_nb = \
|
||||
|
@ -492,6 +494,9 @@ static inline int unregister_pm_notifier(struct notifier_block *nb)
|
|||
static inline void pm_report_hw_sleep_time(u64 t) {};
|
||||
static inline void pm_report_max_hw_sleep(u64 t) {};
|
||||
|
||||
static inline void pm_restrict_gfp_mask(void) {}
|
||||
static inline void pm_restore_gfp_mask(void) {}
|
||||
|
||||
static inline void ksys_sync_helper(void) {}
|
||||
|
||||
#define pm_notifier(fn, pri) do { (void)(fn); } while (0)
|
||||
|
|
|
@ -1136,6 +1136,7 @@ int kernel_kexec(void)
|
|||
Resume_devices:
|
||||
dpm_resume_end(PMSG_RESTORE);
|
||||
Resume_console:
|
||||
pm_restore_gfp_mask();
|
||||
console_resume_all();
|
||||
thaw_processes();
|
||||
Restore_console:
|
||||
|
|
|
@ -423,7 +423,6 @@ int hibernation_snapshot(int platform_mode)
|
|||
}
|
||||
|
||||
console_suspend_all();
|
||||
pm_restrict_gfp_mask();
|
||||
|
||||
error = dpm_suspend(PMSG_FREEZE);
|
||||
|
||||
|
@ -559,7 +558,6 @@ int hibernation_restore(int platform_mode)
|
|||
|
||||
pm_prepare_console();
|
||||
console_suspend_all();
|
||||
pm_restrict_gfp_mask();
|
||||
error = dpm_suspend_start(PMSG_QUIESCE);
|
||||
if (!error) {
|
||||
error = resume_target_kernel(platform_mode);
|
||||
|
@ -571,7 +569,6 @@ int hibernation_restore(int platform_mode)
|
|||
BUG_ON(!error);
|
||||
}
|
||||
dpm_resume_end(PMSG_RECOVER);
|
||||
pm_restore_gfp_mask();
|
||||
console_resume_all();
|
||||
pm_restore_console();
|
||||
return error;
|
||||
|
|
|
@ -239,11 +239,6 @@ static inline void suspend_test_finish(const char *label) {}
|
|||
/* kernel/power/main.c */
|
||||
extern int pm_notifier_call_chain_robust(unsigned long val_up, unsigned long val_down);
|
||||
extern int pm_notifier_call_chain(unsigned long val);
|
||||
void pm_restrict_gfp_mask(void);
|
||||
void pm_restore_gfp_mask(void);
|
||||
#else
|
||||
static inline void pm_restrict_gfp_mask(void) {}
|
||||
static inline void pm_restore_gfp_mask(void) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
|
|
|
@ -540,6 +540,7 @@ int suspend_devices_and_enter(suspend_state_t state)
|
|||
return error;
|
||||
|
||||
Recover_platform:
|
||||
pm_restore_gfp_mask();
|
||||
platform_recover(state);
|
||||
goto Resume_devices;
|
||||
}
|
||||
|
@ -606,9 +607,7 @@ static int enter_state(suspend_state_t state)
|
|||
|
||||
trace_suspend_resume(TPS("suspend_enter"), state, false);
|
||||
pm_pr_dbg("Suspending system (%s)\n", mem_sleep_labels[state]);
|
||||
pm_restrict_gfp_mask();
|
||||
error = suspend_devices_and_enter(state);
|
||||
pm_restore_gfp_mask();
|
||||
|
||||
Finish:
|
||||
events_check_enabled = false;
|
||||
|
|
Loading…
Reference in New Issue
Block a user