Commit 590c5cd1 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branches 'pm-cpuidle' and 'pm-sleep'

Merge a cpuidle fix and two fixes related to system sleep for 6.18-rc4:

 - Add an exit latency check to the menu cpuidle governor in the case
   when it considers using a real idle state instead of a polling one to
   address a performance regression (Rafael Wysocki)

 - Revert an attempted cleanup of a system suspend code path that
   introduced a regression elsewhere (Samuel Wu)

 - Allow pm_restrict_gfp_mask() to be called multiple times in a row
   and adjust pm_restore_gfp_mask() accordingly to avoid having to play
   nasty games with these calls during hibernation (Rafael Wysocki)

* pm-cpuidle:
  cpuidle: governors: menu: Select polling state in some more cases

* pm-sleep:
  PM: sleep: Allow pm_restrict_gfp_mask() stacking
  Revert "PM: sleep: Make pm_wakeup_clear() call more clear"
parents db86f55b 35e4a69b
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -706,7 +706,6 @@ static void power_down(void)

#ifdef CONFIG_SUSPEND
	if (hibernation_mode == HIBERNATION_SUSPEND) {
		pm_restore_gfp_mask();
		error = suspend_devices_and_enter(mem_sleep_current);
		if (!error)
			goto exit;
@@ -746,9 +745,6 @@ static void power_down(void)
		cpu_relax();

exit:
	/* Match the pm_restore_gfp_mask() call in hibernate(). */
	pm_restrict_gfp_mask();

	/* Restore swap signature. */
	error = swsusp_unmark();
	if (error)
+17 −5
Original line number Diff line number Diff line
@@ -31,23 +31,35 @@
 * held, unless the suspend/hibernate code is guaranteed not to run in parallel
 * with that modification).
 */
static unsigned int saved_gfp_count;
static gfp_t saved_gfp_mask;

void pm_restore_gfp_mask(void)
{
	WARN_ON(!mutex_is_locked(&system_transition_mutex));
	if (saved_gfp_mask) {

	if (WARN_ON(!saved_gfp_count) || --saved_gfp_count)
		return;

	gfp_allowed_mask = saved_gfp_mask;
	saved_gfp_mask = 0;
	}

	pm_pr_dbg("GFP mask restored\n");
}

void pm_restrict_gfp_mask(void)
{
	WARN_ON(!mutex_is_locked(&system_transition_mutex));
	WARN_ON(saved_gfp_mask);

	if (saved_gfp_count++) {
		WARN_ON((saved_gfp_mask & ~(__GFP_IO | __GFP_FS)) != gfp_allowed_mask);
		return;
	}

	saved_gfp_mask = gfp_allowed_mask;
	gfp_allowed_mask &= ~(__GFP_IO | __GFP_FS);

	pm_pr_dbg("GFP mask restricted\n");
}

unsigned int lock_system_sleep(void)
+1 −0
Original line number Diff line number Diff line
@@ -132,6 +132,7 @@ int freeze_processes(void)
	if (!pm_freezing)
		static_branch_inc(&freezer_active);

	pm_wakeup_clear(0);
	pm_freezing = true;
	error = try_to_freeze_tasks(true);
	if (!error)
+0 −1
Original line number Diff line number Diff line
@@ -595,7 +595,6 @@ static int enter_state(suspend_state_t state)
	}

	pm_pr_dbg("Preparing system for sleep (%s)\n", mem_sleep_labels[state]);
	pm_wakeup_clear(0);
	pm_suspend_clear_flags();
	error = suspend_prepare(state);
	if (error)