diff options
| -rw-r--r-- | Documentation/admin-guide/pm/intel_idle.rst | 12 | ||||
| -rw-r--r-- | Documentation/power/runtime_pm.rst | 10 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 4 | ||||
| -rw-r--r-- | drivers/cpufreq/intel_pstate.c | 2 | ||||
| -rw-r--r-- | drivers/idle/intel_idle.c | 9 | ||||
| -rw-r--r-- | include/linux/pm_runtime.h | 6 | ||||
| -rw-r--r-- | kernel/power/energy_model.c | 4 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 20 |
8 files changed, 43 insertions, 24 deletions
diff --git a/Documentation/admin-guide/pm/intel_idle.rst b/Documentation/admin-guide/pm/intel_idle.rst index 996e5bd83c42..d1a6251790b8 100644 --- a/Documentation/admin-guide/pm/intel_idle.rst +++ b/Documentation/admin-guide/pm/intel_idle.rst @@ -145,11 +145,13 @@ for the other idle state types (C2 and C3) the target residency value is 3 times the exit latency (again, that is because it reflects the target residency to exit latency ratio in the majority of cases for the processor models recognized by ``intel_idle``). The name of the idle state (to be returned by the ``name`` -idle state attribute in ``sysfs``) is either "Cx_LPI" (if it comes from ``_LPI`` -processing) or "Cx_ACPI", where x is the index of that idle state in the final -list (note that the minimum value of x is 1, because 0 is reserved for the -"polling" state), and its target residency is based on the exit latency value. -All of the idle states in the final list are enabled by default in this case. +idle state attribute in ``sysfs``) either is equal to the state name value that +comes from ``_LPI`` processing (with the possible fallback to "Cx_LPI" if the +state name is not provided) or it is "Cx_ACPI", where x is the index of that +idle state in the final list (note that the minimum value of x is 1, because 0 +is reserved for the "polling" state), and its target residency is based on the +exit latency value. All of the idle states in the final list are enabled by +default in this case. .. _intel-idle-initialization: diff --git a/Documentation/power/runtime_pm.rst b/Documentation/power/runtime_pm.rst index e4407b687f8b..40a5c23d5259 100644 --- a/Documentation/power/runtime_pm.rst +++ b/Documentation/power/runtime_pm.rst @@ -425,11 +425,11 @@ but it also allows more flexibility in the handling of devices during the removal of their drivers. Drivers in ->remove() callback should undo the runtime PM changes done -in ->probe(). Usually this means calling pm_runtime_disable(), -pm_runtime_dont_use_autosuspend() etc. Alternatively, drivers can use -devm_pm_runtime_enable() during probe, which automatically takes care of -calling pm_runtime_disable() and pm_runtime_dont_use_autosuspend() upon driver -detachment. +in ->probe(). Usually this means calling pm_runtime_disable() etc. +Alternatively, drivers can use devm_pm_runtime_enable() during probe, which +automatically takes care of calling pm_runtime_disable() upon driver detachment. +Any pm_runtime_use_autosuspend() calls in a driver will be automatically undone +on driver exit. The user space can effectively disallow the driver of the device to power manage it at run time by changing the value of its /sys/devices/.../power/control diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 670a10c3ecfa..e7ec16bcb67e 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c @@ -52,6 +52,10 @@ static void cpufreq_stats_reset_table(struct cpufreq_stats *stats) * reset_pending accesses in cpufreq_stats_record_transition(). */ smp_rmb(); + + if (stats->last_index == -1) + return; + cpufreq_stats_update(stats, READ_ONCE(stats->reset_time)); } diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 17158cb25dd8..0e6ae4cdda5d 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -3436,6 +3436,8 @@ static void intel_pstate_driver_cleanup(void) if (intel_pstate_driver == &intel_pstate) intel_pstate_clear_update_util_hook(cpu); + intel_pstate_disable_hwp_interrupt(all_cpu_data[cpu]); + kfree(all_cpu_data[cpu]); WRITE_ONCE(all_cpu_data[cpu], NULL); } diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index a045a384b949..9f5e1c47aba2 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -1903,8 +1903,13 @@ static void __init intel_idle_init_cstates_acpi_lpi(struct cpuidle_driver *drv) state = &drv->states[drv->state_count++]; - scnprintf(state->name, CPUIDLE_NAME_LEN, "C%d_LPI", index + 1); - strscpy(state->desc, lpi_state->desc); + if (strlen(lpi_state->desc) > 0) + strscpy(state->name, lpi_state->desc); + else + scnprintf(state->name, CPUIDLE_NAME_LEN, "C%d_LPI", index + 1); + + scnprintf(state->desc, CPUIDLE_DESC_LEN, "ACPI LPI MWAIT 0x%02llx", + lpi_state->address); state->exit_latency = lpi_state->wake_latency; state->target_residency = lpi_state->min_residency; state->flags = MWAIT2flg(lpi_state->address); diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 322e3b17f987..ae68a9dc7fc5 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -855,9 +855,9 @@ static inline void pm_runtime_disable(struct device *dev) * requested (or "autosuspend" will be handled as direct runtime-suspend for * it). * - * NOTE: It's important to undo this with pm_runtime_dont_use_autosuspend() - * at driver exit time unless your driver initially enabled pm_runtime - * with devm_pm_runtime_enable() (which handles it for you). + * NOTE: This is undone automatically with pm_runtime_dont_use_autosuspend() on + * driver exit regardless of whether a driver uses managed devm_* functions or + * not. */ static inline void pm_runtime_use_autosuspend(struct device *dev) { diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index a76089e2ce8c..d19a65461ae8 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c @@ -439,7 +439,9 @@ static int em_create_pd(struct device *dev, int nr_states, cpumask_copy(em_span_cpus(pd), cpus); } else { - pd = kzalloc_obj(*pd); + /* Readers expect pd->cpus to exist and remain empty. */ + pd = kzalloc_flex(*pd, cpus, + BITS_TO_LONGS(large_cpumask_bits)); if (!pd) return -ENOMEM; } diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 57c44268698f..32c055df02da 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -306,20 +306,24 @@ static void platform_resume_finish(suspend_state_t state) static int platform_suspend_begin(suspend_state_t state) { - if (state == PM_SUSPEND_TO_IDLE && s2idle_ops && s2idle_ops->begin) - return s2idle_ops->begin(); - else if (suspend_ops && suspend_ops->begin) + if (state == PM_SUSPEND_TO_IDLE) { + if (s2idle_ops && s2idle_ops->begin) + return s2idle_ops->begin(); + } else if (suspend_ops && suspend_ops->begin) { return suspend_ops->begin(state); - else - return 0; + } + + return 0; } static void platform_resume_end(suspend_state_t state) { - if (state == PM_SUSPEND_TO_IDLE && s2idle_ops && s2idle_ops->end) - s2idle_ops->end(); - else if (suspend_ops && suspend_ops->end) + if (state == PM_SUSPEND_TO_IDLE) { + if (s2idle_ops && s2idle_ops->end) + s2idle_ops->end(); + } else if (suspend_ops && suspend_ops->end) { suspend_ops->end(); + } } static void platform_recover(suspend_state_t state) |
