Re: [PATCH V2 05/10] ACPI: cpufreq: Switch to QoS requests instead of cpufreq notifier

2019-08-10 Thread Rafael J. Wysocki
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

2019-08-08 Thread Viresh Kumar
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

2019-08-06 Thread Viresh Kumar
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

2019-08-06 Thread Rafael J. Wysocki
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

2019-08-05 Thread Viresh Kumar
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

2019-08-05 Thread Rafael J. Wysocki
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

2019-07-23 Thread Viresh Kumar
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 =