Commit db5781c4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull power management fixes from Rafael Wysocki:
 "These fix two intel_pstate driver issues causing it to crash on sysfs
  attribute accesses when some CPUs in the system are offline, finalize
  changes related to turning pm_runtime_put() into a void function, and
  update Daniel Lezcano's contact information:

   - Fix two issues in the intel_pstate driver causing it to crash when
     its sysfs interface is used on a system with some offline CPUs
     (David Arcari, Srinivas Pandruvada)

   - Update the last user of the pm_runtime_put() return value to
     discard it and turn pm_runtime_put() into a void function (Rafael
     Wysocki)

   - Update Daniel Lezcano's contact information in MAINTAINERS and
     .mailmap (Daniel Lezcano)"

* tag 'pm-7.0-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  MAINTAINERS: Update contact with the kernel.org address
  cpufreq: intel_pstate: Fix crash during turbo disable
  cpufreq: intel_pstate: Fix NULL pointer dereference in update_cpu_qos_request()
  PM: runtime: Change pm_runtime_put() return type to void
  pmdomain: imx: gpcv2: Discard pm_runtime_put() return value
parents c45be7c4 b78030d0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -210,6 +210,10 @@ Daniel Borkmann <daniel@iogearbox.net> <daniel.borkmann@tik.ee.ethz.ch>
Daniel Borkmann <daniel@iogearbox.net> <dborkmann@redhat.com>
Daniel Borkmann <daniel@iogearbox.net> <dborkman@redhat.com>
Daniel Borkmann <daniel@iogearbox.net> <dxchgb@gmail.com>
Daniel Lezcano <daniel.lezcano@kernel.org> <daniel.lezcano@linaro.org>
Daniel Lezcano <daniel.lezcano@kernel.org> <daniel.lezcano@free.fr>
Daniel Lezcano <daniel.lezcano@kernel.org> <daniel.lezcano@linexp.org>
Daniel Lezcano <daniel.lezcano@kernel.org> <dlezcano@fr.ibm.com>
Daniel Thompson <danielt@kernel.org> <daniel.thompson@linaro.org>
Danilo Krummrich <dakr@kernel.org> <dakr@redhat.com>
David Brownell <david-b@pacbell.net>
+6 −6
Original line number Diff line number Diff line
@@ -6278,7 +6278,7 @@ S: Maintained
F:	include/linux/clk.h
CLOCKSOURCE, CLOCKEVENT DRIVERS
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
M:	Daniel Lezcano <daniel.lezcano@kernel.org>
M:	Thomas Gleixner <tglx@kernel.org>
L:	linux-kernel@vger.kernel.org
S:	Supported
@@ -6667,7 +6667,7 @@ F: rust/kernel/cpu.rs
CPU IDLE TIME MANAGEMENT FRAMEWORK
M:	"Rafael J. Wysocki" <rafael@kernel.org>
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
M:	Daniel Lezcano <daniel.lezcano@kernel.org>
R:	Christian Loehle <christian.loehle@arm.com>
L:	linux-pm@vger.kernel.org
S:	Maintained
@@ -6697,7 +6697,7 @@ F: arch/x86/kernel/msr.c
CPUIDLE DRIVER - ARM BIG LITTLE
M:	Lorenzo Pieralisi <lpieralisi@kernel.org>
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
M:	Daniel Lezcano <daniel.lezcano@kernel.org>
L:	linux-pm@vger.kernel.org
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S:	Maintained
@@ -6705,7 +6705,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
F:	drivers/cpuidle/cpuidle-big_little.c
CPUIDLE DRIVER - ARM EXYNOS
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
M:	Daniel Lezcano <daniel.lezcano@kernel.org>
M:	Kukjin Kim <kgene@kernel.org>
R:	Krzysztof Kozlowski <krzk@kernel.org>
L:	linux-pm@vger.kernel.org
@@ -26215,7 +26215,7 @@ F: drivers/media/radio/radio-raremono.c
THERMAL
M:	Rafael J. Wysocki <rafael@kernel.org>
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
M:	Daniel Lezcano <daniel.lezcano@kernel.org>
R:	Zhang Rui <rui.zhang@intel.com>
R:	Lukasz Luba <lukasz.luba@arm.com>
L:	linux-pm@vger.kernel.org
@@ -26245,7 +26245,7 @@ F: drivers/thermal/amlogic_thermal.c
THERMAL/CPU_COOLING
M:	Amit Daniel Kachhap <amit.kachhap@gmail.com>
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
M:	Daniel Lezcano <daniel.lezcano@kernel.org>
M:	Viresh Kumar <viresh.kumar@linaro.org>
R:	Lukasz Luba <lukasz.luba@arm.com>
L:	linux-pm@vger.kernel.org
+8 −6
Original line number Diff line number Diff line
@@ -1476,13 +1476,13 @@ static void __intel_pstate_update_max_freq(struct cpufreq_policy *policy,
	refresh_frequency_limits(policy);
}

static bool intel_pstate_update_max_freq(struct cpudata *cpudata)
static bool intel_pstate_update_max_freq(int cpu)
{
	struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpudata->cpu);
	struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
	if (!policy)
		return false;

	__intel_pstate_update_max_freq(policy, cpudata);
	__intel_pstate_update_max_freq(policy, all_cpu_data[cpu]);

	return true;
}
@@ -1501,7 +1501,7 @@ static void intel_pstate_update_limits_for_all(void)
	int cpu;

	for_each_possible_cpu(cpu)
		intel_pstate_update_max_freq(all_cpu_data[cpu]);
		intel_pstate_update_max_freq(cpu);

	mutex_lock(&hybrid_capacity_lock);

@@ -1647,8 +1647,8 @@ static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b,
static void update_cpu_qos_request(int cpu, enum freq_qos_req_type type)
{
	struct cpudata *cpudata = all_cpu_data[cpu];
	unsigned int freq = cpudata->pstate.turbo_freq;
	struct freq_qos_request *req;
	unsigned int freq;

	struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
	if (!policy)
@@ -1661,6 +1661,8 @@ static void update_cpu_qos_request(int cpu, enum freq_qos_req_type type)
	if (hwp_active)
		intel_pstate_get_hwp_cap(cpudata);

	freq = cpudata->pstate.turbo_freq;

	if (type == FREQ_QOS_MIN) {
		freq = DIV_ROUND_UP(freq * global.min_perf_pct, 100);
	} else {
@@ -1908,7 +1910,7 @@ static void intel_pstate_notify_work(struct work_struct *work)
	struct cpudata *cpudata =
		container_of(to_delayed_work(work), struct cpudata, hwp_notify_work);

	if (intel_pstate_update_max_freq(cpudata)) {
	if (intel_pstate_update_max_freq(cpudata->cpu)) {
		/*
		 * The driver will not be unregistered while this function is
		 * running, so update the capacity without acquiring the driver
+3 −1
Original line number Diff line number Diff line
@@ -1416,7 +1416,9 @@ static int imx_pgc_domain_suspend(struct device *dev)

static int imx_pgc_domain_resume(struct device *dev)
{
	return pm_runtime_put(dev);
	pm_runtime_put(dev);

	return 0;
}
#endif

+2 −14
Original line number Diff line number Diff line
@@ -545,22 +545,10 @@ static inline int pm_runtime_resume_and_get(struct device *dev)
 *
 * Decrement the runtime PM usage counter of @dev and if it turns out to be
 * equal to 0, queue up a work item for @dev like in pm_request_idle().
 *
 * Return:
 * * 1: Success. Usage counter dropped to zero, but device was already suspended.
 * * 0: Success.
 * * -EINVAL: Runtime PM error.
 * * -EACCES: Runtime PM disabled.
 * * -EAGAIN: Runtime PM usage counter became non-zero or Runtime PM status
 *            change ongoing.
 * * -EBUSY: Runtime PM child_count non-zero.
 * * -EPERM: Device PM QoS resume latency 0.
 * * -EINPROGRESS: Suspend already in progress.
 * * -ENOSYS: CONFIG_PM not enabled.
 */
static inline int pm_runtime_put(struct device *dev)
static inline void pm_runtime_put(struct device *dev)
{
	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
	__pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
}

/**