diff mbox series

[1/3] intel_idle: cleanup code for handling with cpuidle framework

Message ID 20211027082237.26759-1-rui.zhang@intel.com (mailing list archive)
State Changes Requested, archived
Headers show
Series [1/3] intel_idle: cleanup code for handling with cpuidle framework | expand

Commit Message

Zhang, Rui Oct. 27, 2021, 8:22 a.m. UTC
Introduce two helper functions and move all the code that deals with
the cpuidle framework into them.

No functional change in this patch.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/idle/intel_idle.c | 67 ++++++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 29 deletions(-)

Comments

Rafael J. Wysocki Nov. 24, 2021, 1:25 p.m. UTC | #1
On Wed, Oct 27, 2021 at 10:07 AM Zhang Rui <rui.zhang@intel.com> wrote:
>
> Introduce two helper functions and move all the code that deals with
> the cpuidle framework into them.

So what exactly is the benefit?

The role of intel_idle_cpuidle_devices_uninit() was to contain the
loop over CPUs and now it is combined with the driver unregistration
which looks confusing to me, because this function is only called in
one place in the error patch of intel_idle_init().

The existing code flow is easier to follow for me TBH and it is fewer
lines of code.

> No functional change in this patch.
>
> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> ---
>  drivers/idle/intel_idle.c | 67 ++++++++++++++++++++++-----------------
>  1 file changed, 38 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
> index e6c543b5ee1d..ae9d8c43e6a5 100644
> --- a/drivers/idle/intel_idle.c
> +++ b/drivers/idle/intel_idle.c
> @@ -1677,14 +1677,46 @@ static int intel_idle_cpu_online(unsigned int cpu)
>  }
>
>  /**
> - * intel_idle_cpuidle_devices_uninit - Unregister all cpuidle devices.
> + * intel_idle_cpuidle_unregister - unregister from cpuidle framework
>   */
> -static void __init intel_idle_cpuidle_devices_uninit(void)
> +static void __init intel_idle_cpuidle_unregister(struct cpuidle_driver *drv)
>  {
>         int i;
>
>         for_each_online_cpu(i)
>                 cpuidle_unregister_device(per_cpu_ptr(intel_idle_cpuidle_devices, i));
> +       cpuidle_unregister_driver(drv);
> +       free_percpu(intel_idle_cpuidle_devices);
> +}
> +
> +/**
> + * intel_idle_cpuidle_register - register to cpuidle framework
> + */
> +static int __init intel_idle_cpuidle_register(struct cpuidle_driver *drv)
> +{
> +       int retval;
> +
> +       intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
> +       if (!intel_idle_cpuidle_devices)
> +               return -ENOMEM;
> +
> +       retval = cpuidle_register_driver(drv);
> +       if (retval) {
> +               struct cpuidle_driver *drv = cpuidle_get_driver();
> +
> +               printk(KERN_DEBUG pr_fmt("intel_idle yielding to %s\n"),
> +                       drv ? drv->name : "none");
> +               free_percpu(intel_idle_cpuidle_devices);
> +               return retval;
> +       }
> +
> +       retval = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/intel:online",
> +                               intel_idle_cpu_online, NULL);
> +       if (retval < 0) {
> +               intel_idle_cpuidle_unregister(drv);
> +               return retval;
> +       }
> +       return 0;
>  }
>
>  static int __init intel_idle_init(void)
> @@ -1740,37 +1772,14 @@ static int __init intel_idle_init(void)
>         pr_debug("v" INTEL_IDLE_VERSION " model 0x%X\n",
>                  boot_cpu_data.x86_model);
>
> -       intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
> -       if (!intel_idle_cpuidle_devices)
> -               return -ENOMEM;
> -
>         intel_idle_cpuidle_driver_init(&intel_idle_driver);
>
> -       retval = cpuidle_register_driver(&intel_idle_driver);
> -       if (retval) {
> -               struct cpuidle_driver *drv = cpuidle_get_driver();
> -               printk(KERN_DEBUG pr_fmt("intel_idle yielding to %s\n"),
> -                      drv ? drv->name : "none");
> -               goto init_driver_fail;
> -       }
> -
> -       retval = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/intel:online",
> -                                  intel_idle_cpu_online, NULL);
> -       if (retval < 0)
> -               goto hp_setup_fail;
> -
> -       pr_debug("Local APIC timer is reliable in %s\n",
> -                boot_cpu_has(X86_FEATURE_ARAT) ? "all C-states" : "C1");
> +       retval = intel_idle_cpuidle_register(&intel_idle_driver);
> +       if (!retval)
> +               pr_debug("Local APIC timer is reliable in %s\n",
> +                       boot_cpu_has(X86_FEATURE_ARAT) ? "all C-states" : "C1");
>
> -       return 0;
> -
> -hp_setup_fail:
> -       intel_idle_cpuidle_devices_uninit();
> -       cpuidle_unregister_driver(&intel_idle_driver);
> -init_driver_fail:
> -       free_percpu(intel_idle_cpuidle_devices);
>         return retval;
> -
>  }
>  device_initcall(intel_idle_init);
>
> --
> 2.17.1
>
diff mbox series

Patch

diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index e6c543b5ee1d..ae9d8c43e6a5 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -1677,14 +1677,46 @@  static int intel_idle_cpu_online(unsigned int cpu)
 }
 
 /**
- * intel_idle_cpuidle_devices_uninit - Unregister all cpuidle devices.
+ * intel_idle_cpuidle_unregister - unregister from cpuidle framework
  */
-static void __init intel_idle_cpuidle_devices_uninit(void)
+static void __init intel_idle_cpuidle_unregister(struct cpuidle_driver *drv)
 {
 	int i;
 
 	for_each_online_cpu(i)
 		cpuidle_unregister_device(per_cpu_ptr(intel_idle_cpuidle_devices, i));
+	cpuidle_unregister_driver(drv);
+	free_percpu(intel_idle_cpuidle_devices);
+}
+
+/**
+ * intel_idle_cpuidle_register - register to cpuidle framework
+ */
+static int __init intel_idle_cpuidle_register(struct cpuidle_driver *drv)
+{
+	int retval;
+
+	intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
+	if (!intel_idle_cpuidle_devices)
+		return -ENOMEM;
+
+	retval = cpuidle_register_driver(drv);
+	if (retval) {
+		struct cpuidle_driver *drv = cpuidle_get_driver();
+
+		printk(KERN_DEBUG pr_fmt("intel_idle yielding to %s\n"),
+			drv ? drv->name : "none");
+		free_percpu(intel_idle_cpuidle_devices);
+		return retval;
+	}
+
+	retval = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/intel:online",
+				intel_idle_cpu_online, NULL);
+	if (retval < 0) {
+		intel_idle_cpuidle_unregister(drv);
+		return retval;
+	}
+	return 0;
 }
 
 static int __init intel_idle_init(void)
@@ -1740,37 +1772,14 @@  static int __init intel_idle_init(void)
 	pr_debug("v" INTEL_IDLE_VERSION " model 0x%X\n",
 		 boot_cpu_data.x86_model);
 
-	intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
-	if (!intel_idle_cpuidle_devices)
-		return -ENOMEM;
-
 	intel_idle_cpuidle_driver_init(&intel_idle_driver);
 
-	retval = cpuidle_register_driver(&intel_idle_driver);
-	if (retval) {
-		struct cpuidle_driver *drv = cpuidle_get_driver();
-		printk(KERN_DEBUG pr_fmt("intel_idle yielding to %s\n"),
-		       drv ? drv->name : "none");
-		goto init_driver_fail;
-	}
-
-	retval = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/intel:online",
-				   intel_idle_cpu_online, NULL);
-	if (retval < 0)
-		goto hp_setup_fail;
-
-	pr_debug("Local APIC timer is reliable in %s\n",
-		 boot_cpu_has(X86_FEATURE_ARAT) ? "all C-states" : "C1");
+	retval = intel_idle_cpuidle_register(&intel_idle_driver);
+	if (!retval)
+		pr_debug("Local APIC timer is reliable in %s\n",
+			boot_cpu_has(X86_FEATURE_ARAT) ? "all C-states" : "C1");
 
-	return 0;
-
-hp_setup_fail:
-	intel_idle_cpuidle_devices_uninit();
-	cpuidle_unregister_driver(&intel_idle_driver);
-init_driver_fail:
-	free_percpu(intel_idle_cpuidle_devices);
 	return retval;
-
 }
 device_initcall(intel_idle_init);