lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 6 May 2020 15:27:05 +0530
From:   Amit Kucheria <amit.kucheria@...durent.com>
To:     Daniel Lezcano <daniel.lezcano@...aro.org>
Cc:     Zhang Rui <rui.zhang@...el.com>, Lukasz Luba <lukasz.luba@....com>,
        Viresh Kumar <viresh.kumar@...aro.org>,
        Amit Daniel Kachhap <amit.kachhap@...il.com>,
        Javi Merino <javi.merino@...nel.org>,
        "open list:THERMAL/CPU_COOLING" <linux-pm@...r.kernel.org>,
        open list <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH v4 3/4] thermal/drivers/cpuidle_cooling: Change the
 registration function

On Wed, Apr 29, 2020 at 4:07 PM Daniel Lezcano
<daniel.lezcano@...aro.org> wrote:
>
> Today, there is no user for the cpuidle cooling device. The targetted
> platform is ARM and ARM64.
>
> The cpuidle and the cpufreq cooling device are based on the device tree.
>
> As the cpuidle cooling device can have its own configuration depending
> on the platform and the available idle states. The DT node description
> will give the optional properties to set the cooling device up.
>
> Do no longer rely on the CPU node which is prone to error and will
> lead to a confusion in the DT because the cpufreq cooling device is
> also using it. Let initialize the cpuidle cooling device with the DT
> binding.
>
> This was tested on:
>  - hikey960
>  - hikey6220
>  - rock960
>  - db845c
>
> Acked-by: Viresh Kumar <viresh.kumar@...aro.org>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@...aro.org>

Reviewed-by: Amit Kucheria <amit.kucheria@...aro.org>
Tested-by: Amit Kucheria <amit.kucheria@...aro.org>


> ---
>  - V4:
>    - Changed message from pr_info to pr_debug
>    - Fixed of properties to comply with the binding
>    - Add a debug message int case the thermal-idle node is not found
>    - Do not return an error as the caller won't care
> ---
>  drivers/thermal/cpuidle_cooling.c | 63 +++++++++++++++++++++++++------
>  include/linux/cpu_cooling.h       | 12 +-----
>  2 files changed, 53 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/thermal/cpuidle_cooling.c b/drivers/thermal/cpuidle_cooling.c
> index 0bb843246f59..78e3e8238116 100644
> --- a/drivers/thermal/cpuidle_cooling.c
> +++ b/drivers/thermal/cpuidle_cooling.c
> @@ -5,11 +5,14 @@
>   *  Author: Daniel Lezcano <daniel.lezcano@...aro.org>
>   *
>   */
> +#define pr_fmt(fmt) "cpuidle cooling: " fmt
> +
>  #include <linux/cpu_cooling.h>
>  #include <linux/cpuidle.h>
>  #include <linux/err.h>
>  #include <linux/idle_inject.h>
>  #include <linux/idr.h>
> +#include <linux/of_device.h>
>  #include <linux/slab.h>
>  #include <linux/thermal.h>
>
> @@ -154,22 +157,25 @@ static struct thermal_cooling_device_ops cpuidle_cooling_ops = {
>  };
>
>  /**
> - * cpuidle_of_cooling_register - Idle cooling device initialization function
> + * __cpuidle_cooling_register: register the cooling device
>   * @drv: a cpuidle driver structure pointer
> - * @np: a node pointer to a device tree cooling device node
> + * @np: a device node structure pointer used for the thermal binding
>   *
> - * This function is in charge of creating a cooling device per cpuidle
> - * driver and register it to thermal framework.
> + * This function is in charge of allocating the cpuidle cooling device
> + * structure, the idle injection, initialize them and register the
> + * cooling device to the thermal framework.
>   *
> - * Return: zero on success, or negative value corresponding to the
> - * error detected in the underlying subsystems.
> + * Return: zero on success, a negative value returned by one of the
> + * underlying subsystem in case of error
>   */
> -int cpuidle_of_cooling_register(struct device_node *np,
> -                               struct cpuidle_driver *drv)
> +static int __cpuidle_cooling_register(struct device_node *np,
> +                                     struct cpuidle_driver *drv)
>  {
>         struct idle_inject_device *ii_dev;
>         struct cpuidle_cooling_device *idle_cdev;
>         struct thermal_cooling_device *cdev;
> +       unsigned int idle_duration_us = TICK_USEC;
> +       unsigned int latency_us = UINT_MAX;
>         char dev_name[THERMAL_NAME_LENGTH];
>         int id, ret;
>
> @@ -191,7 +197,11 @@ int cpuidle_of_cooling_register(struct device_node *np,
>                 goto out_id;
>         }
>
> -       idle_inject_set_duration(ii_dev, TICK_USEC, TICK_USEC);
> +       of_property_read_u32(np, "duration-us", &idle_duration_us);
> +       of_property_read_u32(np, "exit-latency-us", &latency_us);
> +
> +       idle_inject_set_duration(ii_dev, TICK_USEC, idle_duration_us);
> +       idle_inject_set_latency(ii_dev, latency_us);
>
>         idle_cdev->ii_dev = ii_dev;
>
> @@ -204,6 +214,9 @@ int cpuidle_of_cooling_register(struct device_node *np,
>                 goto out_unregister;
>         }
>
> +       pr_debug("%s: Idle injection set with idle duration=%u, latency=%u\n",
> +                dev_name, idle_duration_us, latency_us);
> +
>         return 0;
>
>  out_unregister:
> @@ -221,12 +234,38 @@ int cpuidle_of_cooling_register(struct device_node *np,
>   * @drv: a cpuidle driver structure pointer
>   *
>   * This function is in charge of creating a cooling device per cpuidle
> - * driver and register it to thermal framework.
> + * driver and register it to the thermal framework.
>   *
>   * Return: zero on success, or negative value corresponding to the
>   * error detected in the underlying subsystems.
>   */
> -int cpuidle_cooling_register(struct cpuidle_driver *drv)
> +void cpuidle_cooling_register(struct cpuidle_driver *drv)
>  {
> -       return cpuidle_of_cooling_register(NULL, drv);
> +       struct device_node *cooling_node;
> +       struct device_node *cpu_node;
> +       int cpu, ret;
> +
> +       for_each_cpu(cpu, drv->cpumask) {
> +
> +               cpu_node = of_cpu_device_node_get(cpu);
> +
> +               cooling_node = of_get_child_by_name(cpu_node, "thermal-idle");
> +
> +               of_node_put(cpu_node);
> +
> +               if (!cooling_node) {
> +                       pr_debug("'thermal-idle' node not found for cpu%d\n", cpu);
> +                       continue;
> +               }
> +
> +               ret = __cpuidle_cooling_register(cooling_node, drv);
> +
> +               of_node_put(cooling_node);
> +
> +               if (ret) {
> +                       pr_err("Failed to register the cpuidle cooling device" \
> +                              "for cpu%d: %d\n", cpu, ret);
> +                       break;
> +               }
> +       }
>  }
> diff --git a/include/linux/cpu_cooling.h b/include/linux/cpu_cooling.h
> index 65501d8f9778..a3bdc8a98f2c 100644
> --- a/include/linux/cpu_cooling.h
> +++ b/include/linux/cpu_cooling.h
> @@ -63,18 +63,10 @@ of_cpufreq_cooling_register(struct cpufreq_policy *policy)
>  struct cpuidle_driver;
>
>  #ifdef CONFIG_CPU_IDLE_THERMAL
> -int cpuidle_cooling_register(struct cpuidle_driver *drv);
> -int cpuidle_of_cooling_register(struct device_node *np,
> -                               struct cpuidle_driver *drv);
> +void cpuidle_cooling_register(struct cpuidle_driver *drv);
>  #else /* CONFIG_CPU_IDLE_THERMAL */
> -static inline int cpuidle_cooling_register(struct cpuidle_driver *drv)
> +static inline void cpuidle_cooling_register(struct cpuidle_driver *drv)
>  {
> -       return 0;
> -}
> -static inline int cpuidle_of_cooling_register(struct device_node *np,
> -                                             struct cpuidle_driver *drv)
> -{
> -       return 0;
>  }
>  #endif /* CONFIG_CPU_IDLE_THERMAL */
>
> --
> 2.17.1
>

Powered by blists - more mailing lists