Power management fixes for v4.9-rc3
Specifics: - Fix a missing KERN_CONT in a system suspend message by converting the affected code to using pr_info() and pr_cont() instead of the "raw" printk() (Jon Hunter). - Make intel_pstate set the CPU P-state from its .set_policy() callback when the scaling_governor sysfs attribute is set to "performance" so that it interacts with NOHZ_FULL more predictably which was the case before 4.7 (Rafael Wysocki). - Make intel_pstate always request the maximum allowed P-state when the scaling_governor sysfs attribute is set to "performance" to prevent it from effectively ingoring that setting is some situations (Rafael Wysocki). -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCAAGBQJYE+vbAAoJEILEb/54YlRxsqQQAIZLfm5Isp4L0JBt2svtLYuO 5mLgGOfcpsHIpqq5+saKtK+JOcCpm/MJ0PMQdv3WhKkFGXG9++Dz6F2gNNFlE+Sy era/B9NFry1BsQ14xsX8XonYRkQ2tS+CgOw+akSZl9BTVeX57VASqPIzlKI4Auz/ Ru5M8n4QWAD7dPWnqHTFHYbmTnMtr18wn0mNjiC/cLz7TPxmGM9Pe730/bpGKMDC DQpflnpT/ktqV1imDuaiMeuP2re2DSZWMrirZo326UsDtcKN1A4sCO+PPUUt/TTb k6pKsZ9OB9FgMmaRqx5G6wCD3NvuhKa1JOqg3RvAVZ0SmMcl2AFhCaoEJtX+TKvz 3365o2tSQeGc3bmXTb7YqP2SaYm107rOG/M0I2JuA7qNUKxk8MFfbNdaYxTY2ezT D5NF0SCycOMeEXIDTTuZ2oN1NHR6osO7bNFOIacKlcIL8PmEl8fDqX2KdYQze5xh AGsa1Oee7FPrDd2kQIL6HNGgVjd6gtHU9cVjyzQeUv9SU6zwOlu4/BbZI+wIterN L2OfW7w6/KSSyScDZ3TbifeJwpP918bUv578dEP6U/2VKthPBUPY/MYMMQzSuEIn RAQoDShqacIjdyLZtStii28KctMOk0L/edEDbdFmyu2ttNwpB+hk2ieCYWfI8wAa 2SAaYyRGpC2nafsSTv+E =RtkB -----END PGP SIGNATURE----- Merge tag 'pm-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull power management fixes from Rafael Wysocki: "These fix two intel_pstate issues related to the way it works when the scaling_governor sysfs attribute is set to "performance" and fix up messages in the system suspend core code. Specifics: - Fix a missing KERN_CONT in a system suspend message by converting the affected code to using pr_info() and pr_cont() instead of the "raw" printk() (Jon Hunter). - Make intel_pstate set the CPU P-state from its .set_policy() callback when the scaling_governor sysfs attribute is set to "performance" so that it interacts with NOHZ_FULL more predictably which was the case before 4.7 (Rafael Wysocki). - Make intel_pstate always request the maximum allowed P-state when the scaling_governor sysfs attribute is set to "performance" to prevent it from effectively ingoring that setting is some situations (Rafael Wysocki)" * tag 'pm-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: cpufreq: intel_pstate: Always set max P-state in performance mode PM / suspend: Fix missing KERN_CONT for suspend message cpufreq: intel_pstate: Set P-state upfront in performance mode
This commit is contained in:
commit
b546e0c289
@ -179,6 +179,7 @@ struct _pid {
|
|||||||
/**
|
/**
|
||||||
* struct cpudata - Per CPU instance data storage
|
* struct cpudata - Per CPU instance data storage
|
||||||
* @cpu: CPU number for this instance data
|
* @cpu: CPU number for this instance data
|
||||||
|
* @policy: CPUFreq policy value
|
||||||
* @update_util: CPUFreq utility callback information
|
* @update_util: CPUFreq utility callback information
|
||||||
* @update_util_set: CPUFreq utility callback is set
|
* @update_util_set: CPUFreq utility callback is set
|
||||||
* @iowait_boost: iowait-related boost fraction
|
* @iowait_boost: iowait-related boost fraction
|
||||||
@ -201,6 +202,7 @@ struct _pid {
|
|||||||
struct cpudata {
|
struct cpudata {
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
|
unsigned int policy;
|
||||||
struct update_util_data update_util;
|
struct update_util_data update_util;
|
||||||
bool update_util_set;
|
bool update_util_set;
|
||||||
|
|
||||||
@ -1142,10 +1144,8 @@ static void intel_pstate_get_min_max(struct cpudata *cpu, int *min, int *max)
|
|||||||
*min = clamp_t(int, min_perf, cpu->pstate.min_pstate, max_perf);
|
*min = clamp_t(int, min_perf, cpu->pstate.min_pstate, max_perf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_pstate_set_min_pstate(struct cpudata *cpu)
|
static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
|
||||||
{
|
{
|
||||||
int pstate = cpu->pstate.min_pstate;
|
|
||||||
|
|
||||||
trace_cpu_frequency(pstate * cpu->pstate.scaling, cpu->cpu);
|
trace_cpu_frequency(pstate * cpu->pstate.scaling, cpu->cpu);
|
||||||
cpu->pstate.current_pstate = pstate;
|
cpu->pstate.current_pstate = pstate;
|
||||||
/*
|
/*
|
||||||
@ -1157,6 +1157,20 @@ static void intel_pstate_set_min_pstate(struct cpudata *cpu)
|
|||||||
pstate_funcs.get_val(cpu, pstate));
|
pstate_funcs.get_val(cpu, pstate));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void intel_pstate_set_min_pstate(struct cpudata *cpu)
|
||||||
|
{
|
||||||
|
intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void intel_pstate_max_within_limits(struct cpudata *cpu)
|
||||||
|
{
|
||||||
|
int min_pstate, max_pstate;
|
||||||
|
|
||||||
|
update_turbo_state();
|
||||||
|
intel_pstate_get_min_max(cpu, &min_pstate, &max_pstate);
|
||||||
|
intel_pstate_set_pstate(cpu, max_pstate);
|
||||||
|
}
|
||||||
|
|
||||||
static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
|
static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
|
||||||
{
|
{
|
||||||
cpu->pstate.min_pstate = pstate_funcs.get_min();
|
cpu->pstate.min_pstate = pstate_funcs.get_min();
|
||||||
@ -1325,7 +1339,8 @@ static inline void intel_pstate_adjust_busy_pstate(struct cpudata *cpu)
|
|||||||
|
|
||||||
from = cpu->pstate.current_pstate;
|
from = cpu->pstate.current_pstate;
|
||||||
|
|
||||||
target_pstate = pstate_funcs.get_target_pstate(cpu);
|
target_pstate = cpu->policy == CPUFREQ_POLICY_PERFORMANCE ?
|
||||||
|
cpu->pstate.turbo_pstate : pstate_funcs.get_target_pstate(cpu);
|
||||||
|
|
||||||
intel_pstate_update_pstate(cpu, target_pstate);
|
intel_pstate_update_pstate(cpu, target_pstate);
|
||||||
|
|
||||||
@ -1491,7 +1506,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
|
|||||||
pr_debug("set_policy cpuinfo.max %u policy->max %u\n",
|
pr_debug("set_policy cpuinfo.max %u policy->max %u\n",
|
||||||
policy->cpuinfo.max_freq, policy->max);
|
policy->cpuinfo.max_freq, policy->max);
|
||||||
|
|
||||||
cpu = all_cpu_data[0];
|
cpu = all_cpu_data[policy->cpu];
|
||||||
|
cpu->policy = policy->policy;
|
||||||
|
|
||||||
if (cpu->pstate.max_pstate_physical > cpu->pstate.max_pstate &&
|
if (cpu->pstate.max_pstate_physical > cpu->pstate.max_pstate &&
|
||||||
policy->max < policy->cpuinfo.max_freq &&
|
policy->max < policy->cpuinfo.max_freq &&
|
||||||
policy->max > cpu->pstate.max_pstate * cpu->pstate.scaling) {
|
policy->max > cpu->pstate.max_pstate * cpu->pstate.scaling) {
|
||||||
@ -1499,7 +1516,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
|
|||||||
policy->max = policy->cpuinfo.max_freq;
|
policy->max = policy->cpuinfo.max_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
|
if (cpu->policy == CPUFREQ_POLICY_PERFORMANCE) {
|
||||||
limits = &performance_limits;
|
limits = &performance_limits;
|
||||||
if (policy->max >= policy->cpuinfo.max_freq) {
|
if (policy->max >= policy->cpuinfo.max_freq) {
|
||||||
pr_debug("set performance\n");
|
pr_debug("set performance\n");
|
||||||
@ -1535,6 +1552,15 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
|
|||||||
limits->max_perf = round_up(limits->max_perf, FRAC_BITS);
|
limits->max_perf = round_up(limits->max_perf, FRAC_BITS);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (cpu->policy == CPUFREQ_POLICY_PERFORMANCE) {
|
||||||
|
/*
|
||||||
|
* NOHZ_FULL CPUs need this as the governor callback may not
|
||||||
|
* be invoked on them.
|
||||||
|
*/
|
||||||
|
intel_pstate_clear_update_util_hook(policy->cpu);
|
||||||
|
intel_pstate_max_within_limits(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
intel_pstate_set_update_util_hook(policy->cpu);
|
intel_pstate_set_update_util_hook(policy->cpu);
|
||||||
|
|
||||||
intel_pstate_hwp_set_policy(policy);
|
intel_pstate_hwp_set_policy(policy);
|
||||||
|
@ -498,9 +498,9 @@ static int enter_state(suspend_state_t state)
|
|||||||
|
|
||||||
#ifndef CONFIG_SUSPEND_SKIP_SYNC
|
#ifndef CONFIG_SUSPEND_SKIP_SYNC
|
||||||
trace_suspend_resume(TPS("sync_filesystems"), 0, true);
|
trace_suspend_resume(TPS("sync_filesystems"), 0, true);
|
||||||
printk(KERN_INFO "PM: Syncing filesystems ... ");
|
pr_info("PM: Syncing filesystems ... ");
|
||||||
sys_sync();
|
sys_sync();
|
||||||
printk("done.\n");
|
pr_cont("done.\n");
|
||||||
trace_suspend_resume(TPS("sync_filesystems"), 0, false);
|
trace_suspend_resume(TPS("sync_filesystems"), 0, false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user