On 20-11-19, 10:33, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > > Switching cpufreq drivers (or switching operation modes of the > intel_pstate driver from "active" to "passive" and vice versa) > does not work on some x86 systems with ACPI after commit > 3000ce3c52f8 ("cpufreq: Use per-policy frequency QoS"), because > the ACPI _PPC and thermal code uses the same frequency QoS request > object for a given CPU every time a cpufreq driver is registered > and freq_qos_remove_request() does not invalidate the request after > removing it from its QoS list, so freq_qos_add_request() complains > and fails when that request is passed to it again. > > Fix the issue by modifying freq_qos_remove_request() to clear the qos > and type fields of the frequency request pointed to by its argument > after removing it from its QoS list so as to invalidate it. > > Fixes: 3000ce3c52f8 ("cpufreq: Use per-policy frequency QoS") > Reported-and-tested-by: Doug Smythies <dsmythies@xxxxxxxxx> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > --- > kernel/power/qos.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > Index: linux-pm/kernel/power/qos.c > =================================================================== > --- linux-pm.orig/kernel/power/qos.c > +++ linux-pm/kernel/power/qos.c > @@ -814,6 +814,8 @@ EXPORT_SYMBOL_GPL(freq_qos_update_reques > */ > int freq_qos_remove_request(struct freq_qos_request *req) > { > + int ret; > + > if (!req) > return -EINVAL; > > @@ -821,7 +823,11 @@ int freq_qos_remove_request(struct freq_ > "%s() called for unknown object\n", __func__)) > return -EINVAL; > > - return freq_qos_apply(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); > + ret = freq_qos_apply(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); > + req->qos = NULL; > + req->type = 0; > + > + return ret; > } > EXPORT_SYMBOL_GPL(freq_qos_remove_request); Acked-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx> -- viresh