Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
On Fri, Aug 9, 2019 at 4:33 AM Viresh Kumar wrote: > > On 06-08-19, 14:17, Viresh Kumar wrote: > > On 06-08-19, 10:01, Rafael J. Wysocki wrote: > > > Yes, it does, thanks! > > > > > > [No need to resend, I'll take it from this message.] > > > > Forgot to write CPU in caps in print messages, updated now. > > And here is another version. Queuing up for v5.4, thanks! > > -8<- > From 6d2c1e8034562043a758524d6078e2dd1624195c Mon Sep 17 00:00:00 2001 > Message-Id: > <6d2c1e8034562043a758524d6078e2dd1624195c.1565317925.git.viresh.ku...@linaro.org> > From: Viresh Kumar > Date: Mon, 15 Jul 2019 15:06:02 +0530 > Subject: [PATCH] ACPI: cpufreq: Switch to QoS requests instead of cpufreq > notifier > > The cpufreq core now takes the min/max frequency constraints via QoS > requests and the CPUFREQ_ADJUST notifier shall get removed later on. > > Switch over to using the QoS request for maximum frequency constraint > for acpi driver. > > Signed-off-by: Viresh Kumar > --- > - dev_pm_qos_update_request() can return 1 on success > > drivers/acpi/processor_driver.c | 37 ++-- > drivers/acpi/processor_perflib.c | 96 +++- > drivers/acpi/processor_thermal.c | 81 +-- > include/acpi/processor.h | 21 --- > 4 files changed, 118 insertions(+), 117 deletions(-) > > diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c > index aea8d674a33d..2c911fcaa4b4 100644 > --- a/drivers/acpi/processor_driver.c > +++ b/drivers/acpi/processor_driver.c > @@ -284,6 +284,29 @@ static int acpi_processor_stop(struct device *dev) > return 0; > } > > +bool acpi_processor_cpufreq_init; > + > +static int acpi_processor_notifier(struct notifier_block *nb, > + unsigned long event, void *data) > +{ > + struct cpufreq_policy *policy = data; > + int cpu = policy->cpu; > + > + if (event == CPUFREQ_CREATE_POLICY) { > + acpi_thermal_cpufreq_init(cpu); > + acpi_processor_ppc_init(cpu); > + } else if (event == CPUFREQ_REMOVE_POLICY) { > + acpi_processor_ppc_exit(cpu); > + acpi_thermal_cpufreq_exit(cpu); > + } > + > + return 0; > +} > + > +static struct notifier_block acpi_processor_notifier_block = { > + .notifier_call = acpi_processor_notifier, > +}; > + > /* > * We keep the driver loaded even when ACPI is not running. > * This is needed for the powernow-k8 driver, that works even without > @@ -310,8 +333,10 @@ static int __init acpi_processor_driver_init(void) > cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", > NULL, acpi_soft_cpu_dead); > > - acpi_thermal_cpufreq_init(); > - acpi_processor_ppc_init(); > + if (!cpufreq_register_notifier(_processor_notifier_block, > + CPUFREQ_POLICY_NOTIFIER)) > + acpi_processor_cpufreq_init = true; > + > acpi_processor_throttling_init(); > return 0; > err: > @@ -324,8 +349,12 @@ static void __exit acpi_processor_driver_exit(void) > if (acpi_disabled) > return; > > - acpi_processor_ppc_exit(); > - acpi_thermal_cpufreq_exit(); > + if (acpi_processor_cpufreq_init) { > + cpufreq_unregister_notifier(_processor_notifier_block, > + CPUFREQ_POLICY_NOTIFIER); > + acpi_processor_cpufreq_init = false; > + } > + > cpuhp_remove_state_nocalls(hp_online); > cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD); > driver_unregister(_processor_driver); > diff --git a/drivers/acpi/processor_perflib.c > b/drivers/acpi/processor_perflib.c > index ee87cb6f6e59..277fcbbe3be4 100644 > --- a/drivers/acpi/processor_perflib.c > +++ b/drivers/acpi/processor_perflib.c > @@ -50,57 +50,13 @@ module_param(ignore_ppc, int, 0644); > MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" > \ > "limited by BIOS, this should help"); > > -#define PPC_REGISTERED 1 > -#define PPC_IN_USE 2 > - > -static int acpi_processor_ppc_status; > - > -static int acpi_processor_ppc_notifier(struct notifier_block *nb, > - unsigned long event, void *data) > -{ > - struct cpufreq_policy *policy = data; > - struct acpi_processor *pr; > - unsigned int ppc = 0; > - > - if (ignore_ppc < 0) > - ignore_ppc = 0; > - > - if (ignore_ppc) > - return 0; > - > - if (event != CPUFREQ_ADJUST) > - return 0; > - > - mutex_lock(_mutex); > - > - pr = per_cpu(processors, policy->cpu); > - if (!pr || !pr->performance) > - goto out; > - > - ppc = (unsigned int)pr->performance_platform_limit; > - > - if (ppc >=
Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
On 06-08-19, 14:17, Viresh Kumar wrote: > On 06-08-19, 10:01, Rafael J. Wysocki wrote: > > Yes, it does, thanks! > > > > [No need to resend, I'll take it from this message.] > > Forgot to write CPU in caps in print messages, updated now. And here is another version. -8<- >From 6d2c1e8034562043a758524d6078e2dd1624195c Mon Sep 17 00:00:00 2001 Message-Id: <6d2c1e8034562043a758524d6078e2dd1624195c.1565317925.git.viresh.ku...@linaro.org> From: Viresh Kumar Date: Mon, 15 Jul 2019 15:06:02 +0530 Subject: [PATCH] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier The cpufreq core now takes the min/max frequency constraints via QoS requests and the CPUFREQ_ADJUST notifier shall get removed later on. Switch over to using the QoS request for maximum frequency constraint for acpi driver. Signed-off-by: Viresh Kumar --- - dev_pm_qos_update_request() can return 1 on success drivers/acpi/processor_driver.c | 37 ++-- drivers/acpi/processor_perflib.c | 96 +++- drivers/acpi/processor_thermal.c | 81 +-- include/acpi/processor.h | 21 --- 4 files changed, 118 insertions(+), 117 deletions(-) diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index aea8d674a33d..2c911fcaa4b4 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -284,6 +284,29 @@ static int acpi_processor_stop(struct device *dev) return 0; } +bool acpi_processor_cpufreq_init; + +static int acpi_processor_notifier(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct cpufreq_policy *policy = data; + int cpu = policy->cpu; + + if (event == CPUFREQ_CREATE_POLICY) { + acpi_thermal_cpufreq_init(cpu); + acpi_processor_ppc_init(cpu); + } else if (event == CPUFREQ_REMOVE_POLICY) { + acpi_processor_ppc_exit(cpu); + acpi_thermal_cpufreq_exit(cpu); + } + + return 0; +} + +static struct notifier_block acpi_processor_notifier_block = { + .notifier_call = acpi_processor_notifier, +}; + /* * We keep the driver loaded even when ACPI is not running. * This is needed for the powernow-k8 driver, that works even without @@ -310,8 +333,10 @@ static int __init acpi_processor_driver_init(void) cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", NULL, acpi_soft_cpu_dead); - acpi_thermal_cpufreq_init(); - acpi_processor_ppc_init(); + if (!cpufreq_register_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER)) + acpi_processor_cpufreq_init = true; + acpi_processor_throttling_init(); return 0; err: @@ -324,8 +349,12 @@ static void __exit acpi_processor_driver_exit(void) if (acpi_disabled) return; - acpi_processor_ppc_exit(); - acpi_thermal_cpufreq_exit(); + if (acpi_processor_cpufreq_init) { + cpufreq_unregister_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER); + acpi_processor_cpufreq_init = false; + } + cpuhp_remove_state_nocalls(hp_online); cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD); driver_unregister(_processor_driver); diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index ee87cb6f6e59..277fcbbe3be4 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c @@ -50,57 +50,13 @@ module_param(ignore_ppc, int, 0644); MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ "limited by BIOS, this should help"); -#define PPC_REGISTERED 1 -#define PPC_IN_USE 2 - -static int acpi_processor_ppc_status; - -static int acpi_processor_ppc_notifier(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct cpufreq_policy *policy = data; - struct acpi_processor *pr; - unsigned int ppc = 0; - - if (ignore_ppc < 0) - ignore_ppc = 0; - - if (ignore_ppc) - return 0; - - if (event != CPUFREQ_ADJUST) - return 0; - - mutex_lock(_mutex); - - pr = per_cpu(processors, policy->cpu); - if (!pr || !pr->performance) - goto out; - - ppc = (unsigned int)pr->performance_platform_limit; - - if (ppc >= pr->performance->state_count) - goto out; - - cpufreq_verify_within_limits(policy, 0, -pr->performance->states[ppc]. -core_frequency * 1000); - - out: - mutex_unlock(_mutex); - - return 0; -} - -static struct notifier_block
Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
On 06-08-19, 10:01, Rafael J. Wysocki wrote: > Yes, it does, thanks! > > [No need to resend, I'll take it from this message.] Forgot to write CPU in caps in print messages, updated now. -- viresh -8<- >From 5761009323fde6bbbef90f9ecdd3bf7c191672cb Mon Sep 17 00:00:00 2001 Message-Id: <5761009323fde6bbbef90f9ecdd3bf7c191672cb.1565081202.git.viresh.ku...@linaro.org> From: Viresh Kumar Date: Mon, 15 Jul 2019 15:06:02 +0530 Subject: [PATCH] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier The cpufreq core now takes the min/max frequency constraints via QoS requests and the CPUFREQ_ADJUST notifier shall get removed later on. Switch over to using the QoS request for maximum frequency constraint for acpi driver. Signed-off-by: Viresh Kumar --- drivers/acpi/processor_driver.c | 37 ++-- drivers/acpi/processor_perflib.c | 96 +++- drivers/acpi/processor_thermal.c | 81 +-- include/acpi/processor.h | 21 --- 4 files changed, 118 insertions(+), 117 deletions(-) diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index aea8d674a33d..2c911fcaa4b4 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -284,6 +284,29 @@ static int acpi_processor_stop(struct device *dev) return 0; } +bool acpi_processor_cpufreq_init; + +static int acpi_processor_notifier(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct cpufreq_policy *policy = data; + int cpu = policy->cpu; + + if (event == CPUFREQ_CREATE_POLICY) { + acpi_thermal_cpufreq_init(cpu); + acpi_processor_ppc_init(cpu); + } else if (event == CPUFREQ_REMOVE_POLICY) { + acpi_processor_ppc_exit(cpu); + acpi_thermal_cpufreq_exit(cpu); + } + + return 0; +} + +static struct notifier_block acpi_processor_notifier_block = { + .notifier_call = acpi_processor_notifier, +}; + /* * We keep the driver loaded even when ACPI is not running. * This is needed for the powernow-k8 driver, that works even without @@ -310,8 +333,10 @@ static int __init acpi_processor_driver_init(void) cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", NULL, acpi_soft_cpu_dead); - acpi_thermal_cpufreq_init(); - acpi_processor_ppc_init(); + if (!cpufreq_register_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER)) + acpi_processor_cpufreq_init = true; + acpi_processor_throttling_init(); return 0; err: @@ -324,8 +349,12 @@ static void __exit acpi_processor_driver_exit(void) if (acpi_disabled) return; - acpi_processor_ppc_exit(); - acpi_thermal_cpufreq_exit(); + if (acpi_processor_cpufreq_init) { + cpufreq_unregister_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER); + acpi_processor_cpufreq_init = false; + } + cpuhp_remove_state_nocalls(hp_online); cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD); driver_unregister(_processor_driver); diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index ee87cb6f6e59..fc74b8075c36 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c @@ -50,57 +50,13 @@ module_param(ignore_ppc, int, 0644); MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ "limited by BIOS, this should help"); -#define PPC_REGISTERED 1 -#define PPC_IN_USE 2 - -static int acpi_processor_ppc_status; - -static int acpi_processor_ppc_notifier(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct cpufreq_policy *policy = data; - struct acpi_processor *pr; - unsigned int ppc = 0; - - if (ignore_ppc < 0) - ignore_ppc = 0; - - if (ignore_ppc) - return 0; - - if (event != CPUFREQ_ADJUST) - return 0; - - mutex_lock(_mutex); - - pr = per_cpu(processors, policy->cpu); - if (!pr || !pr->performance) - goto out; - - ppc = (unsigned int)pr->performance_platform_limit; - - if (ppc >= pr->performance->state_count) - goto out; - - cpufreq_verify_within_limits(policy, 0, -pr->performance->states[ppc]. -core_frequency * 1000); - - out: - mutex_unlock(_mutex); - - return 0; -} - -static struct notifier_block acpi_ppc_notifier_block = { - .notifier_call = acpi_processor_ppc_notifier, -}; +static bool acpi_processor_ppc_in_use; static int
Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
On Tue, Aug 6, 2019 at 6:39 AM Viresh Kumar wrote: > > On 05-08-19, 11:42, Rafael J. Wysocki wrote: > > On Tuesday, July 23, 2019 8:14:05 AM CEST Viresh Kumar wrote: > > > @@ -310,8 +339,11 @@ static int __init acpi_processor_driver_init(void) > > > cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", > > > NULL, acpi_soft_cpu_dead); > > > > > > - acpi_thermal_cpufreq_init(); > > > - acpi_processor_ppc_init(); > > > + if (!cpufreq_register_notifier(_processor_notifier_block, > > > + CPUFREQ_POLICY_NOTIFIER)) { > > > + acpi_processor_cpufreq_init = true; > > > > Can't that be set/cleared by acpi_processor_notifier() itself? > > This is required to be done only once at initialization and setting it > to true again and again on every invocation of the notifier callback > doesn't look right. > > I have updated the patch based on rest of your suggestions, please see > if it looks okay now. Yes, it does, thanks! [No need to resend, I'll take it from this message.]
Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
On 05-08-19, 11:42, Rafael J. Wysocki wrote: > On Tuesday, July 23, 2019 8:14:05 AM CEST Viresh Kumar wrote: > > @@ -310,8 +339,11 @@ static int __init acpi_processor_driver_init(void) > > cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", > > NULL, acpi_soft_cpu_dead); > > > > - acpi_thermal_cpufreq_init(); > > - acpi_processor_ppc_init(); > > + if (!cpufreq_register_notifier(_processor_notifier_block, > > + CPUFREQ_POLICY_NOTIFIER)) { > > + acpi_processor_cpufreq_init = true; > > Can't that be set/cleared by acpi_processor_notifier() itself? This is required to be done only once at initialization and setting it to true again and again on every invocation of the notifier callback doesn't look right. I have updated the patch based on rest of your suggestions, please see if it looks okay now. -- viresh -8<- >From 7998742113d93f22078d5f267a50c91bd87a3e24 Mon Sep 17 00:00:00 2001 Message-Id: <7998742113d93f22078d5f267a50c91bd87a3e24.1565066143.git.viresh.ku...@linaro.org> From: Viresh Kumar Date: Mon, 15 Jul 2019 15:06:02 +0530 Subject: [PATCH] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier The cpufreq core now takes the min/max frequency constraints via QoS requests and the CPUFREQ_ADJUST notifier shall get removed later on. Switch over to using the QoS request for maximum frequency constraint for acpi driver. Signed-off-by: Viresh Kumar --- drivers/acpi/processor_driver.c | 37 ++-- drivers/acpi/processor_perflib.c | 96 +++- drivers/acpi/processor_thermal.c | 81 +-- include/acpi/processor.h | 21 --- 4 files changed, 118 insertions(+), 117 deletions(-) diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index aea8d674a33d..2c911fcaa4b4 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -284,6 +284,29 @@ static int acpi_processor_stop(struct device *dev) return 0; } +bool acpi_processor_cpufreq_init; + +static int acpi_processor_notifier(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct cpufreq_policy *policy = data; + int cpu = policy->cpu; + + if (event == CPUFREQ_CREATE_POLICY) { + acpi_thermal_cpufreq_init(cpu); + acpi_processor_ppc_init(cpu); + } else if (event == CPUFREQ_REMOVE_POLICY) { + acpi_processor_ppc_exit(cpu); + acpi_thermal_cpufreq_exit(cpu); + } + + return 0; +} + +static struct notifier_block acpi_processor_notifier_block = { + .notifier_call = acpi_processor_notifier, +}; + /* * We keep the driver loaded even when ACPI is not running. * This is needed for the powernow-k8 driver, that works even without @@ -310,8 +333,10 @@ static int __init acpi_processor_driver_init(void) cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", NULL, acpi_soft_cpu_dead); - acpi_thermal_cpufreq_init(); - acpi_processor_ppc_init(); + if (!cpufreq_register_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER)) + acpi_processor_cpufreq_init = true; + acpi_processor_throttling_init(); return 0; err: @@ -324,8 +349,12 @@ static void __exit acpi_processor_driver_exit(void) if (acpi_disabled) return; - acpi_processor_ppc_exit(); - acpi_thermal_cpufreq_exit(); + if (acpi_processor_cpufreq_init) { + cpufreq_unregister_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER); + acpi_processor_cpufreq_init = false; + } + cpuhp_remove_state_nocalls(hp_online); cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD); driver_unregister(_processor_driver); diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index ee87cb6f6e59..f3801d7c0d36 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c @@ -50,57 +50,13 @@ module_param(ignore_ppc, int, 0644); MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ "limited by BIOS, this should help"); -#define PPC_REGISTERED 1 -#define PPC_IN_USE 2 - -static int acpi_processor_ppc_status; - -static int acpi_processor_ppc_notifier(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct cpufreq_policy *policy = data; - struct acpi_processor *pr; - unsigned int ppc = 0; - - if (ignore_ppc < 0) - ignore_ppc = 0; - - if (ignore_ppc) - return 0; - - if (event != CPUFREQ_ADJUST) -
Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
On Tuesday, July 23, 2019 8:14:05 AM CEST Viresh Kumar wrote: > The cpufreq core now takes the min/max frequency constraints via QoS > requests and the CPUFREQ_ADJUST notifier shall get removed later on. > > Switch over to using the QoS request for maximum frequency constraint > for acpi driver. > > Signed-off-by: Viresh Kumar > --- > drivers/acpi/processor_driver.c | 44 +++-- > drivers/acpi/processor_perflib.c | 106 +-- > drivers/acpi/processor_thermal.c | 81 --- > include/acpi/processor.h | 22 --- > 4 files changed, 137 insertions(+), 116 deletions(-) > > diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c > index aea8d674a33d..e7a3f07e9879 100644 > --- a/drivers/acpi/processor_driver.c > +++ b/drivers/acpi/processor_driver.c > @@ -284,6 +284,35 @@ static int acpi_processor_stop(struct device *dev) > return 0; > } > > +bool acpi_processor_cpufreq_init; > + > +static int acpi_processor_notifier(struct notifier_block *nb, > +unsigned long event, void *data) > +{ > + struct cpufreq_policy *policy = data; > + int cpu; > + > + if (event == CPUFREQ_CREATE_POLICY) { > + for_each_cpu(cpu, policy->cpus) > + per_cpu(processors, cpu)->policy = policy; > + > + acpi_thermal_cpufreq_init(policy); > + acpi_processor_ppc_init(policy); > + } else if (event == CPUFREQ_REMOVE_POLICY) { > + acpi_processor_ppc_exit(policy); > + acpi_thermal_cpufreq_exit(policy); > + > + for_each_cpu(cpu, policy->cpus) > + per_cpu(processors, cpu)->policy = NULL; > + } It doesn't look like it is necessary to pass policy to the functions here, just the CPU number. Also I don't think it is necessary to squirrel the policy pointer. > + > + return 0; > +} > + > +static struct notifier_block acpi_processor_notifier_block = { > + .notifier_call = acpi_processor_notifier, > +}; > + > /* > * We keep the driver loaded even when ACPI is not running. > * This is needed for the powernow-k8 driver, that works even without > @@ -310,8 +339,11 @@ static int __init acpi_processor_driver_init(void) > cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", > NULL, acpi_soft_cpu_dead); > > - acpi_thermal_cpufreq_init(); > - acpi_processor_ppc_init(); > + if (!cpufreq_register_notifier(_processor_notifier_block, > +CPUFREQ_POLICY_NOTIFIER)) { > + acpi_processor_cpufreq_init = true; Can't that be set/cleared by acpi_processor_notifier() itself? > + } Redundant braces. > + > acpi_processor_throttling_init(); > return 0; > err: > @@ -324,8 +356,12 @@ static void __exit acpi_processor_driver_exit(void) > if (acpi_disabled) > return; > > - acpi_processor_ppc_exit(); > - acpi_thermal_cpufreq_exit(); > + if (acpi_processor_cpufreq_init) { > + cpufreq_unregister_notifier(_processor_notifier_block, > + CPUFREQ_POLICY_NOTIFIER); > + acpi_processor_cpufreq_init = false; > + } > + > cpuhp_remove_state_nocalls(hp_online); > cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD); > driver_unregister(_processor_driver); > diff --git a/drivers/acpi/processor_perflib.c > b/drivers/acpi/processor_perflib.c > index ee87cb6f6e59..1a22b2415a8b 100644 > --- a/drivers/acpi/processor_perflib.c > +++ b/drivers/acpi/processor_perflib.c > @@ -50,57 +50,13 @@ module_param(ignore_ppc, int, 0644); > MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" > \ >"limited by BIOS, this should help"); > > -#define PPC_REGISTERED 1 > -#define PPC_IN_USE 2 > - > -static int acpi_processor_ppc_status; > - > -static int acpi_processor_ppc_notifier(struct notifier_block *nb, > -unsigned long event, void *data) > -{ > - struct cpufreq_policy *policy = data; > - struct acpi_processor *pr; > - unsigned int ppc = 0; > - > - if (ignore_ppc < 0) > - ignore_ppc = 0; > - > - if (ignore_ppc) > - return 0; > - > - if (event != CPUFREQ_ADJUST) > - return 0; > - > - mutex_lock(_mutex); > - > - pr = per_cpu(processors, policy->cpu); > - if (!pr || !pr->performance) > - goto out; > - > - ppc = (unsigned int)pr->performance_platform_limit; > - > - if (ppc >= pr->performance->state_count) > - goto out; > - > - cpufreq_verify_within_limits(policy, 0, > - pr->performance->states[ppc]. > - core_frequency * 1000); > - > - out: > - mutex_unlock(_mutex); > - > - return 0; > -} > - > -static struct notifier_block
[PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier
The cpufreq core now takes the min/max frequency constraints via QoS requests and the CPUFREQ_ADJUST notifier shall get removed later on. Switch over to using the QoS request for maximum frequency constraint for acpi driver. Signed-off-by: Viresh Kumar --- drivers/acpi/processor_driver.c | 44 +++-- drivers/acpi/processor_perflib.c | 106 +-- drivers/acpi/processor_thermal.c | 81 --- include/acpi/processor.h | 22 --- 4 files changed, 137 insertions(+), 116 deletions(-) diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index aea8d674a33d..e7a3f07e9879 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -284,6 +284,35 @@ static int acpi_processor_stop(struct device *dev) return 0; } +bool acpi_processor_cpufreq_init; + +static int acpi_processor_notifier(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct cpufreq_policy *policy = data; + int cpu; + + if (event == CPUFREQ_CREATE_POLICY) { + for_each_cpu(cpu, policy->cpus) + per_cpu(processors, cpu)->policy = policy; + + acpi_thermal_cpufreq_init(policy); + acpi_processor_ppc_init(policy); + } else if (event == CPUFREQ_REMOVE_POLICY) { + acpi_processor_ppc_exit(policy); + acpi_thermal_cpufreq_exit(policy); + + for_each_cpu(cpu, policy->cpus) + per_cpu(processors, cpu)->policy = NULL; + } + + return 0; +} + +static struct notifier_block acpi_processor_notifier_block = { + .notifier_call = acpi_processor_notifier, +}; + /* * We keep the driver loaded even when ACPI is not running. * This is needed for the powernow-k8 driver, that works even without @@ -310,8 +339,11 @@ static int __init acpi_processor_driver_init(void) cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead", NULL, acpi_soft_cpu_dead); - acpi_thermal_cpufreq_init(); - acpi_processor_ppc_init(); + if (!cpufreq_register_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER)) { + acpi_processor_cpufreq_init = true; + } + acpi_processor_throttling_init(); return 0; err: @@ -324,8 +356,12 @@ static void __exit acpi_processor_driver_exit(void) if (acpi_disabled) return; - acpi_processor_ppc_exit(); - acpi_thermal_cpufreq_exit(); + if (acpi_processor_cpufreq_init) { + cpufreq_unregister_notifier(_processor_notifier_block, + CPUFREQ_POLICY_NOTIFIER); + acpi_processor_cpufreq_init = false; + } + cpuhp_remove_state_nocalls(hp_online); cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD); driver_unregister(_processor_driver); diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index ee87cb6f6e59..1a22b2415a8b 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c @@ -50,57 +50,13 @@ module_param(ignore_ppc, int, 0644); MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ "limited by BIOS, this should help"); -#define PPC_REGISTERED 1 -#define PPC_IN_USE 2 - -static int acpi_processor_ppc_status; - -static int acpi_processor_ppc_notifier(struct notifier_block *nb, - unsigned long event, void *data) -{ - struct cpufreq_policy *policy = data; - struct acpi_processor *pr; - unsigned int ppc = 0; - - if (ignore_ppc < 0) - ignore_ppc = 0; - - if (ignore_ppc) - return 0; - - if (event != CPUFREQ_ADJUST) - return 0; - - mutex_lock(_mutex); - - pr = per_cpu(processors, policy->cpu); - if (!pr || !pr->performance) - goto out; - - ppc = (unsigned int)pr->performance_platform_limit; - - if (ppc >= pr->performance->state_count) - goto out; - - cpufreq_verify_within_limits(policy, 0, -pr->performance->states[ppc]. -core_frequency * 1000); - - out: - mutex_unlock(_mutex); - - return 0; -} - -static struct notifier_block acpi_ppc_notifier_block = { - .notifier_call = acpi_processor_ppc_notifier, -}; +static int acpi_processor_ppc_in_use; static int acpi_processor_get_platform_limit(struct acpi_processor *pr) { acpi_status status = 0; unsigned long long ppc = 0; - + int ret; if (!pr) return -EINVAL; @@ -112,7 +68,7 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr) status =